我的逻辑有什么问题,我无法确定从左边开始还是从底部开始连续有3个?

What's wrong with my logic, I can't determine if there are 3 in a row from the left or the bottom of the grid?

所以我正在尝试检查是否有 3 个相同颜色的方块在垂直和水平方向上连续排列。这适用于从左侧水平但不是右侧的瓷砖。它也适用于从顶部而不是底部对齐的图块。

基本上我有一个 4BY4 网格,其中每个图块都可以更改为红色、白色或灰色。我的逻辑有问题,我就是挑不出来!!

这是我用来判断是否有3个连续的代码! gridArray[i].getRDC() == R.drawable.white - 这只会检查返回的 RDC 是否为白色。目前只是试图让逻辑正确,我还没有添加代码来检查 RDC 是否为红色。

public void checkWinner(){
    //CHECK FOR HORIZONTAL
    for(int i=0;i<16;i+=4){
        if(gridArray[i].getRDC() == R.drawable.white 
                && gridArray[i+1].getRDC() == R.drawable.white
                && gridArray[i+2].getRDC() == R.drawable.white
        ){
            Toast.makeText(getApplicationContext(),"THREE IN A ROW HORIZONTALLY",
                    Toast.LENGTH_SHORT).show();
            Log.d("MyApp","3 in row horizontally");
        }
        
    }
    

    //CHECK FOR VERTICAL
    for(int i=0;i<=3;i++){
            if(gridArray[i].getRDC() == R.drawable.white 
            && gridArray[i+4].getRDC() == R.drawable.white
            && gridArray[i+8].getRDC() == R.drawable.white
//          && gridArray[i+12].getRDC() == R.drawable.white
//          || 
//          gridArray[i+12].getRDC() == R.drawable.white 
//          && gridArray[i+8].getRDC() == R.drawable.white
//          && gridArray[i].getRDC() == R.drawable.white
            ){
                Toast.makeText(getApplicationContext(),"THREE IN A ROW VERTICALLY",
                Toast.LENGTH_SHORT).show();
                Log.d("MyApp","3 in row vertically");
            }
        }
    }

所以目前,如果我从网格左侧连续获得 3 个图块,那么它将显示 toast 但是 如果我从右侧连续获得 3 个图块OF THE GRID 不会显示吐司?这与垂直对齐的图块相同(我将在这张图片后解释)。

左对齐

这是从左侧水平对齐的 3 个图块的图像:

从右对齐:

这是一张图像,其中有 3 个图块从右侧水平对齐:

来自顶部的垂直对齐图块的图像:

从底部对齐

出于某种原因,它不会检查是否有 3 个从网格底部垂直对齐,只有顶部?!

for(int i=0;i<16;i+=4){
    if(gridArray[i].getRDC() == R.drawable.white 
            && gridArray[i+1].getRDC() == R.drawable.white
            && gridArray[i+2].getRDC() == R.drawable.white
    ){
        Toast.makeText(getApplicationContext(),"THREE IN A ROW HORIZONTALLY",
                Toast.LENGTH_SHORT).show();
        Log.d("MyApp","3 in row horizontally");
    }

}

在此循环中,您开始检查 i == 0、i == 4、i == 8、i == 12。 在您的示例中,1、2、3 是白色的,但您永远不会真正检查这种可能性。

您尝试确定是否存在三个相同颜色的方块的方法根本上是错误的。首先,你应该有二维数组而不是一维数组,你现在有,因为它很容易扩展。

for(int i=0;i<ROWS;i++){

    for(int j=0;j<COLUMNS;j++){

         int color=gridArray[i][j++];
         int count=1;

          while(color==gridArray[i][j++]){
             count++;
             if(count>=MAX_SAME_COLOR){
                Toast.makeText(getApplicationContext(),MAX_SAME_COLOR+" IN A ROW HORIZONTALLY",
                        Toast.LENGTH_SHORT).show();
                Log.d("MyApp",MAX_SAME_COLOR+" in row horizontally");
               }
           }

    }
}

如果你只是改变尺寸,如果垂直方向上也有三个相同颜色的方块,你可以很容易地得到。

对于垂直检查,

for(int i=0;i<=3;i++){

应该是

for(int i=0;i<=7;i++){

为什么?因为我们有两行可以有一列包含三个连续的相同颜色的单元格。第 1 行和第 2 行。

在循环中查找错误最可靠的方法是在纸上画一个 table 并遍历每个迭代。但是您的代码还有其他一些问题。这是一个表示二维问题的一维数组。这是不合逻辑且容易出错的。此外,当您应该编写 adaptable 代码时,您正在对数字进行硬编码。如果您需要将其更改为五乘五的网格怎么办?

for(int i=0;i<16;i+=4){
        if((gridArray[i].getRDC() == R.drawable.white 
                && gridArray[i+1].getRDC() == R.drawable.white
                && gridArray[i+2].getRDC() == R.drawable.white
        )
       ||
        (gridArray[i+1].getRDC() == R.drawable.white 
                && gridArray[i+2].getRDC() == R.drawable.white
                && gridArray[i+3].getRDC() == R.drawable.white
        )){
            Toast.makeText(getApplicationContext(),"THREE IN A ROW HORIZONTALLY",
                    Toast.LENGTH_SHORT).show();
            Log.d("MyApp","3 in row horizontally");
        }

    }