【发布时间】:2020-07-12 17:08:49
【问题描述】:
尝试完成一个简单的井字游戏的作业,而不使用我们课堂上未涵盖的函数或任何东西。目前,代码中的所有内容都是可以接受的,但是在选择一个正方形并使用不是数字的字符时,我不断遇到无限循环问题。任何帮助将不胜感激!
#include <iostream>
using namespace std;
int i;
char board[10];
bool gameover;
bool check_choice;
char player;
int choice = 0;
char restart;
int main()
{
do
{
for (int i = 0; i < 10; i++) board[i] = ' ';
bool gameover = false;
bool check_choice = true;
char player = 'X';
do
{
// Draw game board
cout << "+---+---+---+ \n";
cout << "| " << board[1] << " | " << board[2] << " | " << board[3] << " | \n";
cout << "+---+---+---+ \n";
cout << "| " << board[4] << " | " << board[5] << " | " << board[6] << " | \n";
cout << "+---+---+---+ \n";
cout << "| " << board[7] << " | " << board[8] << " | " << board[9] << " | \n";
cout << "+---+---+---+ \n";
// Win Check
if ((board[1] == 'X' && board[2] == 'X' && board[3] == 'X') ||
(board[4] == 'X' && board[5] == 'X' && board[6] == 'X') ||
(board[7] == 'X' && board[8] == 'X' && board[9] == 'X') ||
(board[1] == 'X' && board[4] == 'X' && board[7] == 'X') ||
(board[2] == 'X' && board[5] == 'X' && board[8] == 'X') ||
(board[3] == 'X' && board[6] == 'X' && board[9] == 'X') ||
(board[1] == 'X' && board[5] == 'X' && board[9] == 'X') ||
(board[3] == 'X' && board[5] == 'X' && board[7] == 'X'))
{
cout << "Game Over - X wins! \n";
gameover = true;
}
else if ((board[1] == 'O' && board[2] == 'O' && board[3] == 'O') ||
(board[4] == 'O' && board[5] == 'O' && board[6] == 'O') ||
(board[7] == 'O' && board[8] == 'O' && board[9] == 'O') ||
(board[1] == 'O' && board[4] == 'O' && board[7] == 'O') ||
(board[2] == 'O' && board[5] == 'O' && board[8] == 'O') ||
(board[3] == 'O' && board[6] == 'O' && board[9] == 'O') ||
(board[1] == 'O' && board[5] == 'O' && board[9] == 'O') ||
(board[3] == 'O' && board[5] == 'O' && board[7] == 'O'))
{
cout << "Game Over - O wins! \n \n";
gameover = true;
}
// Draw Check
else if ((board[1] != ' ' && board[2] != ' ' && board[3] != ' ') &&
(board[4] != ' ' && board[5] != ' ' && board[6] != ' ') &&
(board[7] != ' ' && board[8] != ' ' && board[9] != ' '))
{
cout << "Game Over - Draw \n \n";
gameover = true;
}
else
check_choice = true;
while (check_choice == true)
{
cout << "Place " << player << " at: ";
cin >> choice;
if (choice > sizeof(board) || choice == 0 || choice == 10)
{
cout << "Invalid input! 1-9 only. \n";
check_choice = true;
}
else if (board[choice] == ' ')
{
board[choice] = (player == 'X') ? 'X' : 'O';
player = (player == 'X') ? 'O' : 'X';
check_choice = false;
}
else
{
cout << "Invalid input! Position already filled. \n";
check_choice = true;
}
}
} while (gameover == false);
cout << "Would you like to play again? (Y / N): ";
cin >> restart;
cin.ignore();
} while (restart == 'y' || restart == 'Y');
cout << "Thanks for playing!! \n \n";
system("pause");
return 0;
}
【问题讨论】:
-
你的错误在哪里?
-
数组从
0开始索引,而不是1。您尝试通过1访问board可能会导致错误。 -
但我在选择一个正方形并使用非数字字符时不断遇到无限循环问题。 -- 将您的数据读入字符串,并检查是否字符串具有有效信息。此外,您应该删除无关的全局变量,如果将其放入函数中而不是将所有内容都粘贴在
main中,那将是一个更好的主意。 -
如果你预计输入错误,你应该把输入变成一个字符串,检查字符串是否有有效的
int数据,如果没问题就继续。还有一些建议——您可以将其缩减为“如何测试字符串是否为有效整数”或类似的东西,而不是发布整个井字游戏。显然会有 StackOverflow 的帖子介绍如何测试字符串是否为整数,您可以轻松搜索此类问题。 -
有帮助的how to convert int to char, char to int after get an input 以及使用
.ignore()清除无效字符,请参阅How to catch invalid user inputs
标签: c++ loops while-loop nested-loops