2012-04-30 42 views
2

我想了解游戏是完成还是绘制或仍然可玩。但我想用动态代码来做到这一点。我如何在tictactoe游戏中做check_game_state方法?

例如我做静态3 * 3井字游戏这样的:

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或更高板。但我该怎么做呢?可能吗?

+2

这个家庭作业? – Jivings

+0

在android中期项目的一小块:)我做它静态3 * 3与minimax alg –

回答

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),主要dialonal(索引: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... 
    } 
} 
+0

,但它是动态的5 * 5 - 6 * 6 - 7 * 7 ... –

+0

查看更新的答案 – Attila

+0

它是工作所有的代码?我的意思是我想在我的问题中同样的事情,但我把它写成静态的。我想幽默。编辑check_game_state()方法,使其成为动态的。谢谢 –

1

然后,您可以不硬代码的检查条件。你必须有3独立情况:

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

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

0

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

+0

{0,1,2},{3,4,5}, {6,7,8},{0,3,6}, {1,4,7}, {2,5,8}, {0,4,8},{2,4,6}它也是静态的 }; –

+1

不理解你的投票。静态数据和静态逻辑是有区别的。有一件事是你静态定义一些东西 - 例如一块板子。但另一件事是你硬编码IF语句 - 这是糟糕的代码。但静态INITIAL数据是确定的。 –

相关问题