We already have a fully working game. But… we can’t play it yet!! We have to decide how the game should work with the player… Well, I’ve already decided it for you :D When the player clicks a column, it will try to add a token. If the column has no more empty spaces, the player should retry in another column. When a player has won, or the board is full. A click on the screen will restart the game. You can play again ;)
To do these, we’ll have a class that will interact with the players.
We include board.h because we’re using the board within the userInterface class:
////////////////////////////////////////////////////////////
// uInterface.h
////////////////////////////////////////////////////////////
#ifndef UI
#define UI
#include "board.h"
We define then our userInterface class
class UInterface
{
public:
// Constructor
UInterface(Board &boardRef;);
// Destructor
~UInterface();
// Called when the mouse has clicked inside the screen
void placeInColumn(const sf::Input &input;);
private:
// the column where the mouse clicks the screen
unsigned int column;
// A reference to the board, created in the main loop
Board &board;
// The total number of tokens the players have placed
int nbTurns;
// The color of the next token to be placed
Token nextPlayer;
// Whether the game has finished, a token has been placed
// or it couldn't be placed in a column
Move gameStatus;
};
#endif
Then we code the implementation. These is pretty straight forward, once you’ve decided what you want to do. In our case We already know how we want the game to react to the player :
We initialize the constructor :
////////////////////////////////////////////////////////////
// uInterface.cpp
////////////////////////////////////////////////////////////
#include "uInterface.h"
UInterface::UInterface (Board &boardRef;): board(boardRef)
{
// No movements have been made
nbTurns = 0;
// The game starts with the yellow player
nextPlayer = Yellow;
}
UInterface::~UInterface(){}
Then, we code the method we’ll call when the user has clicked somewhere on screen. We pass the coordinates of the mouse position with the input object. We can get the “X” position with the method input.GetMouseX()
void UInterface::placeInColumn(const sf::Input &input;)
{
// Get the column where the user has clicked
// This is just an approximation, as the columns have a little offset
// This will work only if the user clicks inside the circle
column = float(input.GetMouseX())/board.getWindowWidth()*BOARD_X_SIZE+1;
//If it is game over, create a new one
if(gameStatus == EndOfGame)
{
board.restart();
nbTurns = 0;
gameStatus = Full;
}
else
{
// Try to place the token in the desired column
gameStatus = board.addTokenInColumn(column, nextPlayer);
// If the column wasn't already full, continue playing
if(gameStatus != Full)
{
nbTurns++;
// Change the nextplayer
if(nextPlayer == Yellow)
nextPlayer = Red;
else
nextPlayer = Yellow;
// if the board is full: game over!!
if(nbTurns == BOARD_X_SIZE*BOARD_Y_SIZE)
gameStatus = EndOfGame;
}
}
}
We know have an almost complete game, but wait, we can’t play it yet!! Why?? Because in the main code, we haven’t created the board, nor the user interface…What are you waiting?… Read on the next post to be able to play it!!:P