確定Tic Tac Toe游戲的算法我在Java中編寫了一個井字游戲,我目前確定游戲結束的方法解釋了游戲結束的以下可能情況:董事會已經滿員,尚未宣布獲勝者:比賽是平局。克羅斯贏了。Circle贏了。不幸的是,為了做到這一點,它從表中讀取了一組預定義的這些場景。考慮到電路板上只有9個空格,這并不一定是壞的,因此表格有點小,但有沒有更好的算法來確定游戲是否結束?確定某人是否贏了是問題的關鍵,因為檢查9個空格是否已滿是微不足道的。表方法可能是解決方案,但如果沒有,那是什么?另外,如果電路板尺寸不大n=9怎么辦?如果它是一個更大的板,比如n=16,n=25等,造成連續放置物品的數量取勝是x=4,x=5等?一種用于所有人的通用算法n = { 9, 16, 25, 36 ... }?
3 回答

牧羊人nacy
TA貢獻1862條經驗 獲得超7個贊
您知道獲勝的移動只能在X或O進行最近移動之后發生,因此您只能搜索包含在該移動中的可選診斷的行/列,以在嘗試確定獲勝板時限制搜索空間。此外,由于在最后一次移動中,如果它不是一個獲勝的移動,那么在平局游戲中存在固定數量的移動它默認為抽獎游戲。
編輯:此代碼用于n個n板,連續n個贏(3x3板請求連續3個,等等)
編輯:添加代碼來檢查反診斷,我無法找出一個非循環的方式來確定該點是否在反診斷,這就是為什么這一步缺失
public class TripleT { enum State{Blank, X, O}; int n = 3; State[][] board = new State[n][n]; int moveCount; void Move(int x, int y, State s){ if(board[x][y] == State.Blank){ board[x][y] = s; } moveCount++; //check end conditions //check col for(int i = 0; i < n; i++){ if(board[x][i] != s) break; if(i == n-1){ //report win for s } } //check row for(int i = 0; i < n; i++){ if(board[i][y] != s) break; if(i == n-1){ //report win for s } } //check diag if(x == y){ //we're on a diagonal for(int i = 0; i < n; i++){ if(board[i][i] != s) break; if(i == n-1){ //report win for s } } } //check anti diag (thanks rampion) if(x + y == n - 1){ for(int i = 0; i < n; i++){ if(board[i][(n-1)-i] != s) break; if(i == n-1){ //report win for s } } } //check draw if(moveCount == (Math.pow(n, 2) - 1)){ //report draw } }}
添加回答
舉報
0/150
提交
取消