人機博弈,吃子棋遊戲(一)基本介紹,人機
(1)什麼是吃子棋?
吃子棋,是小孩子學圍棋的入門棋,其規則部分取自於圍棋,但比圍棋簡單很多。
(2)吃子棋的行棋規則?
1.吃子棋,在行棋時,若一方棋子沒有被打吃,則其必須落子在能夠緊對方棋子氣的位置。
2.吃子棋,當一方棋子處於被打吃的狀態,則可以逃命,而不用緊對方棋子的氣。
3.吃子棋,當一方棋子被吃提,則輸贏即分,吃子方勝。
4.吃子棋,一般有兩種贏棋方式,雙打吃和征吃。
5.吃子棋,起手棋必須位於天元。
(3)應用設計思路
設計此應用的總體思路如下:
DATA:
1.棋盤表示
2.棋子表示
3.計算棋子棋的輔助資料
AI:
1:走法產生(依據行棋規則,產生走法)
2:估值核心(暫時的思路是對雙方一氣,兩氣棋竄進行分析統計,並對雙打吃與征吃進行特別處理)
3:優秀走法搜尋引擎(暫時僅使用極窄視窗搜尋,一種最佳化過的alpha-beta搜尋)
UI:
cocos2d-x 3.2
繪製棋盤,棋子,開始介面,背景等。
(4)吃子棋AI
鑒於吃子棋的規則,在做AI時,也容易許多。題外話,目前現在圍棋的AI多為雙重隨機-蒙特卡羅演算法之類吧,有興趣讀者可以研究下。
1.走法產生:
走法的產生會相對容易很多,因為吃子棋大多數情況下,每一步都要緊對方的氣,而少數情況只能長氣逃命,因此前中期合理走法很少,而遊戲很少發展至後期。
2.估值核心:
對於棋面的判斷也相對容易,不需要考慮地區與勢等抽象概念,這些抽象的概念連當下電腦科學家都沒有找到比較好的解決辦法。但這一部分要測試非常難,要微調很多參數,感知棋力變化。對於未發生提子的葉子結點,判斷形勢與輸贏。1.輪到我下,對方存在一個一氣的棋竄,則我勝利。2.輪到我下,對方不存在一個一氣的棋竄,而我有兩個一氣的棋竄,則我失敗。3.輪到我下,敵方不存在一氣的棋竄,若我沒有1氣的竄,對方可有兩氣棋竄,若有開始考慮,雙打吃與征吃的可能。4.同三情況考慮自己,我方僅存在一個一氣竄,則考慮是否被征吃,以及雙打吃。5.都沒有出現,考慮一些其他的額外參數。
3.搜尋引擎:PVS,如果有效能需求考慮使用置換表。
寫在最後:
我曾兼職圍棋入門班的助教,深知陪著4,5歲小孩子下圍棋是一件很頭大的事,因為他們下棋時經常會哭鼻子鬧脾氣刷淘氣。孩子們剛入門時下得是吃子棋,下課回家都是家長陪著下,同樣無論輸贏都是一件頭大的事,但是家長們都說孩子和電腦對戰不會哭鼻子鬧脾氣耍淘氣。
於是,我上網搜尋有沒有吃子棋對戰軟體,使家長脫離苦海,也使孩子能夠專心下棋而不是哭鼻子鬧脾氣耍淘氣,但未找到,可能是需求過少的緣故,一般孩子們下一周的吃子棋就可以下真正的圍棋了。
目前,本人正在用業餘時間,研發此遊戲。歡迎和廣大圍棋愛好者,吃子棋愛好者多多交流。
轉載請標明出處,謝謝
我要做一個五子棋遊戲,要可以人機對弈,問一下難度有多大提供一下資料
看你要想人機對弈的機器的“智商”有多高了,如果和“快樂五子棋”一個層級的難度的話,應該不難。和做一個很小的資料庫管理軟體差不多。
一個人機博弈五子棋遊戲程式 我的要比較苛刻 看問題補充
五子棋的AI(I)
點擊數:2262 發布日期:2005-8-7 11:02:00
【收藏】 【評論】 【列印】 【編程愛好者論壇】 【關閉】
“五子棋”軟體設計報告
杭州電子科技大學 胡峰令
在本次“五子棋“程式的編寫中,只編寫了人機對弈部分,運用了博弈樹進行搜尋,在選取最優的走步時使用極大極小分析法,考慮到搜尋的時間複雜度和空間複雜度,在程式中只進行了2步搜尋,即電腦在考慮下一步的走法時,只對玩家進行一步的推測。(程式中的棋盤規格為15*15)
下面對具體做法進行描述:
1. 資料結構定義:
棋盤定義:int board[15][15];
在15*15的棋盤上,獲勝的情況總共有572種,
如:
* * * * * ……
…… …… …… …… …… ……
…… …… …… …… …… ……
…… …… …… …… …… ……
…… …… …… …… …… ……
…… …… …… …… …… ……
中的第一行“*“所代表的格子就是一種獲勝組合。
電腦和玩家的獲勝組合情況bool ctable[15][15][572],
bool ptable[15][15][572],來表示棋盤上的各個位置都在那種獲勝組合中。
電腦和玩家在各個獲勝組合中所填入的棋子數int win[2][572],如有一方在某一獲勝組合的棋子數達到5個,該方即獲勝。
Bool player:是否輪到玩家下棋
Bool computer:是否輪到電腦下棋
Bool start:遊戲是否開始
Bool pwin:玩家是否獲勝
Bool cwin:電腦是否獲勝
CPoint m_pplastpos;//玩家走的前一步棋
CPoint m_pclastpos;//電腦走的前一步棋
為便於說明程式的主要演算法,這裡先說本程式中估價函數的選取方法:
e=p1+p2;
p1為下完當前這步棋時電腦的得分;p2為下完當前這步棋時玩家的得分(p2其實為負),這樣做即考慮了進攻的因數,由考慮了防守的因數,兩個方面都進行了考慮,防止電腦只考慮進攻而忽略防守,同時也防止電腦只考慮防守而忽略進攻,從而達到比較好的情況。
2.主要流程描述
其程式流程圖如下:
(1) 初始化棋盤:判斷哪方先開始,(2) 初始化電腦和玩家的獲勝組合情況
bool ctable[15][15][572],bool ptable[15][15][572]
void CMyChessDlg::InitializeBoard()
{
//初始時雙方都還沒下子
int i,j,count=0,k;
m_pclastpos.x=-1;
m_pclastpos.y=-1;
m_pplastpos.x=-1;
m_pplastpos.y=-1;
start=true;
//判斷哪方先開始
if(m_bwfirst)
{
player=false;
computer=true;
}
else
{
player=true;
computer=false;
......餘下全文>>