我想了解游戏是完成还是绘制还是可以玩。但我想用动态代码来做。
例如,我为这样的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或更高的电路板。但是我怎么能这样做呢?有可能吗?
答案 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
的平方根相同你需要从数组长度计算这个或者将它传递给函数使用数组本身
只有当所有元素都等于test
,cSymbol
时才会将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
个单独的案例:
您可以在从0
到N
(游戏大小)的所有情况下使用简单循环。我会说,跟踪当前正在填充的单元格。说那是x,y
。现在使用此坐标并检查特定row
和column
。如果x == y
然后它在前方对角线上,那么你要检查它。同样检查反向对角线。
答案 2 :(得分:0)
如果您不想对其进行硬编码,则应实施一些搜索获胜位置的算法等。例如,请查看http://www.codeproject.com/Articles/43622/Solve-Tic-Tac-Toe-with-the-MiniMax-algorithm。