【问题标题】:Tic Tac Toe - 2D Array井字游戏 - 2D 阵列
【发布时间】:2017-03-07 21:41:57
【问题描述】:

我尝试创建井字游戏,并且我能够填满我的棋盘,并且能够检查行和列的获胜者。但是,我需要一些帮助来检查对角线,看看谁赢了。这是我到目前为止所拥有的。我是初学者,所以请不要把代码写得太难。

检查方法:

public boolean check(String[] [] board)
{
    int j = 0;
    for(int i = 0; i < board.length;i++) //row
    {
        if(board[i][j] == "X" || board[i][j+1] == "X" || board[i][j+2] == "X")
        {
          if(board[i][j] == board[i][j+1] & board[i][j] == board[i][j+2])
          {
              System.out.println("X wins!");
                return true;
          }
        }
    }
    int e = 0;
    for(j = 0; j < board.length;j++) //col
    {
        if(board[e][j] == "X" | board[e + 1][j] == "X"  | board[e + 2][j] == "X" )
        {
          if(board[e][j] == board[e + 1][j] & board[e][j] == board[e + 2][j])
          {
              System.out.println("X, wins");
                return true;
          }
        }
     }
    int d = 0;
    for(int ii = 0; ii < board.length; ii++) //diag
    {
        if(board[d][ii] != null || board[d + 1][ii] != null | board[d + 2][ii] != null)
        {
            if(board[d][ii] == board[d + 1][ii+1] & board[d][ii] == board[d + 2][ii])
            {
                System.out.println("X, wins dig");
                return true;
            }
        }
    }
    int k = 0;
    for(int i = 0; i < board.length;i++) //row
    {
        if(board[i][k] == "O" || board[i][k+1] == "O" || board[i][k+2] == "O")
        {
          if(board[i][k] == board[i][k+1] & board[i][k] == board[i][k+2])
          {
              System.out.println("O wins!");
                return true;
          }
        }
    }
    int z = 0;
    for(k = 0; k < board.length; k++) //col
    {
        if(board[z][k] == "O" | board[z + 1][k] == "O"  | board[z + 2][k] == "O" )
        {
          if(board[z][k] == board[z + 1][k] & board[z][k] == board[z + 2][k])
          {
              System.out.println("O, wins");
                return true;
          }
        }
     }

    return false;
}

【问题讨论】:

  • 您可能还会发现this example 有帮助
  • 另外:您尝试在您的板上迭代您的 fillX 和 fillY 方法,但您使用 r1-1 和 c1-1。由于它们是之前定义的整数,因此值将始终相同。 (例如:如果我为 r1 输入 3,为 c1 输入 3,您将在 board[2][2] 处输入 9 次“o”,这是无用的)
  • 所以你是说我应该把 r1 和 c1 改成 r 和 c?@Namoz
  • 他指出您在 fillO 和 fillX 中有无用的循环。只留下循环的内部。
  • 换句话说,去掉fillOfillX中的for循环。他们让你做同样的事情 9 次。相反,在任何循环之外只做一次。

标签: java arrays


【解决方案1】:

这个问题有一些你想做的事情:

首先确保值已经不存在:(来自 cmets 的建议考虑在内)

public void fillX(String[][] board) {
    attemptToFillValue(board, "x");
}

public void fillO(String[][] board) {
    attemptToFillValue(board, "o");
}

private void attemptToFillValue(String[][]board,  String value) {
    do {
        int r = Integer.parseInt(JOptionPane.showInputDialog("What row from 1-3?"));
        int c = Integer.parseInt(JOptionPane.showInputDialog("What column from 1-3?"));
        if (board[r - 1][c - 1] != null) {
            board[r - 1][c - 1] = value;
            return;
        } else {
            //Warn then that value already exists in some way
        }
    } while (true);
}

关于验证棋盘是否有获胜者,我建议使用 for 循环并进行 3 次单独检查。 水平、垂直和对角线。

我不想为你完成整个任务,所以把它留给你

【讨论】:

  • 我完全理解,而且编码的挑战在于解决问题。但我明白了。我将在上面编辑我的代码,因为这是我目前所拥有的
  • 一开始如何初始化板子?如果将值设置为 null 它将起作用。如果将其设置为其他值,则必须在返回前更改尝试ToFillValue 中的检查。
猜你喜欢
  • 2013-04-26
  • 2015-04-04
  • 2014-12-31
  • 1970-01-01
  • 2015-06-12
  • 2015-01-08
相关资源
最近更新 更多