2015-07-11 102 views
1

在我的國際象棋引擎,使用位棋盤爲代表的董事會的狀態的棋盤個人移動,產生一氣呵成的假冒合法移動一大塊,一個棋盤是結果。例如:生成從移動

走卒:

Pawns' statePawns' state - bitboard

小棋盤魔術後來:

Pawns' positionsPawns' positions - bitboard

在端部的棋盤是一個簡單的可能的移動塊。引擎如何通常採用這種棋盤,並從中產生個人動作?我是否必須迭代每一位以檢查它是否已設置?迭代一個棋盤似乎藐視使用位面板的目的,這就是爲什麼我有點懷疑。

有沒有更好的方法?

回答

2

然後,通常在應用minimax算法來評估移動有多好,是一些變種,所以你可以選擇(你估計什麼是)最好的舉措。一個簡單的變體是,例如,alpha-beta

這些變體主要處理試圖引導搜索朝向「可能有用的移動」,並且遠離搜索空間的無用區域,因爲搜索樹非常廣泛,並且您深入探索它的能力對於一個好的國際象棋AI--探索它淺顯易懂讓人工智能很容易陷入困境,因爲它會使短期看起來很不錯的選擇,即使它們以後出現不好的情況。

所以是的,你會遍歷的位板。這並沒有違揹他們的目的 - 你仍然(可能)計算的動作比沒有使用位板快得多。對於最簡單的AI,你可以採用標準的棋盤技巧進行「第一次」移動,但是像這樣玩的AI會低於新手級別,根本不考慮輸贏。

2

您不必遍歷64個單個位。您可以準備/預先定義例如具有所有可能的移動列表的256大小查找陣列,其中8位索引代表單個隊列中的一個棋子的攻擊集。然後,可以按位移動操作(bitboard >> 8)只迭代8次,以將後續的秩攻擊集作爲數組的索引並提取移動列表。與一位步進循環相比,它將加速大約8倍。也許你應該增強這個陣列到[8][256]實際上也要傳遞一個等級號碼本身並根據你的需要提取一個最終的移動列表(用x,y座標)。記憶成本依然微不足道。

+0

相關:https://github.com/ServerTech/cortex/blob/master/src/lookup_tables.cc –