我正在開發井字棋遊戲,我需要算法來檢查遊戲何時結束(以及誰贏了)。 在3x3遊戲中,我會檢查每個可能的贏局面(有8個能力)。但是在7x7中(需要連續4個符號或者對角線)是很多可能的贏球模式。如何在井字遊戲中確定遊戲結束?
回答
雖然一個非常基本的方法是從每個單元格看所有方向的運行,但是這裏有一種方法只能在單個「行」中檢查一次單元。 A「線」是一個行,列,或對角線,可以有可能獲得,就象是在拉斯維加斯投幣機:)
- 對於每一「行」,移動到開始該「線」和;
- 集計數器爲0。
- 對於在「線」的每個小區(遍歷順序的行):
- 如果單元P1和計數器是> = 0,添加一個對抗
- 如果計數器= 4,則P1獲勝。
- 如果單元P1和計數器是否定的,計數器設置爲0
- 如果單元P2和計數器是< = 0,減一計數器
- 如果計數器= -4然後P2勝
- 如果單元P2和計數器是正數,計數器設置爲0
- 如果單元P1和計數器是> = 0,添加一個對抗
重要編輯:如果單元不包含P1或P2,請將計數器重置爲0(doh!)。我省略了這個微不足道的步驟。否則「11-11」將被視爲勝利。給定起始點和每次迭代的行/列偏移(例如從(0,0)開始並且對於從NW到SE的最長對角線提前(1,1)),可以遍歷「線」。當然,長度小於4的對角線可以避免被完全檢查。
快樂編碼。
儘管所有的位置循環。對於每個位置,請檢查右下角和右下角的四個字段(始終包含字段本身)。進行適當的檢查以避免在檢查不存在的字段時炸燬應用程序。
一種方法是在檢查過程中使用遞歸「從」移動起始位置。 – 2011-08-12 18:37:05
簡單。使4 for
循環,所有行,列,增加對角線,減少對角線。 在每個中,測試是否有連續4個部分。
如果您對每個玩家使用bitboard,則可以使用位移操作來測試棋盤獲勝。
的棋盤將具有以下結構:
6 14 22 30 38 46 54
5 13 21 29 37 45 53
4 12 20 28 36 44 52
3 11 19 27 35 43 51
2 10 18 26 34 42 50
1 9 17 25 33 41 49
0 8 16 24 32 40 48
如果玩家佔據了遊戲板的位置,則相關聯的位將是1
否則0
(注意,位7,圖15,23,.. 。是0
)。要檢查的玩家獲勝板,你可以使用以下功能:
bool haswon(int64_t board)
{
int64_t y = board & (board >> 7);
if (y & (y >> 2 * 7)) // check \ diagonal
return true;
y = board & (board >> 8);
if (y & (y >> 2 * 8)) // check horizontal -
return true;
y = board & (board >> 9);
if (y & (y >> 2 * 9)) // check/diagonal
return true;
y = board & (board >> 1);
if (y & (y >> 2)) // check vertical |
return true;
return false;
}
有了一個例子的幫助,我會盡量解釋:一個球員的下面棋盤包括垂直旁邊,斜贏得了獲勝組合第一行。
0101010
1110111
0111011
1101110
0001000
1010101
0011110 ... four occupied positions --> winning board
爲水平檢驗的步驟是:
y = board & (board >> 8)
0101010 0010101 0000000 1110111 0111011 0110011 0111011 0011101 0011001 1101110 & 0110111 = 0100110 0001000 0000100 0000000 1010101 0101010 0000000 0011110 0001111 0001110
y & (y >> 2 * 8)
0000000 0000000 0000000 0110011 0001100 0000000 0011001 0000110 0000000 0100110 & 0001001 = 0000000 0000000 0000000 0000000 0000000 0000000 0000000 0001110 0000011 0000010
水平檢查結果在一個板具有一個位設置,這意味着板包括一個勝利和函數返回true
。
我已經使用similar function檢查connect four比賽獲勝。我在John Tromp的The Fhourstones Benchmark來源中看到了這個迷人的功能。
Boggles my mind,+1 – 2011-08-13 01:41:49
你不是在爲y做一個'(行>> 1)'嗎?因爲'0011110 == 30'和'30 >> 8 == 0'。鑑於'30 >> 1 == 15 == 0001111' – naeg
@naeg:實際上整個棋盤都被移動了,爲了讓一個棋子移動一位,整個棋盤需要被移動8.因此,我編輯了這個棋子,因爲'row '是誤導。 –
- 1. Java - 井字遊戲Swing遊戲 - 錯誤
- 2. 井字遊戲Java
- 3. C++井字遊戲
- 4. 井字遊戲java
- 5. 確定平局的井字遊戲
- 6. Python - OOP井字遊戲
- 7. 井字遊戲 - 生成解
- 8. Java井字遊戲架構
- 9. 如何實現井字遊戲
- 10. 在井字遊戲中實施Minimax Algo
- 11. 在PentaHex遊戲中結束遊戲檢查
- 12. Python的井字遊戲界面遊戲崩潰時,領帶
- 13. 井字遊戲(爪哇):找到一個平局遊戲
- 14. 井字遊戲。每當最後一行填滿時結束?
- 15. 顯示板在井字遊戲
- 16. 安卓井字遊戲中獎條件
- 17. 井字遊戲中的EXC_BAD_INSTRUCTION錯誤
- 18. 井字棋遊戲中的錯誤
- 19. AS3 hitTestObject結束遊戲
- 20. CCActionDelay結束遊戲序列
- 21. 結束我的RPS遊戲?
- 22. 遊戲不結束在java岩石紙剪刀遊戲
- 23. 確定井字遊戲中的獲勝者
- 24. 如何引用井字遊戲邏輯的JButtons對象(Java中的井字遊戲)
- 25. jquery功能錯誤 - 井字遊戲
- 26. 用Minimax和Javascript的井字遊戲
- 27. 井字遊戲的極大極小
- 28. 實現井字遊戲的算法?
- 29. 錯誤井字遊戲的Python代碼
- 30. 製作井字遊戲的域模型
java示例,note gameover()[鏈接](http://www.dreamincode.net/code/snippet1414.htm) – mbowles
@mbowles這僅適用於井字遊戲。它在N行中失敗。 – 2011-08-12 19:17:41