我正在编写Tic Tac Toe主机游戏,我有一个非常有趣的问题。该计划工作得很好,但问题出在Tic Tac Toe的矩阵中。最后一个元素(最后一行,最后一列)是一个微笑,它有时会改变。它有时是笑笑,或者是一颗心。怎么了?
整个代码:
#include <iostream>
#include <string>
#include <string.h>
#include <vector>
#include <stdlib.h>
using namespace std;
char matrix[3][3];
int orow, ocolumn, xrow, xcolumn;
int drawcounter = 0;
void paint() {
for (int i = 1; i < 4; i++) {
for (int j = 1; j < 4; j++)
matrix[i][j] = '_';
}
}
void board() {
for (int i = 1; i < 4; i++)
for (int j = 1; j < 4; j++) {
if (i != 1 && j == 1)
cout << endl;
cout << matrix[i][j] << " ";
}
cout << endl;
//cout << matrix[3][3] << endl;
}
void action() {
while (0 == 0) {
puts("Time for player X. Enter index");
cin >> xcolumn >> xrow;
matrix[xcolumn][xrow] = 'X';
drawcounter += 1;
if (drawcounter == 9) {
puts("It's a draw.");
break;
}
board();
cout << endl;
if ((matrix[1][1] == 'X' && matrix[2][2] == 'X' && matrix[3][3] == 'X') || (matrix[1][3] == 'X' && matrix[2][2] == 'X' && matrix[3][1] == 'X')) {
puts("X Wins! Congrats X!");
break;
}
if ((matrix[1][1] == 'X' && matrix[1][2] == 'X' && matrix[1][3] == 'X') || (matrix[2][1] == 'X' && matrix[2][2] == 'X' && matrix[2][3] == 'X') || (matrix[3][1] == 'X' && matrix[3][2] == 'X' && matrix[3][3] == 'X')) {
puts("X Wins! Congrats X!");
break;
}
if ((matrix[1][1] == 'X' && matrix[2][1] == 'X' && matrix[3][1] == 'X') || (matrix[1][2] == 'X' && matrix[2][2] == 'X' && matrix[3][2] == 'X') || (matrix[1][3] == 'X' && matrix[2][3] == 'X' && matrix[3][3] == 'X')) {
puts("X Wins! Congrats X!");
break;
}
puts("Time for player O. Enter index");
cin >> ocolumn >> orow;
matrix[ocolumn][orow] = 'O';
drawcounter += 1;
board();
cout << endl;
if ((matrix[1][1] == 'O' && matrix[2][2] == 'O' && matrix[3][3] == 'O') || (matrix[1][3] == 'O' && matrix[2][2] == 'O' && matrix[3][1] == 'O')) {
puts("O Wins! Congrats O!");
break;
}
if ((matrix[1][1] == 'O' && matrix[1][2] == 'O' && matrix[1][3] == 'O') || (matrix[2][1] == 'O' && matrix[2][2] == 'O' && matrix[2][3] == 'O') || (matrix[3][1] == 'O' && matrix[3][2] == 'O' && matrix[3][3] == 'O')) {
puts("O Wins! Congrats O!");
break;
}
if ((matrix[1][1] == 'O' && matrix[2][1] == 'O' && matrix[3][1] == 'O') || (matrix[1][2] == 'O' && matrix[2][2] == 'O' && matrix[3][2] == 'O') || (matrix[1][3] == 'O' && matrix[2][3] == 'O' && matrix[3][3] == 'O')) {
puts("O Wins! Congrats O!");
break;
}
}
}
int main() {
paint();
board();
action();
system("pause");
return 0;
}
输出图片:
答案 0 :(得分:1)
在C ++中,数组的索引是0.所以在paint()
for(int i = 1; i < 4; ++i) // out of bounds when `i = 3`
您有一个超出限制的访问权限,因为matrix
被声明为
char matrix[3][3];
你必须用0到3的循环替换所有这样的循环。此外,你的if
条件可能是错误的
if ((matrix[1][6] == 'X' && matrix[2][7] .... // 6 and 7 ?!?!
因为行/列索引不能大于2
答案 1 :(得分:1)
C / C ++中的数组索引从0
开始,而不是从1
开始 - 所以你必须重写你的代码:
void paint() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
matrix[i][j] = '_';
}
}
void board() {
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++) {
if (i != 0 && j == 0)
cout << endl;
cout << matrix[i][j] << " ";
}
cout << endl;
//cout << matrix[3][3] << endl;
}
这里实际发生了什么,详细说明:当你定义数组时,你应该记住索引从0开始,所以例如当你声明一个包含3个元素的数组matrix[3]
时,它就不会像matrix[1]
,matrix[2]
和matrix[3]
,而是matrix[0]
,matrix[1]
和matrix[2]
。
因此,在这种情况下,您将脱离数组边界 - 并且它是“这里是龙”区域,分配给数组的内存区域之外。所以基本上你在这里使用原始内存,在你的情况下包含一个笑脸的字符代码(这就是为什么它每次都不同 - 因为内存内容在这个区域没有确定 - 例如,你甚至可以尝试得到matrix[123]
的值,虽然它的大小只有3个元素 - 并且你得到一个未定义的随机值作为结果。)
你应该记住,C / C ++数组的行为与这方面的指针非常相似 - 你甚至可能会说它是一样的。
答案 2 :(得分:1)
char matrix[3][3];
[...]
matrix[3][3] == 'O'
这不会奏效。数组索引从0开始。因此,您已声明大小为3的数组,然后访问其第4个元素。这是未定义的行为。这意味着任何都可能发生,包括崩溃或打印看似随机的角色。
请注意,使用这样的原始数组可能会引起一两个眉毛。如果您希望能够动态确定矩阵大小(例如通过用户输入),则无论如何都要使用std::vector
。如果这个大小在概念上真正意味着在编译时就已知(对于像这样的游戏来说可能就是这种情况),请考虑使用std::array
,或者至少了解它的语法和好处。
答案 3 :(得分:0)
也许您正在尝试将1存储在char数组中
#include<iostream>
using namespace std;
int main()
{
char n=1;
cout << n;
return 0;
}
输出将是一个笑脸