一步一步实现五子棋5
? ? ? ? 前面弱智版五子棋雖然實現了讓電腦下棋,但是完全沒有思考能力。下面我們就來為電腦提升智力,學會思考后再下棋。
? ? ? ? 計算機的思考能力體現在對盤面的分析上,通過分析可能形成的盤面,從中選擇最優結果,形成這個最優結果的著法即為計算機本次的選擇。盤面分析的過程就是查找能形成五連珠的棋形,每種棋形賦予一定的分數,分數最高的盤面即為最佳盤面。下面是我總結的一些基本棋形(X表示黑子O表示白子-表示空格:
? ? ? ? 成五:XXXXX,形成這種棋形時即可分出勝負,賦予極高值。
? ? ? ? 活四:-XXXX-、X-XXX-X,這種棋形一旦形成,將無法防守,先手必勝,后手除了對方立刻成五也必勝。
? ? ? ? 沖四:OXXXX- 、OXXX-X、OXX-XX,這種棋形形成,先手必勝,后手對方必須防守。
? ? ? ? 活三:-XXX-、-X-XX-,這種棋形形成后,先手可成活四,后手對方必須防守,除非對方已經有活四、沖四等棋形,否者必勝。
? ? ? ? 沖三:OXXX--、OXX-X-、OX-XX-,這種棋形可先手成沖四,雖然不是能立即獲勝的棋形,但一次或多次沖四后極可能形成良好的局面。
活二:--XX--、--X-X--,這種棋形是獲勝的開始,有贏棋始于活二的說法,活二對后續的發展非常關鍵。
? ? ? ? 后面還有沖二,活一等棋形,這里就不一一介紹了。對這些棋形賦予恰當的分數,可更加真實的反應出盤面的優劣。
? ? ? ? 用戶落子后,每次都掃面整個棋盤,這樣的效率顯得比較低。事實上,新落子只會影響該點在棋盤上四個方向上的價值。因此我們可以將棋盤按照橫、縱、斜、反斜向的線用下面的結構體表示:
? ? ? ? struct CHESS_LINE ? ? ? ? {
? ? ? ? ? ? ? ?int point[15]; ?
? ? ? ? ? ? ? ?int mode[2][CHESS_MODE_NUM];
? ? ? ? };
? ? ? ? 數組point[15]用來存儲每條線上的棋子情況,二維數組mode用來存儲黑棋和白棋在該條線上的特定棋形的數量。每次落子或者回退后時,重新分析該點所在的四條線上的棋形。在分析盤面時,只需要統計棋盤上所有線上的棋形形成的分數后即可。
? ? ? ? 電腦在選擇下一個落子點時,先遍歷每一個有效的落子點,模擬落子后分析棋盤的價值。選擇所有可能落子中棋盤分數最高的點,該點就是電腦選擇的點。
? ? ? ?void Engine::Thinking()
? ? ? ?{
? ? ? ? ? ? ? ?map<int, CHESS_POINT*> spaceList;
? ? ? ? ? ? ? ?GetSpaceList(spaceList);
? ? ? ? ? ? ? ?int size = spaceList.size();
? ? ? ? ? ? ? ?if (size == 0)
? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ?? ? ? ? return;
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?map<int, CHESS_POINT*>::iterator itor = spaceList.begin();
? ? ? ? ? ? ? ?CHESS_POINT *bestPoint = NULL;
? ? ? ? ? ? ? ?int bestValue = -100000000;
? ? ? ? ? ? ? ?int tempValue = 0;
? ? ? ? ? ? ? ?while(itor != spaceList.end())
? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ?? ? ? ? AddChess(itor->second->x, itor->second->y, m_AIType);
? ? ? ? ? ? ? ? ? ? ? ?tempValue = CalculateStore(m_userType);
? ? ? ? ? ? ? ? ? ? ? ?if (tempValue > bestValue)
? ? ? ? ? ? ? ? ? ? ? ?{
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?bestValue = tempValue;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?bestPoint = (itor->second);
? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ?RemoveChess(itor->second->x, itor->second->y);
? ? ? ? ? ? ? ? ? ? ? ?itor++;
? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ?AIDown(bestPoint->x, bestPoint->y);
? ? ? ? }
? ? ? ? AddChess和RemoveChess分別是分析落子點和回退點影響的線上的價值,CalculateStore即統計整個盤面的價值。由于代碼量較大,就不一一貼出來了。這樣一個簡單的AI就做好了。多的不說了,線看看效果吧。
? ? ? ??
? ? ? ? 看,是不是下的有模有樣了,一不小心還被它贏了一盤。不過基本版的五子棋智力還是非常有限的,想讓它更聰明,就需要引入博弈算法,進行深度思考了。
總結
以上是生活随笔為你收集整理的一步一步实现五子棋5的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做跨境电商的绕不开亚马逊的原因你知道吗
- 下一篇: 2022世界人工智能大会开幕,天翼云注智