在输出C ++中微笑

时间:2015-02-20 14:52:36

标签: c++

我正在编写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;
}

输出图片:

enter image description here

enter image description here

4 个答案:

答案 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;
 }

输出将是一个笑脸