位棋盤表示法中車和炮的著法生成

2021-09-06 06:05:24 字數 4007 閱讀 6914

這裡沒有採用magic bitboard技術,採用了4個方向掃瞄最高1位或最低1位的辦法,效率雖然比magic bitboard低一點,但**還是比較容易理解的。

occupied

attacks = preset_ray_north[frompos];

blockers = attacks & occupied;

4010

010110

abcdefghi

001000000

001000000

001000000

001000000

001000000

001000000

001000000

000000000

abcdefghi

001000000

000000000

abcdefghi

乙個位棋盤,1表示有棋子佔據,0表示無棋子。這裡的frompos是c2位置。

c2格仔的正北面的格仔都可以攻擊到

blockingpos = blockers.getlowestbit( ); 此例中表示c5格阻礙了車的前進

preset_ray_north[blockingpos]

attacks ^= preset_ray_north[blockingpos];

001000000

001000000

001000000

001000000

000000000

abcdefghi

001000000

001000000

001000000

000000000

abcdefghi

上面一系列的位運算處理了正北方可以攻擊到的位置,同理再處理東面、南面和西面的情況,就可以得到所有可以攻擊到的格仔的位棋盤

c5格正北方的格仔

異或後,正好就是位於c2格仔的車向北方前進時可以攻擊到的所有位置的位棋盤

1

/*! 車的著法生成

2* \param frompos 出發位置

3* \param occupied 棋子佔據情況的位棋盤

4* \return 可到達位置組成乙個位棋盤 5*/

6 bitboard movegenerator::rookattacks( int

frompos, bitboard occupied ) 7

2021

22     // 向東掃瞄

23 partattacks =preset_ray_east[frompos];

24 blockers = partattacks &occupied;

25if ( blockers.h |blockers.l) 26

30 attacks |=partattacks;

3132     // 向南掃瞄

33 partattacks =preset_ray_south[frompos];

34 blockers = partattacks &occupied;

35if ( blockers.h |blockers.l) 36

40 attacks |=partattacks;

4142     // 向西掃瞄

43 partattacks =preset_ray_west[frompos];

44 blockers = partattacks &occupied;

45if ( blockers.h |blockers.l) 46

5051

return attacks |partattacks;

52 }

炮的著法生成可以類似的處理,但要處理吃子的情況。

occupied

attacks = preset_ray_north[frompos];

blockers = attacks & occupied;

4010

010110

abcdefghi

001000000

001000000

001000000

001000000

001000000

001000000

001000000

000000000

abcdefghi

000000000

000000000

abcdefghi

乙個位棋盤,1表示有棋子佔據,0表示無棋子。這裡的frompos是c2位置。

c2格仔的正北面的格仔都可以走到

blockingpos = blockers.getlowestbitwithreset( ); 此例中表示c5格阻礙了炮的前進,同時要把此位置0

preset_ray_north_self[blockingpos]

attacks ^= preset_ray_north

_self[blockingpos];

如果有吃子的話

eatpos = blockers.getlowestbit( );

此例中為c7。

attacks.setbit(eatpos);

001000000

001000000

001000000

001000000

001000000

abcdefghi

000000000

001000000

001000000

000000000

abcdefghi

001000000

001000000

001000000

000000000

abcdefghi

上面一系列的位運算處理了正北方可以移動到或攻擊到的位置,同理再處理東面、南面和西面的情況,就可以得到所有可以生成所有著法。

c5正北方的格仔,包括c5位置

異或後,正好就是位於c2格仔的炮向北方前進時可以移動到的所有位置的位棋盤

1 attacks =preset_ray_north[frompos]; 

2 blockers = attacks &occupied;

3if ( blockers.h |blockers.l) 4

11}

1213 partattacks =preset_ray_east[frompos];

14 blockers = partattacks &occupied;

15if ( blockers.h |blockers.l) 16

23}

24 attacks |=partattacks;

2526 partattacks =preset_ray_south[frompos];

27 blockers = partattacks &occupied;

28if ( blockers.h |blockers.l) 29

36}

37 attacks |=partattacks;

3839

40 partattacks =preset_ray_west[frompos];

41 blockers = partattacks &occupied;

42if ( blockers.h |blockers.l) 43

50}

5152

return attacks | partattacks;

uml中關係表示法

1 關聯關係 association 關聯關係用一條直線表示,如a b。它描述不同類之間的結構關係,在一定的時間內將多個類聯絡在一起。關聯關係時一種靜態關係,通常與執行狀態無關,而是有一種強關聯的關係聯絡在一起,如公民和身份證之間是一對一的關係。和依賴關係不同的是依賴關係往往是一種臨時的 動態關係。...

定義字串中陣列表示法和指標表示法的區別

以下分別為陣列表示法和指標表示法宣告的字串 const char pt something is pointing at me.指標表示法 char ar something is pointing at me.陣列表示法 初始化陣列是把靜態儲存區的字串拷貝到陣列中,而初始化指標只是把字串的位址拷貝...

Python中引數多個值的表示法

今天在寫python指令碼時,呼叫了資料管理 製圖綜合 融合工具,在arcgis裡操作的引數設定如下 如果融合字段只有乙個那好辦,如果融合欄位有多個我該怎麼表達,檢視幫助文件中的示例 明白了 所以,我這裡獲取所有字段,剔除不需要的fid objectid shape hape length和shap...