嗨,所以我在大多数情况下都按照我想要的方式进行了设置。我要实现的最后一部分是使它具有这样的功能,以便在输入X
或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][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."
}
}
}
}
答案 0 :(得分:1)
(1)当玩家选择Row / Col时,有必要检查数组在该选择中是否具有'*'字符(即尚未使用)。 (2)添加一个int变量“选择”,并在任何有效选择上将其递增1。当选择达到9时,电路板已满。这样,您根本不需要noRepeat()
。
noRepeat()
函数仅打印但返回空值。那么问if (noRepeat())
的目的是什么?
函数switchPlayer()
不执行任何操作。例如,如果您传递“当前玩家”,则下面的这个返回另一个:。用途:(1)添加char currentPalayer = Player1;
变量,(2)添加currentPalayer = switchPlayer(currentPalayer);
想要切换播放器。当currentPalayer
和Player1
可以是Player2
的{{1}}时,请使用const char
变量
#define
我想还有更多问题。
顺便说一句:将winner()函数减少到1/2:
char switchPlayer(char currentPlayer) {
const int K = Player1 + Player2;
return (char) (K - currentPlayer);
}
答案 1 :(得分:0)
您的函数noRepeat()
返回void
。但是必须返回boolean
类型。
答案 2 :(得分:0)
我们都可以建议您改进代码,也许应该在https://codereview.stackexchange.com/处进行处理。除了进行重大的编码外,我们来看一下对其中一个功能进行细微的调整:
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
循环,因为您要一直询问直到收到有效输入。另一件事是我重构了你的二传手。当一个1缸衬纸if
可以完成相同的工作时,为什么会有所有这些board[row]col] = Player;
的变化?
总的来说,我不喜欢此功能,因为这里错过了对'*'
进行验证的机会。如果不重写该函数的大部分内容,我将无法证明这一点。
我在代码中遇到的其他问题是:
int currentPlayer
的。您可能已经实现了char playerMarker[2] = { 'X', 'O' };
的查找,因此在进行移动时会使用正确的符号。currentPlayer = 1 - currentPlayer;
char board[ROW][COL + 2];
并添加一个LF和NUL终止符,然后打印该板子只需打印3个字符串:puts(board[0]); puts(board[1]); puts(board[2]);
noRepeat
的实现没有任何意义。