我怎么做tictactoe游戏中的check_game_state方法?

时间:2012-04-30 17:55:05

标签: java tic-tac-toe

我想了解游戏是完成还是绘制还是可以玩。但我想用动态代码来做。

例如,我为这样的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或更高的电路板。但是我怎么能这样做呢?有可能吗?

3 个答案:

答案 0 :(得分: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的平方根相同你需要从数组长度计算这个或者将它传递给函数使用数组本身

只有当所有元素都等于testcSymbol时才会将false设置为true。

更新:我给你计算行数;您需要将此通过(提示:计算索引i+j*length),主拨号(索引:i*length+i)和次对角(索引:i*length+(length-1-i))。索引i*length + j转换为i行,j列:

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...
  } 
} 

答案 1 :(得分:1)

您无法对检查条件进行硬编码。您必须有3个单独的案例:

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

答案 2 :(得分:0)

如果您不想对其进行硬编码,则应实施一些搜索获胜位置的算法等。例如,请查看http://www.codeproject.com/Articles/43622/Solve-Tic-Tac-Toe-with-the-MiniMax-algorithm