当前位置: 首页 > 知识库问答 >
问题:

剪切位板中的边

韦睿
2023-03-14

我正在使用比特板为Rook、Bishop和Queen生成攻击表。在我研究魔法比特板的过程中,似乎我需要剪掉所有攻击表的边缘。我将我的比特板存储在一个长的存储区中,正方形a1是LSB,正方形h8是MSB,一行一行地移动。下面是一个广场c2上一辆车的攻击表示例:

[0, 0, 1, 0, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0]
[1, 1, 0, 1, 1, 1, 1, 1]
[0, 0, 1, 0, 0, 0, 0, 0]

我的问题是,我需要让所有的在位板的边缘0。起初我尝试

[0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 1, 1, 1, 1, 1, 0]
[0, 1, 1, 1, 1, 1, 1, 0]
[0, 1, 1, 1, 1, 1, 1, 0]
[0, 1, 1, 1, 1, 1, 1, 0]
[0, 1, 1, 1, 1, 1, 1, 0]
[0, 1, 1, 1, 1, 1, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 0]

现在,这适用于中心的大多数正方形,但对于边缘的攻击表,它会错误地将其剪辑。所以对于h8上的一辆车:

初始攻击表:

[1, 1, 1, 1, 1, 1, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 1]

预期成果:

[0, 1, 1, 1, 1, 1, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 0]

实际结果:

[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]

我应该如何处理它,以便它只剪辑每个攻击射线的末端?我意识到我的位逻辑是关闭的。谢谢。

共有1个答案

白嘉石
2023-03-14

使用动态生成的掩码,而不是使用常量掩码屏蔽边界处的位。

例如,rook()位于字段F6上,因此我们生成一个掩码,其中设置了F1、F8、A6和H6。然后我们用这个面具来改变你的攻击模式。

0 0 0 0 0 1 0 0   8
0 0 0 0 0 0 0 0   7
1 0 0 0 0 ♜ 0 1   6
0 0 0 0 0 0 0 0   5
0 0 0 0 0 0 0 0   4
0 0 0 0 0 0 0 0   3
0 0 0 0 0 0 0 0   2
0 0 0 0 0 1 0 0   1

A B C D E F G H

在这个解决方案中,我假设您在long内按行编码64个正方形。正方形A1是LSB,正方形H8是MSB。因此,上面的示例将由表示2305984846213677088L=0x2000810000000020L=0b0000010000000000000100000010000000000000000000000000000000000100000L

/** 
 * @param x 0-based index for the columns A to H (0=A_, 1=B_, ...)
 * @param y 0-based index for the rows 1 to 8 (0=_1, 1=_2, ...)
 */
long rookEndpoints(int x, int y) {
  long topBtm = 1L << x;
  return (0b10000001L << (8 * y)) | (topBtm << (8 * 7)) | topBtm; 
}

...
attackPattern &= ~rookEndpoints(x, y)

 类似资料:
  • 这里的复制粘贴使用了 clipboard 本项目提供了两种使用方式 直接使用 <el-button @click='handleCopy(inputData,$event)'>copy</el-button> import clip from '@/utils/clipboard' // use clipboard directly methods: { handleCopy(text,

  • jd.setClipboardData(OBJECT) 设置系统剪贴板的内容 OBJECT 参数说明: 参数 类型 必填 说明 data String 是 需要设置的内容 success Function 否 接口调用成功的回调函数 fail Function 否 接口调用失败的回调函数 complete Function 否 接口调用结束的回调函数(调用成功、失败都会执行) 示例代码 jd.se

  • 本文向大家介绍Python使用剪切板的方法,包括了Python使用剪切板的方法的使用技巧和注意事项,需要的朋友参考一下 此段代码可以利用剪切板,完成自动复制粘贴等功能。(Windows)  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 本文向大家介绍wxPython使用系统剪切板的方法,包括了wxPython使用系统剪切板的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了wxPython使用系统剪切板的方法。分享给大家供大家参考。具体如下: 程序运行效果如下图所示: 主要代码如下: 希望本文所述对大家的Python程序设计有所帮助。

  • 你可以限制你的画图行为在一个矩形之内,应用 fl_push_clip(x,y,w,h),释放用fl_pop_clip. 该矩形用象素未单位,不会受变换矩阵的影响 另外,系统会提供更新窗口的剪切域,但是比一个简单的矩形要复杂的多 void fl_clip(int x, int y, int w, int h) void fl_push_clip(int x, int y, int w, int h)

  • 本文向大家介绍python 获取剪切板内容的两种方法,包括了python 获取剪切板内容的两种方法的使用技巧和注意事项,需要的朋友参考一下 第一种 第二种 待实现需求:将目标值先写入粘贴板、然后模拟键盘的Ctrl+V获取已写入粘贴板的内容。 所需的文件:ClipboardUtil.py、TestSendMain.py ClipboardUtil.py文件的内容: TestSendMain.py文件