Java 2D array diagonals for game

生来就可爱ヽ(ⅴ<●) 提交于 2019-12-13 00:55:49

问题


To clarify I only wanted one or two for loops to help me on my way, preferably in the same style as I had used in the vertical :)

I'm making a game using a 2D array, and I need a check that tests if at the current position (indicated by a green square) the character there is part of a diagonal sequence of "l" more of the character.


回答1:


public static boolean diagonals(char[][] b, int row, int col, int l) {

            int counter = 1; // because we start from the current position
            char charAtPosition = b[row][col];
            int numRows = b.length;
            int numCols = b[0].length;
            int topleft = 0;
            int topright = 0;
            int bottomleft = 0;
            int bottomright = 0;
            for (int i=row-1,j=col-1;i>=0 && j>=0;i--,j--) {
                if (b[i][j]==charAtPosition) {
                    topleft++;
                } else {
                    break;
                }
            }
            for (int i=row-1,j=col+1;i>=0 && j<=numCols;i--,j++) {
                if (b[i][j]==charAtPosition) {
                    topright++;
                } else {
                    break;
                }
            }
            for (int i=row+1,j=col-1;i<=numRows && j>=0;i++,j--) {
                if (b[i][j]==charAtPosition) {
                    bottomleft++;
                } else {
                    break;
                }
            }
            for (int i=row+1,j=col+1;i<=numRows && j<=numCols;i++,j++) {
                if (b[i][j]==charAtPosition) {
                    bottomright++;
                } else {
                    break;
                }
            }
            return topleft + bottomright + 1 >= l || topright + bottomleft + 1 >= l; //in this case l is 5
    }

The idea is that we walk in four directions and count the steps. This may not be the most efficient implementation, but at least it looks neat and easy to understand.




回答2:


Here's the function, it works. The explanation is in the comments in the code, but if you find anything confusing let me know and I'll explain it.

public static boolean diagonals(char[][] b, int row, int col, int l) {
  int forwardCounter = 1; // this counts top right to bottom left
  int backCounter = 1; // this counts top left to bottom right
  int distance = 1;
  // 0 = topleft, 1 = topright, 2 = bottomleft, 3 = bottomright
  boolean[] checks = new boolean[]{true, true, true, true};

  char charAtPosition = b[row][col];

  while(checks[0] || checks[1] || checks[2] || checks[3]) {
    for(int i = 0; i < 4; i++) {
      if(checks[i]) {
        // This looks confusing but it's simply just converting i into
        // The four different directions
        checks[i] = checkSquare(b, row + (i < 2 ? -distance : distance),
                col + (i % 2 == 0 ? -distance : distance), charAtPosition);
        if(checks[i]) {
          // If top left or bottom right
          if(i % 3 == 0) {
            backCounter++;
          } else {
            forwardCounter++;
          }
        }
      }
    }

    if (forwardCounter >= l || backCounter >= l) return true;

    distance++;
  }

  return false;
}

private static boolean checkSquare(char[][] b, int row, int col, char check) {
  if(row < 0 || row >= b.length) return false;
  if(col < 0 || col >= b[0].length) return false;

  return check == b[row][col];
}


来源:https://stackoverflow.com/questions/13705431/java-2d-array-diagonals-for-game

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!