Problem z losowymi współrzędnymi punktów

0

Witam!
Niedawno wziąłem się wreszcie za bibliotekę SFML i w ramach utrwalenia zdobytej wiedzy w praktyce, zacząłem pisać grę mojego pomysłu, którą kiedyś zrobiłem jeszcze w konsoli.

Ogólne założenia gry są takie:

  • gracz zdobywa punkty, których położenie jest losowe
  • z każdym zdobytym punktem w losowym miejscu pojawia się blok
  • gdy gracz "zderzy się" z blokiem, oznacza to koniec gry

Właśnie jestem teraz na etapie ogarniania jak ma się zachowywać punkt no i mam problem z jego losowym położeniem.

Mianowicie w również losowym momencie współrzędne punktu zostają źle wylosowane i nie zgadzają się ze współrzędnymi żadnego kwadrata (które tworzą planszę), przez co punkt nie zostaje w ogóle wyświetlony.

A oto kod:

#include <SFML/Graphics.hpp>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <time.h>

int res_width = 32*20;
int res_height = 32*20;

int n = 0;

int player1_posX = 320;
int player1_posY = 320;

int score = 0;

std::string score_str;
std::ostringstream ss;

char player1_direction = ' ';
int player1_moveX = 0;
int player1_moveY = 0;
float player1_speed = 150;

int point_posX = 160;
int point_posY = 160;

int point_pos_randN = 0;

int main()
{
    srand(time(NULL));

    sf::RenderWindow window(sf::VideoMode(res_width, res_height), "Blocker");

    sf::Image icon;
    icon.loadFromFile("icon.png");

    window.setIcon(icon.getSize().x, icon.getSize().y, icon.getPixelsPtr());

    point_posX = rand()%19+0;
    for(int i = 0; i < 19; i++)
    {
        if(point_posX == i)
            point_posX = point_pos_randN;
        point_pos_randN += 32;
    }

    point_pos_randN = 0;

    point_posY = rand()%18+0;
    for(int i = 0; i < 18; i++)
    {
        if(point_posY == i)
            point_posY = point_pos_randN;
        point_pos_randN += 32;
    }

    point_pos_randN = 0;

    sf::Clock player1_move_deltaClock;
    sf::Time player1_move_timer;

    sf::Font font;
    font.loadFromFile("Fonts/Renner_ 400 Book.ttf");

    sf::Text score_txt;
    score_txt.setCharacterSize(26);
    score_txt.setFont(font);
    score_txt.setFillColor(sf::Color::White);
    score_txt.setPosition(0, 0);

    ss << score;
    score_str = ss.str();
    score_txt.setString("Score: "+score_str);
    ss.str(" ");

    sf::Color player1_color;
    player1_color.r = 50;
    player1_color.g = 188;
    player1_color.b = 45;

    sf::Color point_color;
    point_color.r = 255;
    point_color.g = 255;
    point_color.b = 96;

    sf::Color board_color;
    board_color.r = 60;
    board_color.g = 60;
    board_color.b = 60;

    sf::Color bg_color;
    bg_color.r = 40;
    bg_color.g = 40;
    bg_color.b = 40;

    sf::RectangleShape board[450];
    for(int i = 0; i <= 20; i++)
        for(int j = 0; j <= 20; j++)
        {
            board[n].setSize(sf::Vector2f(30, 30));
            board[n].setFillColor(board_color);
            board[n].setOutlineThickness(1);
            board[n].setOutlineColor(sf::Color::White);
            board[n].setPosition(i*32, j*32);

            if(board[n].getPosition().y == 0)
                board[n].setPosition(10000, 10000);
            n++;
        }

    while(window.isOpen())
    {
        sf::Event event;

        while(window.pollEvent(event))
        {
            if(event.type == sf::Event::Closed)
                window.close();
            if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape)
                window.close();
            if(event.type == sf::Event::Resized)
                window.setSize(sf::Vector2u(res_width, res_height));

            if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::W)
            {
                player1_direction = 'u';

                player1_moveY = -32;
                player1_moveX = 0;
            }
            if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::S)
            {
                player1_direction = 'd';

                player1_moveY = 32;
                player1_moveX = 0;
            }
            if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::D)
            {
                player1_direction = 'r';

                player1_moveX = 32;
                player1_moveY = 0;
            }
            if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::A)
            {
                player1_direction = 'l';

                player1_moveX = -32;
                player1_moveY = 0;
            }
        }

        player1_move_timer += player1_move_deltaClock.restart();
        if(player1_move_timer >= sf::milliseconds(player1_speed))
        {
            player1_move_timer -= sf::milliseconds(player1_speed);

            player1_posX += player1_moveX;
            if(player1_posX > res_width-32)
                player1_posX = 0;
            else if(player1_posX < 0)
                player1_posX = res_width-32;

            player1_posY += player1_moveY;
            if(player1_posY < 32)
                player1_posY = res_height-32;
            else if(player1_posY > res_height-32)
                player1_posY = 32;
        }

        for(int i = 0; i < n; i++)
        {
            if(board[i].getPosition().x == player1_posX && board[i].getPosition().y == player1_posY)
            {
                board[i].setFillColor(player1_color);
            }
            else if(board[i].getPosition().x == point_posX && board[i].getPosition().y == point_posY)
            {
                board[i].setFillColor(point_color);
            }
            else if(player1_posX == point_posX && player1_posY == point_posY)
            {
                point_posX = rand()%19+0;
                for(int j = 0; j < 19; j++)
                {
                    if(point_posX == j)
                        point_posX = point_pos_randN;
                    point_pos_randN += 32;
                }

                point_pos_randN = 0;

                point_posY = rand()%18+0;
                for(int k = 0; k < 18; k++)
                {
                    if(point_posY == k)
                        point_posY = point_pos_randN;
                    point_pos_randN += 32;
                }

                point_pos_randN = 0;

                score++;
                ss << score;
                score_str = ss.str();
                score_txt.setString("Score: "+score_str);
                ss.str(" ");
            }
            else
            {
                board[i].setFillColor(board_color);
            }
        }

        window.clear(bg_color);

        for(int i = 0; i < n; i++)
            window.draw(board[i]);

        window.draw(score_txt);

        window.display();
    }

    return 0;
}
0

Problemem jest to, że możesz wylosować po prostu punkt o wartości Y-kowej równej zero.

				point_posY = rand() % 18 + 0;
				/*/for (int k = 0; k < 18; k++)
				{
					if (point_posY == k)
						point_posY = point_pos_randN;
					point_pos_randN += 32;
				}/*/

Rozwiązanie na szybko, zamiast tej pętli, która w zasadzie nie jest potrzebna.

				point_posY == 0 ? point_posY = 32: point_posY *= 32;

Ogólnie, zamiast dwóch pętli możesz to załatwić jednym losowaniem i IFem

				point_posX = rand() % 19 + 0;
				point_posX *= 32;
				point_posY = rand() % 18 + 0;
				point_posY == 0 ? point_posY = 32: point_posY *= 32;

Zauważ, że o ile jak narysujesz kwadrat o współrzędnej (0,32), to będzie on narysowany w lewym górnym rogu planszy, jak narysujesz (0,0), powinien być on dosłownie w lewym górnym rogu okna, gdzie aktualnie wyświetlasz wynik, także musisz te 32pix dodać do wsp.Y, nie może być ona równa 0.

0

Super, nareszcie działa! Wielkie dzięki! :D

1 użytkowników online, w tym zalogowanych: 0, gości: 1