tictaktoe数组绑定溢出

时间:2016-10-03 17:04:10

标签: c++ arrays

我需要帮助我正在为分配工作的代码。我有一个问题,如果我在棋盘上有任何X在左边2列,它将在上面的行中显示一个X.我使用了我的调试器,似乎它试图访问数组边界之外的东西,但它不应该。关于如何做到这一点的任何建议?

#include <iostream>
using namespace std;

void printTTT(char a[3][3]);
void insertX(/*PASS BY REFERENCE*/);
void insertO(char (&arr)[3][3]);
void checkForWin(/*PASS BY REFERENCE*/); // IGNORE THIS FOR NOW

int main() {

        char TTTarray[3][3] = { { 'X','-','-' },
                                { '-','-','-' },
                                { 'X','-','-' } };

        //char TTTarray[3][3] = { {'-','X','-'},
        //                        {'-','X','-'},
        //                        {'-','-','O'}};

        //char TTTarray[3][3] = { {'-','-','-'},
        //                        {'-','X','-'},
        //                        {'-','O','-'}};

        //char TTTarray[3][3] = { {'X','-','X'},
        //                        {'-','-','-'},
        //                        {'O','-','-'}};

        //char TTTarray[3][3] = { {'X','-','X'},
        //                        {'O','X','-'},
        //                        {'O','-','O'}};


        //insertX(/*CALL*/);
        //OR
        insertO(TTTarray);

        printTTT(TTTarray);

        /*****************
        I have included the declaratoin of the array, initialized to - for each spot.
        The '-' represents an empty position.  You should fill it with either a
        capital 'O' or a capital 'X'. I have also included a number of initialized arrays
        to test; just comment out the ones you don't want for that moment
        *****************/
        return 0;
}

void printTTT(char a[3][3])
{
        for (int i = 0; i < 3; i++)
        {
                for (int j = 0; j < 3; j++)
                {
                        cout << a[i][j];
                }
cout << endl;
        }
}

void insertX(/*PASS BY REFERENCE*/) {

}

void insertO(char (&arr)[3][3])
{
        int x1x;
        int x1y;
        //int x2x;
        //int x2y;

        for (int i = 0; i < 3; i++)
        {
                int go = 0;
                for (int j = 0; j < 3; j++)
                {
                        if (arr[i][j] == '-')
                        {
                                x1x = i;
                                x1y = j;
                                // looking for 2 x's for the block lol
                                if (x1x == 0 && go == 0)
                                {
                                        if (arr[x1x][x1y + 1] == 'X' && arr[x1x][x1y + 2] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                        if (arr[x1x][x1y - 1] == 'X' && arr[x1x][x1x + 1] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                        if (arr[x1x][x1y - 1] == 'X' && arr[x1x][x1x - 2] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                }
                                if (x1x == 1 && go == 0)
                                {
                                        if (arr[x1x][x1y + 1] == 'X' && arr[x1x][x1y + 2] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                        if (arr[x1x][x1y - 1] == 'X' && arr[x1x][x1x + 1] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                        if (arr[x1x][x1y - 1] == 'X' && arr[x1x][x1x - 2] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
 }
                                if (x1x == 2 && go == 0)
                                {
                                        if (arr[x1x][x1y + 1] == 'X' && arr[x1x][x1y + 2] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                        if (arr[x1x][x1y - 1] == 'X' && arr[x1x][x1x + 1] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                        if (arr[x1x][x1y - 1] == 'X' && arr[x1x][x1x - 2] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                }




                                if (x1y == 0 && go == 0)
                                {
                                        if (arr[x1x + 1][x1y] == 'X' && arr[x1x + 2][x1y] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                        if (arr[x1x - 1][x1y] == 'X' && arr[x1x + 1][x1x] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                        if (arr[x1x - 1][x1y] == 'X' && arr[x1x - 2][x1x] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                }
                                if (x1y == 1 && go == 0)
                                {
                                        if (arr[x1x + 1][x1y] == 'X' && arr[x1x + 2][x1y] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                        if (arr[x1x - 1][x1y] == 'X' && arr[x1x + 1][x1x] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                        if (arr[x1x - 1][x1y] == 'X' && arr[x1x - 2][x1x] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                }
                                if (x1y == 2 && go == 0)
                                                                                                   181,1-8       83%
 {
                                        if (arr[x1x + 1][x1y] == 'X' && arr[x1x + 2][x1y] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                        if (arr[x1x - 1][x1y] == 'X' && arr[x1x + 1][x1x] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                        }
                                        if (arr[x1x - 1][x1y] == 'X' && arr[x1x - 2][x1x] == 'X')
                                        {
                                                arr[i][j] = 'O';
                                                go = 1;
                                }

                        }
                }

}
}
}

1 个答案:

答案 0 :(得分:1)

查看insertD函数中的这些行:

if (x1x == 0 && go == 0)
{
    if (arr[x1x][x1y + 1] == 'X' && arr[x1x][x1y + 2] == 'X')

在这种情况下,您已检查x1x为零,但尚未检查x1y。因此,在这种情况下,如果x1y非零,您将超出界限。

你下面有几行

if (arr[x1x][x1y - 1] == 'X' && arr[x1x][x1x + 1] == 'X')

x1y 为零时,这也将超出范围。

您需要添加更多检查,或重新考虑逻辑。