【发布时间】:2019-01-12 05:32:17
【问题描述】:
这是我正在尝试制作的井字游戏的 while 循环,
while (result == 0)
{
game.player_move();
result = game.check_draw();
game.computer_move();
}
if (result == 1)
cout << "Tie.";
这些是game.check_draw()的条件。
int TicTacToe::check_draw()
{
if (move_count == 9)
return 1;
else
return 0;
}
此外,此代码确实按照我希望的方式工作。 X 设置为 88,0 设置为 79。用户和计算机移动函数都将 move_count 值加一,如下所示:
void TicTacToe::player_move()
{
int position;
draw_table();
cout << endl << "Pick position[1-9]: ";
cin >> position;
while (pos[position - 1] == 79 || pos[position - 1] == 88)
{
system("CLS");
draw_table();
cout << endl << "Position taken.";
Sleep(500);
system("CLS");
draw_table();
cout << endl << "Pick position[1-9]: ";
cin >> position;
system("CLS");
}
position[pos - 1] = 88;
move_count++; // <-------------
system("CLS");
}
和
void TicTacToe::computer_move()
{
int position;
srand((unsigned int)time(0));
position = (rand() % 9) + 1;
while (pos[position - 1] == 79 || pos[position - 1] == 88)
position = (rand() % 9) + 1;
position[pos - 1] = 79;
move_count++; // <-------------
}
由于玩家先走,在第 9 回合后,move_count 设置为 9。然后程序继续执行下一条语句。
if (result == 1)
cout << "Tie.";
此代码完美运行,但仅如果删除了来自game.computer_move() 的以下代码,
while (pos[position - 1] == 79 || pos[position - 1] == 88)
position = (rand() % 9) + 1;
删除此代码后,while 循环结束并继续执行下一个 if 语句。但是,当我添加此代码时,它会结束 while 循环,但不会继续执行 if 语句并显示闪烁的光标。这段代码所做的就是检查一个数组,看看 X a.k.a (88) 或 O a.k.a (79) 是否已经放置在要放置 0 的位置。
我非常困惑,因为这根本不会影响move_count,而且在第 9 个玩家移动之后,move_count 设置为 9,这意味着循环应该正确终止,甚至不会移动到 @987654334 @?
我的理解是,一旦while条件不满足,while循环中的其余代码就被忽略,循环应该结束。
我做了一个
cout << game.move_count;
在循环中,就在game.check_draw() 之前,检查它的值是否为9,并且确实如此。
另外,附注。我的代码可读吗?有什么明显的问题吗?
如果需要,我可以发布整个代码,并提前感谢您的任何回复。
【问题讨论】:
-
我的“优化”方法:
int TicTacToe::check_draw() { return move_count == 9; }的行为与您的原始版本完全相同。 -
为了让你的代码更具可读性(我想知道
79和88但没有深入挖掘):为什么不使用'X'和'O'来代替? Character constants 可用于(几乎)任何地方,如整数常量。 -
@Scheff 你能详细说明一下吗?基本上我所做的是创建一个数组: int pos[9] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };这样我就可以轻松地在每个框中显示带有数字的井字游戏表,以便用户可以轻松选择要玩的框。然后,如果该框等于 79 或 88,则该数组单元格将显示为 (char)。例如: if (pos[0] == 1) cout
-
您没有公开您的数组声明,但无论如何 -
char pos[]和int pos[]都是如此:如果您想比较一个元素是否存储'X',您可以这样做只需pos[i] == 'X'。这与pos[i] == 88等效,因为'X'是ASCII 88 的字符常量,因此表示相同的值。 (如果您不使用 ASCII 而是使用其他东西(例如 EBCDIC)(我真的不相信),那么pos[i] == 88可能会损坏,但pos[i] == 'X'甚至可以使用 EBCDIC。) -
我刚刚在
TicTacToe::computer_move()中找到了position[pos - 1] = 79;,这可能是“交换错误”。你可能打算写pos[position - 1] = 79;有趣的事实是两者的工作原理相同:position[pos - 1]与*(position + pos - 1)相同。pos[position - 1]与*(pos + position - 1)相同。所以,最后它解决了相同的元素。 (但它让我的眼睛结结巴巴):-)
标签: c++ arrays class while-loop tic-tac-toe