Classe Velha. Crie uma classe Velha que lhe permitirá escrever um programa completo para jogar o jogo da velha. A classe contém como dados private um array bidimensional de 3 por 3 com inteiros. O construtor deverá inicializar o tabuleiro vazio com zeros. Permita que duas pessoas joguem. Sempre que o primeiro jogador fizer sua jogada, coloque um 1 no quadrado especificado. Coloque um 2 para a jogada do segundo jogador. Cada movimento deverá estar em um quadrado vazio. Depois de cada movimento, determine se o jogo foi ganho ou se está empatado. Se você for ambicioso, modifique seu programa de modo que o computador jogue no lugar de um dos jogadores. Além disso, permita que o jogador especifique se ele ou ela deseja ser o primeiro ou o segundo. Se você for excepcionalmente ambicioso, desenvolva um programa para um jogo da velha tridimensional em um tabuleiro de 4 por 4 por 4. [Cuidado: este é um projeto extremamente desafiador, que poderá exigir muitas semanas de esforço!]

Passo 1

Fala Galera!!! Tudo certo? Espero que sim!! Bora para mais um exercício.

Vamos criar um programa com uma classe chamada TicTacToe que terá funções membros repoisáveis por imitar o famoso jogo da velha. Nosso programa irá permitir que dois jogadores consigam participar, um tabuleiro de tamanho 3x3 será mostrado na tela para indicar a posição que cada jogador escolheu para jogar.

Passo 2

Vamos iniciar incluindo os arquivos de cabeçalho e definir a classe com as funções membros:

//cabeçalhos

#include

#include

using std::setw;

using namespace std;

class TicTacToe {

private:

//variaveis status

enum Status { WIN, DRAW, CONTINUE };

int board[ 3 ][ 3 ];

public:

//construtor

TicTacToe();

//funçõesmembri

void makeMove( void );

void printBoard( void );

bool validMove( int, int );

bool xoMove( int );

Status gameStatus( void );

};

Passo 3

Após definir a classe, vamos criar as funções responsáveis pelo funcionamento do jogo e também para exibir o resultado na tela e o tabuleiro

// definindo construtuor

TicTacToe::TicTacToe()

{

for ( int j = 0; j

for ( int k = 0; k

board[ j ][ k ] = ' ';

}

bool TicTacToe::validMove( int r, int c )

{

return r >= 0 && r = 0 && c

}

// deve especificar que o tipo Status faz parte da classe TicTacToe.

TicTacToe::Status TicTacToe::gameStatus( void )

{

int a;

// verifica se há uma vitória nas diagonais

if ( board[ 0 ][ 0 ] != ' ' && board[ 0 ][ 0 ] == board[ 1 ][ 1 ] &&

board[ 0 ][ 0 ] == board[ 2 ][ 2 ] )

return WIN;

else if ( board[ 2 ][ 0 ] != ' ' && board[ 2 ][ 0 ] ==

board[ 1 ][ 1 ] && board[ 2 ][ 0 ] == board[ 0 ][ 2 ] )

return WIN;

// verifica a vitória nas linhas

for ( a = 0; a

if ( board[ a ][ 0 ] != ' ' && board[ a ][ 0 ] ==

board[ a ][ 1 ] && board[ a ][ 0 ] == board[ a ][ 2 ] )

return WIN;

// verifica a vitória nas colunas

for ( a = 0; a

if ( board[ 0 ][ a ] != ' ' && board[ 0 ][ a ] ==

board[ 1 ][ a ] && board[ 0 ][ a ] == board[ 2 ][ a ] )

return WIN;

// verifica se há um jogo completo

for ( int r = 0; r

for ( int c = 0; c

if ( board[ r ][ c ] == ' ' )

return CONTINUE;

// o jogo não terminou

return DRAW;

// o jogo está empatado

}

//exibe a desenho

void TicTacToe::printBoard( void )

{

cout

for ( int r = 0; r

cout

for ( int c = 0; c

cout ( board[ r ][ c ] );

if ( c != 2 )

cout

}

if ( r != 2 )

cout

}

cout

}

//define os movimentos

void TicTacToe::makeMove( void )

{

printBoard();

while ( true ) {

if ( xoMove( 'X' ) )

break;

else if ( xoMove( 'O' ) )

break;

}

}

bool TicTacToe::xoMove( int symbol )

{

int x, y;

do {

cout ( symbol )

cin >> x >> y;

cout

} while ( !validMove( x, y ) );

board[ x ][ y ] = symbol;

printBoard();

Status xoStatus = gameStatus();

if ( xoStatus == WIN ) {

cout ( symbol )

return true;

}

else if ( xoStatus == DRAW ) {

cout

return true;

}

else // CONTINUE

return false;

}

Passo 4

Para finalizar só precisamos definir o objeto da classe e chamar a função responsável por iniciar o jogo dentro da função principal main().

int main()

{

TicTacToe g;

g.makeMove();

return 0;

}

Desta forma o jogo já estará funcionando. E assim finalizamos o exercício galera!!! Até o próximo.

Resposta

Código:

//cabeçalhos

#include

#include

using std::setw;

using namespace std;

class TicTacToe {

private:

//variaveis status

enum Status { WIN, DRAW, CONTINUE };

int board[ 3 ][ 3 ];

public:

//construtor

TicTacToe();

//funçõesmembri

void makeMove( void );

void printBoard( void );

bool validMove( int, int );

bool xoMove( int );

Status gameStatus( void );

};

// definindo construtuor

TicTacToe::TicTacToe()

{

for ( int j = 0; j

for ( int k = 0; k

board[ j ][ k ] = ' ';

}

bool TicTacToe::validMove( int r, int c )

{

return r >= 0 && r = 0 && c

}

// deve especificar que o tipo Status faz parte da classe TicTacToe.

TicTacToe::Status TicTacToe::gameStatus( void )

{

int a;

// verifica se há uma vitória nas diagonais

if ( board[ 0 ][ 0 ] != ' ' && board[ 0 ][ 0 ] == board[ 1 ][ 1 ] &&

board[ 0 ][ 0 ] == board[ 2 ][ 2 ] )

return WIN;

else if ( board[ 2 ][ 0 ] != ' ' && board[ 2 ][ 0 ] ==

board[ 1 ][ 1 ] && board[ 2 ][ 0 ] == board[ 0 ][ 2 ] )

return WIN;

// verifica a vitória nas linhas

for ( a = 0; a

if ( board[ a ][ 0 ] != ' ' && board[ a ][ 0 ] ==

board[ a ][ 1 ] && board[ a ][ 0 ] == board[ a ][ 2 ] )

return WIN;

// verifica a vitória nas colunas

for ( a = 0; a

if ( board[ 0 ][ a ] != ' ' && board[ 0 ][ a ] ==

board[ 1 ][ a ] && board[ 0 ][ a ] == board[ 2 ][ a ] )

return WIN;

// verifica se há um jogo completo

for ( int r = 0; r

for ( int c = 0; c

if ( board[ r ][ c ] == ' ' )

return CONTINUE;

// o jogo não terminou

return DRAW;

// o jogo está empatado

}

//exibe a desenho

void TicTacToe::printBoard( void )

{

cout

for ( int r = 0; r

cout

for ( int c = 0; c

cout ( board[ r ][ c ] );

if ( c != 2 )

cout

}

if ( r != 2 )

cout

}

cout

}

//define os movimentos

void TicTacToe::makeMove( void )

{

printBoard();

while ( true ) {

if ( xoMove( 'X' ) )

break;

else if ( xoMove( 'O' ) )

break;

}

}

bool TicTacToe::xoMove( int symbol )

{

int x, y;

do {

cout ( symbol )

cin >> x >> y;

cout

} while ( !validMove( x, y ) );

board[ x ][ y ] = symbol;

printBoard();

Status xoStatus = gameStatus();

if ( xoStatus == WIN ) {

cout ( symbol )

return true;

}

else if ( xoStatus == DRAW ) {

cout

return true;

}

else // CONTINUE

return false;

}

int main()

{

TicTacToe g;

g.makeMove();

return 0;

}