C ++ 2D阵列算术问题

克雷兹

我已经使用C ++进行了很长时间的尝试,以尝试构建一个稍微简单的井字游戏。玩家轮流提供所需的元素,将1和2加到动态尺寸的游戏板上。

用来确定玩家的回合和游戏板更新的功能正常,但是下面的代码检查由0表示的板的获胜条件,例如:

  • 3个相邻的1和2
  • 3个垂直对齐的1和2
  • 3个对角线1和2

但是不起作用。经过测试后,该板仅需每轮更新一次。我怀疑的问题是数组算法。如何执行该算法以成功检测条件?提前致谢。

bool chkCondition(int rows, int columns, int**board){
int counter=0;
for(int i=0; i<rows; i++){
    for(int j=0; j<columns; j++){
        if(board[i][j]==1 && board[i][j]+1==1 && board[i][j]+2==1){//checks horizontally for 1
            cout << "Player 1 wins!";
            return true;
        }else if(board[i][j]==1 && board[i][j]+columns==1 && board[i][j]+2*columns==1){//checks vertically for 1
            cout << "Player 1 wins!";
            return true;
        }else if(board[i][j]==1 && board[i][j]+columns+1==1 && board[i][j]+2*columns+2==1){//checks diagonally for 1
            cout << "Player 1 wins!";
            return true;
        }else if(board[i][j]==2 && board[i][j]+1==2 && board[i][j]+2==2){//checks horizontally for 2
            cout << "Player 2 wins!";
            return true;
        }else if(board[i][j]==2 && board[i][j]+columns==2 && board[i][j]+2*columns==2){//checks vertically for 2
            cout << "Player 2 wins!";
            return true;
        }else if(board[i][j]==2 && board[i][j]+columns+1==2 && board[i][j]+2*columns+2==2){//checks diagonally for 2 
            cout << "Player 2 wins!";
            return true;
        }else if(board[i][j]==0){//attempts to detect if the game is a draw
            if(counter==(rows+columns)-3){
                cout << "It's a draw!";
                return true;
            }
        }
    }
}
return false;
counter++;
}

编辑将算术更改为正确的格式,以查找元素而不是添加其值。新的代码在这里:

bool chkCondition(int rows, int columns, int**board){
int counter=0;
for(int i=0; i<rows; i++){
    counter++;
    for(int j=0; j<columns; j++){
        if(board[i][j]==1 && board[i][j+1]==1 && board[i][j+2]==1){
            cout << "Player 1 wins!";
            return true;
        }else if(board[i][j]==2 && board[i][j+1]==2 && board[i][j+2]==2){
            cout << "Player 2 wins!";
            return true;
        }
        if(counter==rows | counter>rows-1){
            //cout << "L--------\n";
            //cout << "checking vertical\n";
            if(board[i][j]==1 && board[i][j-columns]==1 && board[i][j-columns-columns]==1){
                cout << "Player 1 wins!";
                return true;
            }else if(board[i][j]==2 && board[i][j-columns]==2 && board[i][j-columns-columns]==2){
                cout << "Player 2 wins!";
                return true;
            //cout << "checking diagonal\n";
            }else if(board[i][j]==1 && board[i][j-columns-1]==1 && board[i][j-columns-columns-2]==1){
                cout << "Player 1 wins!";
                return true;
            }else if(board[i][j]==2 && board[i][j-columns-1]==2 && board[i][j-columns-columns-2]==2){
                cout << "Player 2 wins!";
                return true;
            }
        }
        if(counter==1 && counter<rows-1){
            //cout << "H--------\n";
            //cout << "checking vertical\n";
            if(board[i][j]==1 && board[i][j+columns]==1 && board[i][j+columns+columns]==1){
                cout << "Player 1 wins!";
                return true;
            }else if(board[i][j]==2 && board[i][j+columns]==2 && board[i][j+columns+columns]==2){
                cout << "Player 2 wins!";
                return true;
            //cout << "checking diagonal\n";
            }else if(board[i][j]==1 && board[i][j+columns+1]==1 && board[i][j+columns+columns+2]==1){
                cout << "Player 1 wins!";
                return true;
            }else if(board[i][j]==2 && board[i][j+columns+1]==2 && board[i][j+columns+columns+2]==2){
                cout << "Player 2 wins!";
                return true;
            }
        }
        if(counter>2 && counter<rows-1){
            //cout << "M--------\n";
            //cout << "checking vertical\n";
            if(board[i][j]==1 && board[i][j+columns]==1 && board[i][j-columns]==1){
                cout << "Player 1 wins!";
                return true;
            }else if(board[i][j]==2 && board[i][j+columns]==2 && board[i][j-columns]==2){
                cout << "Player 2 wins!";
                return true;
            //cout << "checking diagonal\n";
            }else if(board[i][j]==1 && board[i][j+columns+1]==1 && board[i][j-columns-1]==1){
                cout << "Player 1 wins!";
                return true;
            }else if(board[i][j]==2 && board[i][j+columns+1]==2 && board[i][j-columns-1]==2){
                cout << "Player 2 wins!";
                return true;
            }
        }
    }
}
return false;

}

外部if语句用于确定在迭代中对当前行进行计数的计数器是在表的开头,中间还是结尾,以避免分段错误。这可以正常工作,并且程序不会崩溃,但是,尽管算术是逻辑上的,但所有垂直和对角条件语句都根本不起作用。谁能告诉我发生了什么事?

月经的

正如评论所说,问题在于您如何访问表。另一个问题是如何使用循环。如果您首先进行水平检查,则循环遍历每一行,但不应遍历每一列,否则您会遇到很好的分段错误。例如,第一部分(假设您实际上将+ 1 / + 2放在了合适的位置

for(int i=0; i<rows; i++){
    for(int j=0; j<columns; j++){
        if(board[i][j]==1 && board[i][j+1]==1 && board[i][j+2]==1){//checks horizontally for 1
            cout << "Player 1 wins!";
            return true;

当j为column-2或column时,它将给您带来分段错误。为了解决这个问题,您需要先停下来。对于水平检查,线条相同。仅执行这样的循环会更复杂,否则您需要添加更多的ifs以避免此错误。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++ 2D阵列算术问题

来自分类Dev

2D阵列C的快速输出

来自分类Dev

C ++中的2D阵列高斯模糊函数有什么问题?

来自分类Dev

紧密循环性能下的2D阵列与阵列阵列C#

来自分类Dev

具有2D阵列的C内存管理

来自分类Dev

Rust vs C中2D阵列性能的迭代

来自分类Dev

访问2D阵列的正确方法-C

来自分类Dev

C编程2D阵列内存布局

来自分类Dev

c中的2D阵列水平反射

来自分类Dev

具有2D阵列的C内存管理

来自分类Dev

在C ++中将矩阵(2D阵列)旋转45度

来自分类Dev

2D阵列问题

来自分类Dev

2D阵列问题

来自分类Dev

C ++中的2D矢量问题

来自分类Dev

C ++语法差异:2D和1D数组(指针算术)

来自分类Dev

在2D阵列(C,OpenMP,CilkPlus)的一行上运行的并行化功能

来自分类Dev

在2D阵列(C,OpenMP,CilkPlus)的一行上运行的并行化功能

来自分类Dev

C#:如何比较2D阵列中每一行的总和?

来自分类Dev

C程序2D数组添加值问题

来自分类Dev

C#XNA 2D Platformer跳跃问题

来自分类Dev

C ++阵列逻辑问题

来自分类Dev

复制2D阵列时出现问题

来自分类Dev

输入2D数组-C ++(带有第一行/列元素的问题)

来自分类Dev

c:动态分配2d char数组时出现问题?

来自分类Dev

Unity 2D Top Down Shooter运动问题C#

来自分类Dev

C ++类和函数的问题-打印2D数组的函数

来自分类Dev

如何制作2D阵列的2D阵列

来自分类Dev

分组2D阵列

来自分类Dev

2D阵列存储