使用 sfml 更新 TicTacToe 游戏中的图块

问题描述 投票:0回答:0

因此,我正在使用 C++ 中的 sfml 创建游戏,但我的代码没有更新我正确单击的图块。

我使用函数 isTileClicked 来检查图块是否被单击,并将变量 clickedTileRow 和 clickedTileCol 更新为当前单击的图块的行和列。我希望它只更新索引与变量 clickedTileRow 和 clickedTileCol 一致的图块。这里的问题是,当我单击新图块时,它也会更新所有以前单击的图块。

game.h 文件是:

#include <iostream>
#include <SFML/Graphics.hpp>
#ifndef GAME_H
#define GAME_H
static int changer = 0;
class Player; 
class Game  //class to playGame
    {
        private:
        sf :: RenderWindow window;
        sf :: Texture Tex, emptyTile; 
        sf :: Sprite **sprites;
        sf :: Event clickSprite;
        int clickedTileRow, clickedTileCol;
        Player *p;

        public:
        Game(); 
        ~Game();
        sf:: Window& getWindow();
        void setSpriteMemory();
        sf :: Sprite** getSpritesArr();
        void setTexture();
        sf::Texture getTexture();
        void setBoard();
        void setPlayerMemory();
        void set_player(Player *player);
        Player* getPlayer();
        bool isTileClicked(int xCoord, int yCoord);
        void playGame();
    };
#endif// GAME_H

game.cpp 文件是:

#include "game.h"
#include "player.h"

Game :: Game() : window(sf:: VideoMode(600,800), "TicTacToe")
    {
         //ask for size of board
        sprites = nullptr;
        p = nullptr;
        clickedTileRow = -1;
        clickedTileCol = -1;
    }
Game :: ~Game()
    {
        for(int i = 0; i < 3; i++)
            {
                delete sprites[i];
            }
        delete [] sprites;
    }
sf:: Window& Game :: getWindow() 
        {
            return window;
        }
void Game :: setSpriteMemory()
        {
            sprites = new sf :: Sprite*[3];
            for(int i = 0; i <3; i++)
                {
                    sprites[i] = new sf :: Sprite[3];
                }
        }
sf :: Sprite** Game :: getSpritesArr()
            {
               return this->sprites;
            }
void  Game :: setTexture()
        {
            Tex.loadFromFile("images/board.png");
            emptyTile.loadFromFile("images/board.png");
        }
sf::Texture Game :: getTexture()
        {
            return this->Tex;
        }

void Game :: setBoard()
        {
            for (int i = 0; i < 3; i++)
                {
                    for(int j = 0; j < 3; j++)
                        {
                                sprites[i][j].setTexture(getTexture()) ;
                                sprites[i][j].setScale(0.25f,0.25f);
                                sprites[i][j].setPosition(sf::Vector2f(i * 130, j * 130));
                        }
                }
        }
    void Game :: setPlayerMemory()
        {
            p = new Player;
        }
bool Game :: isTileClicked(int xCoord, int yCoord)
    {   for(int i = 0; i < 3; i++)
            {
                for(int j = 0; j < 3; j++)
                    {
                        sf :: FloatRect tileBounds = sprites[i][j].getGlobalBounds();
                        if(tileBounds.contains(xCoord, yCoord))
                            {  
                                clickedTileRow = i;
                                clickedTileCol = j;
                                
                                return true;
                               
                            }                     
                    }               
            }
        clickedTileRow = -1;
        clickedTileCol = -1;   
        return false;
    }
void Game :: playGame()
        {
            while (window.isOpen())
            {
                sf::Event event;
                while (window.pollEvent(event))
                {
                    // Event handling - Check for window close event
                    if (event.type == sf :: Event :: Closed) //KeyPressed && event.key.code == sf::Keyboard::Enter
                        window.close();
                    //Check for box clicked
                    else if(event.type == sf :: Event :: MouseButtonPressed)
                        {
                            int xCoord = event.mouseButton.x;
                            int yCoord = event.mouseButton.y;
                          
                            if( isTileClicked( xCoord, yCoord ) )
                            {
                                sprites[clickedTileRow][clickedTileCol].setTexture(this->p->get_currentplayer());
                                clickedTileRow = -1;
                                clickedTileCol = -1;
                                p->change_player( changer  );
                                changer++;
                                
                            }
                        }
                    
                }

                // Update game state here (currently no updates in this example)

                // Rendering - Clear the window, draw sprites, and display
                window.clear(sf::Color::Black);
                for (int i = 0; i < 3; i++)
                {   
                    for (int j = 0; j < 3; j++)
                    {   
                        window.draw(sprites[i][j]);
                    }
                }
                window.display();
            }
        }
c++ sfml
© www.soinside.com 2019 - 2024. All rights reserved.