Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[SFML 2.1] Szalejący licznik

Ostatnio zmodyfikowano 2013-09-21 11:11
Autor Wiadomość
Cielak
Temat założony przez niniejszego użytkownika
[SFML 2.1] Szalejący licznik
» 2013-09-21 10:42:32
Witam !

Od wczoraj piszę prostą grę w kółko i krzyżyk, wszystko szło dość gładko i sprawnie, lecz nie jestem w stanie poradzić sobie z dość trywialną rzeczą. Mianowicie w przypadku wykrycia przez komputer wygranej,licznik zamiast po prostu dodać jeden punkt, nabija punkty w zastraszającym tempie i nie chce się zatrzymać. Oto kod:

C/C++
#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Text.hpp>
#include <iostream>

using namespace std;

class Game
{
private:
    bool kolko;
    bool krzyzyk;
   
    int gracz1;
    int gracz2;
   
    sf::RenderWindow okno;
   
    sf::Image ikolo;
    sf::Image iszach;
    sf::Image ikrzyz;
   
    sf::Texture tszach;
    sf::Texture tkolo;
    sf::Texture tkrzyz;
   
    sf::Sprite krzyz[ 10 ];
    sf::Sprite kolo[ 10 ];
    sf::Sprite szach;
   
    sf::Font font;
    sf::Text xtxt;
    sf::Text ytxt;
    sf::Text win;
    sf::Text wyn1;
    sf::Text wyn2;
   
    sf::Vector2i position;
   
    void process();
    void update();
    void render();
    void clear();
   
    string xmouse;
    string ymouse;
   
    bool leftpressed;
    bool mousemove;
    bool kratka[ 9 ];
    int krata[ 9 ];
   
    int rzad[ 8 ];
    bool player;
    bool wygrana1;
    bool wygrana2;
   
public:
    Game();
    void run();
};

Game::Game()
    : okno( sf::VideoMode( 800, 600, 32 ), "Kolko i krzyzyk" )
    , kolko( false )
    , krzyzyk( false )
    , leftpressed( false )
    , mousemove( false )
    , player( false )
    , wygrana1( false )
    , wygrana2( false )
    , gracz1( 0 )
    , gracz2( 0 )
{
    for( int i = 0; i < 9; i++ )
         kratka[ i ] = false;
   
    for( int i = 0; i < 9; i++ )
         krata[ i ] = 0;
   
    iszach.loadFromFile( "sprites/szach.png" );
    ikolo.loadFromFile( "sprites/kolo.png" );
    ikrzyz.loadFromFile( "sprites/krzyz.png" );
    font.loadFromFile( "sprites/poseiAOE.ttf" );
    ikolo.createMaskFromColor( sf::Color( 255, 255, 255 ), 0 );
    ikrzyz.createMaskFromColor( sf::Color( 255, 255, 255 ), 0 );
    iszach.createMaskFromColor( sf::Color( 255, 255, 255 ), 0 );
    tszach.loadFromImage( iszach );
    tkolo.loadFromImage( ikolo );
    tkrzyz.loadFromImage( ikrzyz );
    kolo[ 9 ].setTexture( tkolo );
    kolo[ 9 ].setPosition( 0, 70 );
    krzyz[ 9 ].setTexture( tkrzyz );
    krzyz[ 9 ].setPosition( 700, 70 );
    for( int i = 0; i < 3; i++ )
    {
        for( int j = 0; j < 3; j++ )
        {
            kolo[( 3 * i + j ) ].setTexture( tkolo );
            kolo[( 3 * i + j ) ].setPosition( 170 +( i * 170 ), 70 + j * 160 );
        }
    }
    for( int i = 0; i < 3; i++ )
    {
        for( int j = 0; j < 3; j++ )
        {
            krzyz[( 3 * i + j ) ].setTexture( tkrzyz );
            krzyz[( 3 * i + j ) ].setPosition( 170 +( i * 170 ), 70 + j * 160 );
        }
    }
    szach.setTexture( tszach );
    szach.setPosition( 150, 50 );
    xtxt.setFont( font );
    xtxt.setCharacterSize( 50 );
    ytxt.setFont( font );
    ytxt.setPosition( 700, 0 );
    ytxt.setCharacterSize( 50 );
    wyn1.setFont( font );
    wyn1.setPosition( 20, 50 );
    wyn1.setCharacterSize( 400 );
    wyn2.setFont( font );
    wyn2.setPosition( 700, 50 );
    wyn2.setCharacterSize( 400 );
    win.setFont( font );
    win.setCharacterSize( 160 );
    win.setString( "Wygrana!" );
    win.setPosition( 200, 300 );
}

void Game::clear()
{
    for( int i = 0; i < 8; i++ )
         rzad[ i ] = 0;
   
}

void Game::process()
{
    sf::Event zdarzenie;
    while( okno.pollEvent( zdarzenie ) )
    {
        if( zdarzenie.type == sf::Event::Closed )
             okno.close();
       
        if( zdarzenie.type == sf::Event::MouseButtonPressed && sf::Mouse::isButtonPressed( sf::Mouse::Left ) && !wygrana1 && !wygrana2 )
        {
            player =!player;
            leftpressed = true;
            if( position.x < 300 && position.x > 150 && position.y > 50 && position.y < 210 )
            {
                if( player )
                     krata[ 0 ] --;
                else
                     krata[ 0 ] ++;
               
            }
            if( position.x < 300 && position.x > 150 && position.y > 220 && position.y < 370 )
            {
                if( player )
                     krata[ 1 ] --;
                else
                     krata[ 1 ] ++;
               
            }
            if( position.x < 300 && position.x > 150 && position.y > 375 && position.y < 540 )
            {
                if( player )
                     krata[ 2 ] --;
                else
                     krata[ 2 ] ++;
               
            }
            if( position.x > 310 && position.x < 480 && position.y > 50 && position.y < 210 )
            {
                if( player )
                     krata[ 3 ] --;
                else
                     krata[ 3 ] ++;
               
            }
            if( position.x > 310 && position.x < 480 && position.y > 220 && position.y < 370 )
            {
                if( player )
                     krata[ 4 ] --;
                else
                     krata[ 4 ] ++;
               
            }
            if( position.x > 310 && position.x < 480 && position.y > 375 && position.y < 540 )
            {
                if( player )
                     krata[ 5 ] --;
                else
                     krata[ 5 ] ++;
               
            }
            if( position.x > 490 && position.x < 640 && position.y > 50 && position.y < 210 )
            {
                if( player )
                     krata[ 6 ] --;
                else
                     krata[ 6 ] ++;
               
            }
            if( position.x > 490 && position.x < 640 && position.y > 220 && position.y < 370 )
            {
                if( player )
                     krata[ 7 ] --;
                else
                     krata[ 7 ] ++;
               
            }
            if( position.x > 490 && position.x < 640 && position.y > 375 && position.y < 540 )
            {
                if( player )
                     krata[ 8 ] --;
                else
                     krata[ 8 ] ++;
               
            }
        }
        if( zdarzenie.type == sf::Event::MouseButtonReleased )
             leftpressed = false;
       
        if( zdarzenie.type == sf::Event::MouseMoved )
             mousemove = true;
       
        if( zdarzenie.type != sf::Event::MouseMoved )
             mousemove = false;
       
    }
}

void Game::update()
{
    if( mousemove )
    {
        position = sf::Mouse::getPosition( okno );
        xmouse = std::to_string( position.x );
        ymouse = std::to_string( position.y );
        xtxt.setString( "Gracz 1" );
        ytxt.setString( "Gracz 2" );
    }
    rzad[ 0 ] = krata[ 0 ] + krata[ 1 ] + krata[ 2 ];
    rzad[ 1 ] = krata[ 0 ] + krata[ 3 ] + krata[ 6 ];
    rzad[ 2 ] = krata[ 0 ] + krata[ 4 ] + krata[ 8 ];
    rzad[ 3 ] = krata[ 2 ] + krata[ 5 ] + krata[ 8 ];
    rzad[ 4 ] = krata[ 1 ] + krata[ 4 ] + krata[ 7 ];
    rzad[ 5 ] = krata[ 6 ] + krata[ 7 ] + krata[ 8 ];
    rzad[ 6 ] = krata[ 0 ] + krata[ 3 ] + krata[ 6 ];
    rzad[ 7 ] = krata[ 2 ] + krata[ 4 ] + krata[ 6 ];
    for( int i = 0; i < 8; i++ )
    {
        if( rzad[ i ] == 3 )
        {
            wygrana2 = true;
        }
    }
    wyn1.setString( std::to_string( gracz1 ) );
    wyn2.setString( std::to_string( gracz2 ) );
}

void Game::render()
{
    okno.clear();
    for( int i = 0; i < 9; i++ )
    {
        if( krata[ i ] != 0 )
        {
            if( krata[ i ] ==- 1 )
                 okno.draw( kolo[ i ] );
           
            if( krata[ i ] == 1 )
                 okno.draw( krzyz[ i ] );
           
        }
    }
    okno.draw( kolo[ 9 ] );
    okno.draw( krzyz[ 9 ] );
    okno.draw( xtxt );
    okno.draw( ytxt );
    okno.draw( szach );
    okno.draw( wyn1 );
    okno.draw( wyn2 );
    if( wygrana1 || wygrana2 )
    {
        okno.draw( win );
        wygrana2 = false;
        gracz2++;
    }
    okno.display();
}

void Game::run()
{
    while( okno.isOpen() )
    {
        process();
        update();
        render();
    }
}

int main()
{
    Game game;
    game.run();
    return 0;
}
P-92410
akwes
» 2013-09-21 11:04:57
C/C++
if( wygrana1 || wygrana2 )
{
    okno.draw( win );
    wygrana2 = false;
    gracz2++;
}

To się wykonuje cały czas, jak myślisz czemu?
P-92411
Cielak
Temat założony przez niniejszego użytkownika
» 2013-09-21 11:11:34
Wydaję mi się, że to dzięki wcześniejszej pętli for, gdzie sprawdzam czy jakikolwiek rząd wynosi 3 lub -3, tam cały czas mi zmienia wartość na true. Zgadza sie ?

@edit Udało mi się zrozumieć w czym tkwi błąd, wszystko śmiga, dzięki :D
P-92412
« 1 »
  Strona 1 z 1