C++ Tic-Tac-Toe mit Klassen
Das Spiel zeigt die matrix, aber nicht update-die aktuelle Bewegung.
Wie kann ich das tun?
Hier zeige ich den code habe ich bis jetzt.
Ich definiere eine matrix für den Vorstand.
Die Funktionen zeichnen das board, erhalten den Auszug aus dem player und schaltet den Kurven.
#ifndef TICTACTOE_H
#define TICTACTOE_H
class TicTacToe
{
private:
char board[3][3];
public:
void DrawBoard();
void PrintBoard();
void GetMove(int move);
void TogglePlayer(char player);
bool DetermineDraw();
};
#endif
Hier ist die Umsetzung-Datei:
Meine Funktion zum zeichnen der platine zeigt die matrix, aber nicht update bewegt.
#include <iostream>
#include "TicTacToe.h"
using namespace std;
void TicTacToe::DrawBoard()
{
system("cls");
cout <<"\tWelcome to the Classes Tic Tac Toe! \n";
char board[3][3] =
{
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
};
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
cout << board[i][j] << " ";
}
cout << endl;
}
}
void TicTacToe::GetMove(int move)
{
char player = 'X';
cout <<"\nEnter the number of the field you would like to move:\n";
cin >> move;
if( move == 1)
{
board[0][0] = player;
}
else if(move == 2)
{
board[0][1] = player;
}
else if(move == 3)
{
board[0][2] = player;
}
else if(move == 4)
{
board[1][0] = player;
}
else if(move == 5)
{
board[1][1] = player;
}
else if(move == 6)
{
board[1][2] = player;
}
else if(move == 7)
{
board[2][0] = player;
}
else if(move == 8)
{
board[2][1] = player;
}
else if(move == 9)
{
board[2][2] = player;
}
}
void TicTacToe::TogglePlayer(char player)
{
if (player == 'X')
player = 'O';
else if(player == 'O')
player = 'X';
}
bool TicTacToe::DetermineDraw()
{
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
{
if(board[i][j] == 'X' && board[i][j] == 'O')
return true;
else
return false;
}
}
}
Hier ist die Haupt-Datei, ich werde halten looping durch das Spiel, während es ist nicht eine Attraktion.
Ich weiß nicht, warum das bewegen ist nicht auf der platine dargestellt.
#include <iostream>
#include "TicTacToe.h"
using namespace std;
int main()
{
TicTacToe game;
char player = 'X';
while(game.DetermineDraw() == false)
{
game.DrawBoard();
game.GetMove(player);
game.TogglePlayer(player);
}
system("pause");
}
- Wenn Sie den debugger, welche Zeile das Problem verursacht?
board[move/3][move%3] = player
: entfernen Sie Ihreif
Aussagen.- Ihre
TogglePlayer
Funktion ändert den kopieren derplayer
parameter, dann beendet. Die originalplayer
variable wird nicht geändert. Meinst du zum Verweis übergeben? Oder waren Sie Planung auf eineplayer
variable in IhremTicTacToe
Klasse. - Übergeben Sie das player-symbol, um Ihre
GetMove
Funktion, aber die Funktion erwartet wird ein Brett Platz Nr. - Ihre
GetMove
Methode immer Orte, die der SpielerX
und nieO
. - Yep, ein debugger würde dir ungemein weiterhelfen, finden diese Themen. Mit Papier und Bleistift, zeichnen Sie eine Tabelle für die Variablen und die Ausführung jeder Anweisung würde auch helfen.
- Ihre
DetermineDraw
Methode macht nie mehr als eine iteration, da beide Klauseln dieif
- Anweisung zurück. Ein weiteres Problem, das mit einem debugger finden kann. - Danke für Sie Antwort, aber ich weiß nicht, wie Sie das update-board.
- In Ihrem
DetermineDraw
Methode, wie kann der Ausdruck(board[i][j] == 'X') && (board[i][j] == 'O')
überhaupt wahr sein? Der Schlitz in der platine kann nie gleich beide Werte. Vielleicht haben Sie gedacht, um die Verwendung||
? Mit einem debugger helfen würde, Sie fangen diese ein. Sind Sie immer der Hinweis noch? Wenn Sie nicht wissen, wie Sie den debugger verwenden, lernen. - Ja, ich weiß, wie Sie den debugger, und ja, ich hätte ||
Du musst angemeldet sein, um einen Kommentar abzugeben.
TicTacToe::DrawBoard()
ziehen Sie immer das gleiche board, da nutzt es lokal definierten Variablenboard
. Um zu korrigieren: entfernen Sie die lokale definition und Initialisierung von Klassenvariablenboard
im Konstruktor: