📄 数据结构——旋转的位棋盘.htm
字号:
<DD>}
<DT>
<DT> 索引 <FONT face="Times New Roman">diag_A8H1_attacks[64][256] </FONT>数组。
<DT> 不说你也应该知道,第一个索引号是象所在格的编号。第二个索引号是它所在<FONT
face="Times New Roman">A8->H1</FONT>方向斜线上的棋子分布情况。没错,接下去又要旋转位棋盘,位移,最后用“逻辑与”分离出我们需要的东东。为了对齐
<FONT face="Times New Roman">A8->H1 </FONT>斜线上的格子,我们要把棋盘左转<FONT
face="Times New Roman">45</FONT>度。<FONT
face="Times New Roman">(</FONT>现在我建议你去拿罐可乐,外加一些提神的药物……<FONT
face="Times New Roman">)</FONT>
<DD>
<DD>int r45L_map[64] = {
<DD> 28, 21, 15, 10, 6, 3, 1, 0,
<DD> 36, 29, 22, 16, 11, 7, 4, 2,
<DD> 43, 37, 30, 23, 17, 12, 8, 5,
<DD> 49, 44, 38, 31, 24, 18, 13, 9,
<DD> 54, 50, 45, 39, 32, 25, 19, 14,
<DD> 58, 55, 51, 46, 40, 33, 26, 20,
<DD> 61, 59, 56, 52, 47, 41, 34, 27,
<DD> 63, 62, 60, 57, 53, 48, 42, 35
<DD>};
<DT>
<DT> 注意每个格子的映射次序,是从右上往左下的。这样映射后的位棋盘就会沿着<FONT
face="Times New Roman">A8-H1</FONT>斜线对齐了<FONT
face="Times New Roman">(</FONT>所有的斜线都是沿着这个方向走的<FONT
face="Times New Roman">)</FONT>。
<DT>
<DD>BitBoard Rotated45L = 0;
<DD>for (棋盘上的每一格)(0-63) {
<DD> if square is not empty
<DD> otated45L |= mask[r45L_map[square]];
<DD>}
<DT>
<DT> 现在“右移”这个棋盘,但是移动几位呢? </DT></DL>
<TABLE width="100%" border=0>
<TBODY>
<TR>
<TD>
<P align=center>需要右移的位数</P></TD></TR>
<TR>
<TD align=middle>
<TABLE border=1>
<TBODY>
<TR>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>28</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>21</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>15</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>10</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>6</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>3</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>1</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>0</STRONG></FONT></TD></TR>
<TR>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>36</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>28</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>21</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>15</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>10</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>6</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>3</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>1</STRONG></FONT></TD></TR>
<TR>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>43</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>36</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>28</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>21</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>15</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>10</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>6</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>3</STRONG></FONT></TD></TR>
<TR>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>49</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>43</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>36</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>28</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>21</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>15</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>10</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>6</STRONG></FONT></TD></TR>
<TR>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>54</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>49</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>43</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>36</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>28</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>21</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>15</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>10</STRONG></FONT></TD></TR>
<TR>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>58</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>54</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>49</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>43</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>36</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>28</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>21</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>15</STRONG></FONT></TD></TR>
<TR>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>61</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>58</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>54</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>49</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>43</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>36</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>28</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>21</STRONG></FONT></TD></TR>
<TR>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>63</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>61</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>58</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>54</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>49</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>43</STRONG></FONT></TD>
<TD align=middle bgColor=#000000><FONT face="Times New Roman"
color=#ffffff><STRONG>36</STRONG></FONT></TD>
<TD align=middle bgColor=#ffffff><FONT
face="Times New Roman"><STRONG>28</STRONG></FONT></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<DL>
<DT> 位移完成后,最后一步就是用“屏蔽模版”将需要的数据分离出来。“屏蔽模版”根据斜线的长度不同而变化。
<DT>
<DD>Mask_Length = (2 ^ diag_length) - 1;
<DT>
<DT> 按照这个公式,当斜线的长度为<FONT face="Times New Roman">7</FONT>时,屏蔽模版等于<FONT
face="Times New Roman">127(</FONT>二进制:<FONT
face="Times New Roman">1111111b</FONT>)。如果斜线的长度为<FONT
face="Times New Roman">1</FONT>时屏蔽模版也为<FONT
face="Times New Roman">1</FONT>。在程序中你可以用这个公式,但是使用查询表会更快一些。
<DT>
<DT> 索引 <FONT face="Times New Roman">diag_H8A1_attacks[64][256] </FONT>数组。
<DT> 为了对齐<FONT face="Times New Roman">H8->A1</FONT>方向的斜线,我们要把棋盘向右旋转<FONT
face="Times New Roman">45</FONT>度。(再来一杯可乐?)
<DT>
<DD>int r45R_map[64] = {
<DD> 0, 1, 3, 6, 10, 15, 21, 28,
<DD> 2, 4, 7, 11, 16, 22, 29, 36,
<DD> 5, 8, 12, 17, 23, 30, 37, 43,
<DD> 9, 13, 18, 24, 31, 38, 44, 49,
<DD> 14, 19, 25, 32, 39, 45, 50, 54,
<DD> 20, 26, 33, 40, 46, 51, 55, 58,
<DD> 27, 34, 41, 47, 52, 56, 59, 61,
<DD> 35, 42, 48, 53, 57, 60, 62, 63
<DD>};
<DD>BitBoard Rotated45R = 0;
<DD>for (棋盘上的每一格)(0-63) {
<DD> if square is not empty
<DD> Rotated45R |= mask[r45R_map[square]];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -