2

我想了解游戏是否已完成或绘制或仍然可以玩。但我想用动态代码来做。

例如,我对 3*3 tictactoe 游戏进行静态处理,如下所示:

private static boolean check_game_state(char[] board)
{
    if (    (board[0]==cSymbol && board[1]==cSymbol && board[2]==cSymbol) 
         || (board[3]==cSymbol && board[4]==cSymbol && board[5]==cSymbol) 
         || (board[6]==cSymbol && board[7]==cSymbol && board[8]==cSymbol)
         || (board[0]==cSymbol && board[3]==cSymbol && board[6]==(cSymbol))
         || (board[1]==(cSymbol) && board[4]==(cSymbol) && board[7]==(cSymbol))
         || (board[2]==(cSymbol) && board[5]==(cSymbol) && board[8]==(cSymbol))
         || (board[0]==(cSymbol) && board[4]==(cSymbol) && board[8]==(cSymbol))
         || (board[2]==(cSymbol) && board[4]==(cSymbol) && board[6]==(cSymbol)))
    {
        if (cSymbol == 'X')
        {
            state = 5;  //player 1 win
        }
        else if (cSymbol == 'O')
        {
            state = 4; player 2 win
        } 
    }
}

我想为 4*4 或 5*5 或更高的板动态设置它。但是我该怎么做呢?是否可以?

4

3 回答 3

1

您需要循环访问元素,而不是对索引进行硬编码。例如,而不是

boolean test = (board[0]==cSymbol && board[1]==cSymbol && board[2]==cSymbol);

你会做类似的事情

boolean test = true;
for (int i = 0; i < length; ++i) {
  test = test && board[i] == cSymbol ;
}

棋盘的大小在哪里length(例如 5、6),board.length

test只有当所有元素都等于 时,它才会设置为 true cSymbolfalse否则。

更新:我给你行的计算;您需要将其应用于(提示:计算索引i+j*length)、主对角线(索引:)i*length+i子对角线(索引:) i*length+(length-1-i)。索引i*length + j转换为第ith 行j第 th 列:

private static boolean check_game_state(char[] board, int length) 
{ 
  bool row = false;
  for (int i = 0; i < length; ++i) {
    bool innerRow = true;
    for (int j = 0; j < length; ++j) { // calculate the ith row
      innerRow = innerRow && board[i*length+j] == cSymbol;
    }
    row = row || innerRow;
  }
  if (row) 
  { 
    // somebody won...
  } 
} 
于 2012-04-30T17:58:52.413 回答
1

你不能硬编码你的检查条件。您将必须有3单独的案例:

  1. 检查行
  2. 检查列
  3. 检查对角线

0在从到N(游戏大小)的所有情况下,您都可以使用简单的循环。我会说,跟踪正在填充的当前单元格。说是x,y。现在使用这个坐标并检查那个特定的rowcolumn。如果x == y然后它在前对角线上,那么你检查它。同样检查反向对角线。

于 2012-04-30T17:59:13.473 回答
0

如果你不想硬编码,你应该实现一些搜索获胜位置等的算法。看看http://www.codeproject.com/Articles/43622/Solve-Tic-Tac-Toe-with-以-MiniMax-算法为例。

于 2012-04-30T18:13:27.290 回答