【问题标题】:How I do check_game_state method in tictactoe game?我如何在 tictactoe 游戏中执行 check_game_state 方法?
【发布时间】:2012-04-30 17:55:05
【问题描述】:

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

例如,我为 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 或更高的板动态设置它。但是我该怎么做呢?有可能吗?

【问题讨论】:

  • android 中的一个中期项目 :) 我用 minimax alg 做静态的 3*3

标签: java tic-tac-toe


【解决方案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 的平方根相同,您需要从数组长度计算此值或将其与数组本身一起传递给函数

仅当所有元素都等于cSymbol 时,这会将test 设置为true,否则设置false

更新:我给你行的计算;您需要在 columns(提示:计算索引 i+j*length)、main dialonal(索引:i*length+i)和 sub-diagonal(索引:i*length+(length-1-i))。索引i*length + j 转换为ith 行,jth 列:

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

【讨论】:

  • 所有代码都可以工作吗?我的意思是我想在我的问题中做同样的事情,但我把它写成静态的。我想动态。编辑 check_game_state() 方法,使其成为动态的。谢谢
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • { 0, 1, 2 }, { 3, 4, 5 }, { 6, 7, 8 }, { 0, 3, 6 }, { 1, 4, 7 }, { 2 , 5, 8 }, { 0, 4, 8 }, { 2, 4, 6 } 也是静态的 };
    • 不理解您的反对意见。静态数据和静态逻辑是有区别的。一件事是你静态地定义了一些东西——例如一块板。但另一件事是您对 IF 语句进行硬编码 - 这是糟糕的代码。但是静态 INITIAL 数据是可以的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多