TIC TAC ToIP C++覆盖板
嗨,我已经按照我大部分时间想要的方式设置好了。我尝试实现的最后一个部分是使其在输入Xor 0时不会覆盖自身。如果有人能看看它,告诉我我的noRepeat函数到底做错了什么,我会非常感激。谢谢TIC TAC ToIP C++覆盖板,c++,arrays,if-statement,C++,Arrays,If Statement,嗨,我已经按照我大部分时间想要的方式设置好了。我尝试实现的最后一个部分是使其在输入Xor 0时不会覆盖自身。如果有人能看看它,告诉我我的noRepeat函数到底做错了什么,我会非常感激。谢谢 #include <iostream> using namespace std; const int ROWS = 3; const int COLS = 3; char Player1 = 'X'; char Player2 = 'O'; int row, col; char board[3
#include <iostream>
using namespace std;
const int ROWS = 3;
const int COLS = 3;
char Player1 = 'X';
char Player2 = 'O';
int row, col;
char board[3][3]= { '*', '*', '*', '*', '*', '*', '*', '*', '*'}; //Game board
//Prototypes
void noRepeat();
void drawBoard();
void selection(int&, int&);
char winner();
void switchPlayer();
int main()
{
cout << "Tic Tac Toe!" << endl << endl;
drawBoard();
cout << endl << endl;
while (1)
{
if ( noRepeat() )
{
selection(row, col);
drawBoard();
switchPlayer();
}
if (winner() == 'X')
{
cout << "Player 1 wins!" << endl;
break;
}
else if (winner() == 'O')
{
cout << "Player 2 wins!" << endl;
break;
}
}
return 0;
}
// input function
void selection(int &row, int &col)
{
cout << "Enter a number for row between 0 - 2" << endl;
cin >> row;
if (row < 0 || row > 2) {
cout << "Invalid selection select a row between 0 - 2" << endl;
cin >> row;
}
cout << "Enter a number for col between 0 - 2" << endl;
cin >> col;
if (col < 0 || col > 2) {
cout << "Invalid selection select a row between 0 - 2" << endl;
cin >> col;
}
if (row == 0 && col == 0)
board[0][0] = Player1;
else if (row == 0 && col == 1)
board[0][1] = Player1;
else if (row == 0 && col == 2)
board[0][2] = Player1;
else if (row == 1 && col == 0)
board[1][0] = Player1;
else if (row == 1 && col == 1)
board[1][1] = Player1;
else if (row == 1 && col == 2)
board[1][2] = Player1;
else if (row == 2 && col == 0)
board[2][0] = Player1;
else if (row == 2 && col == 1)
board[2][1] = Player1;
else if (row == 2 && col == 2)
board[2][2] = Player1;
}
//Board function
void drawBoard() {
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
cout << board[i][j];
}
cout << endl;
}
}
//Function to switch between X's and O's
void switchPlayer() {
char temp = Player1;
if (Player1) {
Player1 = Player2;
}
if (Player2)
{
Player2 = temp;
}
}
//conditional winner checker
char winner() {
if (board[0][0] == 'X' && board[0][1] == 'X' && board[0][2] == 'X')
return 'X';
if (board[1][0] == 'X' && board[1][1] == 'X' && board[1][2] == 'X')
return 'X';
if (board[2][0] == 'X' && board[2][1] == 'X' && board[2][2] == 'X')
return 'X';
if (board[0][0] == 'X' && board[1][0] == 'X' && board[2][0] == 'X')
return 'X';
if (board[0][1] == 'X' && board[1][1] == 'X' && board[2][1] == 'X')
return 'X';
if (board[0][2] == 'X' && board[1][2] == 'X' && board[2][2] == 'X')
return 'X';
if (board[0][0] == 'X' && board[1][1] == 'X' && board[2][2] == 'X')
return 'X';
if (board[2][0] == 'X' && board[1][1] == 'X' && board[0][2] == 'X')
return 'X';
//Player 2
if (board[0][0] == 'O' && board[0][1] == 'O' && board[0][2] == 'O')
return 'O';
if (board[1][0] == 'O' && board[1][1] == 'O' && board[1][2] == 'O')
return 'O';
if (board[2][0] == 'O' && board[2][1] == 'O' && board[2][2] == 'O')
return 'O';
if (board[0][0] == 'O' && board[1][0] == 'O' && board[2][0] == 'O')
return 'O';
if (board[0][1] == 'O' && board[1][1] == 'O' && board[2][1] == 'O')
return 'O';
if (board[0][2] == 'O' && board[1][2] == 'O' && board[2][2] == 'O')
return 'O';
if (board[0][0] == 'O' && board[1][1] == 'O' && board[2][2] == 'O')
return 'O';
if (board[2][0] == 'O' && board[1][1] == 'O' && board[0][2] == 'O')
return 'O';
}
//Function to prevent overwriting.
void noRepeat() {
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (board[i][j] == Player1 || board[i][j] == Player2) {
cout << "Invalid selection, please choose a row and column
again."
}
}
}
}
函数noRepeat返回void。但必须返回布尔类型。1当玩家选择行/列时,需要检查数组在该选择中是否有“*”字符,即尚未使用。2添加一个int变量“selections”,并在任何有效的选择上将其递增1。当选择点击9时,电路板已满。就像那样,你根本不需要吃东西 noRepeat函数只打印,但返回void。那么,问诺雷佩特的目的是什么 函数switchPlayer不执行任何操作。例如,下面这一个,如果您传递当前玩家,则返回另一个:…Use:1 Add char currentplayer=Player1;变量,2 currentPalayer=switchPlayercurrentPalayer;当你想换播放器的时候。当Player1和Player2可以是define的const char时,使用currentplayer变量 我想还有更多的问题 顺便说一句:将winner功能削减到1/2:
//conditional winner checker
char winner() {
if (board[0][0] == board[0][1] && board[0][1] == board[0][2])
return board[0][0];
if (board[1][0] == board[1][1] && board[1][1] == board[1][2])
return board[1][0];
if (board[2][0] == board[2][1] && board[2][1] ==board[2][2]))
return board[2][0];
if (board[0][0] == board[1][0] && board[1][0] == board[2][0])
return board[0][0] ;
if (board[0][1] == board[1][1] && board[1][1] == board[2][1])
return board[0][1];
if (board[0][2] == board[1][2] && board[1][2] == board[2][2])
return board[0][2];
if (board[0][0] == board[1][1] && board[1][1] == board[2][2])
return board[0][0];
if (board[2][0] == board[1][1] && board[1][1] == board[0][2])
return board[2][0];
}
我们都可以建议对您的代码进行改进,也许应该在下一步进行处理。除了进行主要的重新编码之外,让我们来看看对其中一个函数进行的小调整:
void selection(int &row, int &col)
{
cout << "Enter a number for row between 0 - 2" << endl;
cin >> row;
while (row < 0 || row > 2) {
cout << "Invalid selection select a row between 0 - 2" << endl;
cin >> row;
}
cout << "Enter a number for col between 0 - 2" << endl;
cin >> col;
while (col < 0 || col > 2) {
cout << "Invalid selection select a row between 0 - 2" << endl;
cin >> col;
}
board[row][col] = Player1;
}
我对您的函数所做的是将验证逻辑从if更改为while循环,因为您希望在收到有效输入之前一直询问。另一件事是我重构了你的setter。当一个单排板[行]列]=玩家时,为什么会有所有这些if变化;你能做同样的工作吗
总的来说,我不喜欢这个函数,因为这里错过了对“*”进行验证的机会。如果不重写该函数的更大部分,我无法证明这一点
我对代码的其他问题是:
“X”和“O”的处理。我会选择值为0或1的int currentPlayer。您可以实现一个charplayermarker[2]={'X','O'};查找,以便在移动时使用正确的符号。
切换播放器逻辑错误。你只需要一个变量,你有两个变量,它可以解决复杂的问题。如果您只有一个变量,那么可以将其实现为1行:例如currentPlayer=1-currentPlayer;
板本身,我会选择char board[ROW][COL+2];并添加了LF和NUL终止符,然后打印电路板将只打印3个字符串:putsboard[0];踏板[1];踏板[2];
获胜条件已被另一用户重构
僵局是无法避免的。大多数的TIC-TAC-TOE玩家很快就达到了这个目标
noRepeat的实现毫无意义。
如果noRepeat-但是noRepeat是空的-那它甚至可以编译吗?另外,通过输入“X”或“O”作为参数,并使用相同的逻辑将获胜者一分为二。这里有一个提示:当你得到这样的结果时,最好打印数组中的内容,以便准确地看到发生了什么。添加日志行以查看代码所采用的路径,从而了解正在发生的情况。然后,您将获得一项技能,帮助您修复许多bug。如果您使用的是像VisualStudio或Netbeans这样的IDE,那么请学习如何单步执行代码并在变量上添加监视。我提到的这些东西都是我们称之为调试的一部分。这是编程的正常部分。祝你好运。我还建议下载并安装Visual Studio 2017社区。这是一个全功能版本,免费。
void selection(int &row, int &col)
{
cout << "Enter a number for row between 0 - 2" << endl;
cin >> row;
while (row < 0 || row > 2) {
cout << "Invalid selection select a row between 0 - 2" << endl;
cin >> row;
}
cout << "Enter a number for col between 0 - 2" << endl;
cin >> col;
while (col < 0 || col > 2) {
cout << "Invalid selection select a row between 0 - 2" << endl;
cin >> col;
}
board[row][col] = Player1;
}