【问题标题】:Check if a char is in a 2D array in java检查一个字符是否在java中的二维数组中
【发布时间】:2022-01-05 21:35:55
【问题描述】:

我一直在做创建一个简单的国际象棋程序的作业。

棋盘是一个二维数组,命名为board。这些片段都是像 R、Q、K 这样的单个字符,空白处用 ' ' 字符填充,所以是空格。

public static char[][] board;

get 方法应该返回 char 或坐标 (x,y) 上的任何内容。

 public char get(int x, int y) {
        if(x < board[0].length && x >= 0 && y < board.length && y >= 0){
            return board[x][y];
        }
        else
            return '\0';
    }

问题是我评估谁是获胜者的程序没有按预期工作。

这个程序检查每支球队的国王是否还在棋盘中,所以是棋盘数组。

如果两者都还活着,它应该返回 0,如果只有白色的国王还活着,它应该返回 1,如果只有黑色的国王还活着,它应该返回 2。

我已经制作了一个程序,或者至少尝试过制作一个程序,它遍历每个坐标并检查是否有一个字符“K”代表白国王,以及“S”代表黑国王。

我已将布尔 kingIsAlive 设置为 false,因此如果在数组中没有找到 K 或 S,则它仍然为 false。

虽然,我在底部的代码,以及返回 0,1 或 2 的 if 和 else 存在错误,即 kingWhiteIsAlive 始终为 false 并且 kingBlackIsAlive 始终为 false。强>

所以,我认为我将 kingIsAlive 布尔值变为 true 的程序根本不起作用....

我得到的错误是:

白方本应赢 => 预期: 但结果:

没有人应该赢=>预期:但是是:

经过几个小时的尝试,我放弃了,决定在这里问。

public int decideWinner(){
    boolean kingWhiteIsAlive = false;
    boolean kingBlackIsAlive = false;

    for(int y = 0; y < board.length;y++){
        for(int x = 0;x < board[0].length;x++){
            if(get(x,y) == 'K'){
                kingWhiteIsAlive = true;
            }
        }
    }
    for(int j = 0; j < board.length;j++){
        for(int i = 0;i < board[0].length;i++){
            if(get(i,j) == 'S'){
                kingBlackIsAlive = true;
            }
        }
    }
    if(kingWhiteIsAlive && kingBlackIsAlive){
        return 0;
    }
    else if(kingWhiteIsAlive && !kingBlackIsAlive){
        return 1;
    }
    else if(!kingWhiteIsAlive && kingBlackIsAlive){
        return 2;
    }
    else
        return -1;
} 

return -1 表示两队都没有国王的测试用例。

【问题讨论】:

  • 它对我有用。 board 定义是否正确,您在哪里定义它?
  • 您的代码在我看来应该可以工作。也许您的 board 数组没有存储您认为应该存储的内容。我建议使用调试器逐步完成此操作,以了解发生了什么。

标签: java for-loop multidimensional-array chess


【解决方案1】:

如果你找到一个国王,你需要打断你的搜索。您可以通过break 声明来实现。

for(int y = 0; y < board.length;y++){
    for(int x = 0;x < board[0].length;x++){
        if(get(x,y) == 'K'){
            kingWhiteIsAlive = true;
            break;
        }
    }
}
for(int j = 0; j < board.length;j++){
    for(int i = 0;i < board[0].length;i++){
        if(get(i,j) == 'S'){
            kingBlackIsAlive = true;
            break;
        }
    }
}

【讨论】:

    【解决方案2】:

    我已经测试了你的代码并且运行良好,也许问题出在你的板子初始化上?

    尝试通过在decideWinner 函数的开头显示数组的实际内容来调试您的代码。

    如果有帮助的话,我已经对电路板使用了这个初始化。

    public void initBoard() {
      board = new char[8][8];
      // Init pawns
      for (int j = 0; j < board.length; j++) {
        board[j][1] = 'P';
        board[j][6] = 'P';
      }
      // Rooks
      board[0][0] = 'R';
      board[7][0] = 'R';
      board[0][7] = 'R';
      board[7][7] = 'R';
    
      // Knights
      board[1][0] = 'N';
      board[6][0] = 'N';
      board[1][7] = 'N';
      board[6][7] = 'N';
    
      // Bishops
      board[2][0] = 'B';
      board[5][0] = 'B';
      board[2][7] = 'B';
      board[5][7] = 'B';
    
      // Queens
      board[3][0] = 'Q';
      board[4][7] = 'Q';
    
      // Kings
      board[4][0] = 'K'; // White
      board[3][7] = 'S'; // Black
    
      // Empty space
      for (int y = 0; y < board.length; y++) {
        for (int x = 2; x < 6; x++) {
          board[y][x] = ' ';
        }
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多