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

使用魔法棋盘制作国际象棋。。。我怎么知道运动是否有效

伯彦君
2023-03-14

好的,我在网上读了很多东西,大多数都是使用不带unsigned int的Java。我正在研究带有unsigned int的Objective-C。

让我们考虑以下场景。

董事会是这样的:

A1位于左下方,是最低有效位,H8位于右上角,是最高有效位。

我已经为棋盘上所有位置的所有棋子的移动构建了位掩码。

假设以下简单情况:

  1. 比赛就要开始了。所有部件都处于初始位置
  2. 用户试图将骑士从G1移动到E2

显然,这种移动是不可能的,因为在E2上有一个棋子。

我如何发现一个动作是否有效?

好的,我有所有片段的位掩码,这是:

1111111111111111000000000000000000000000000000001111111111111111

我有骑士在G1的可能移动的位掩码

00000000
00000000
00000000
00000000
00000000
00000X0X
0000X000
00000000

或者一点点

0000000000001000000001010000000000000000000000000000000000000000

如果我这两个

111111111111111100000000000000000000000000000000000000000000000000000011111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000

我得到

0000000000001000000000000000000000000000000000000000000000000000

我所知道的是,在这一点上有一块,但我不明白这如何告诉我,如果这是一个有效的举动或不是。

另一个问题是:假设此举会让我的国王受到攻击。显然,根据骑士的移动规则,这一步在技术上是可能的,但不可能,因为我不能做出让我的国王受到攻击的动作。

我如何获得这些信息?谢谢


共有1个答案

夏宪
2023-03-14

如果你只有一个所有棋子的比特面具,那么你根本无法知道你是想把骑士转移到对手的棋子上还是你自己的棋子上。对于白色部分和黑色部分,您必须使用单独的位掩码。

在考虑其他棋子的位置之前,您已经有了骑士所有可能移动的位掩码K。只需按位和白色棋子所在位置的NOT:M=K

现在就我所知,骑士的移动会危及其国王的唯一方式是,如果骑士之前阻止了对手的攻击。特别是,如果它阻止了一辆车或一位主教的攻击。只有当骑士被安置在离国王所在地八个主要方向之一的位置时,这才是可能的。所以,检查一下在八个主要方向中的一个方向上,国王和骑士之间是否有一条笔直、畅通的直线。如果没有,那么这一举动不可能危及国王,所以你不需要再做任何检查。如果有,则在M的位置循环,查看国王在每一个位置之后是否会受到威胁。

在骑士的特殊情况下,由于它以L形移动,它无法从阻止攻击的位置移动到另一个继续阻止攻击的位置。因此,在骑士的特殊情况下,您应该执行以下操作:

  1. 检查国王和骑士之间是否有一条不间断的直线。如果没有,请转到4

我应该注意到,这是在假定国王没有受到约束的情况下写成的。根据需要进行调整。

 类似资料:
  • 我正在下国际象棋,除了一件事,我几乎得到了所有的东西:我需要使棋手不可能将棋子移动到棋盘上。我很难解决这个问题。 我现在用伪代码生成的有效移动是:类getMoveLocations(我定义了一个位置为国际象棋中的一个方块):如果这个位置在边界内,这个位置的棋子是敌人的棋子,并且模拟的移动不会导致棋盘被检查,然后将该位置添加到工件可以移动到的可能位置。 问题是我如何检查棋盘是否“在检查中”。在我的代

  • 我已经有一个Board对象,包含一个碎片列表。Piece是一个抽象类,有一个位置(x,y)和一个颜色(黑色或白色)。然后是King、Queen、Knight这三个类,实现了Piece类。 谢谢

  • 本文向大家介绍c# 绘制中国象棋棋盘与棋子,包括了c# 绘制中国象棋棋盘与棋子的使用技巧和注意事项,需要的朋友参考一下 本文是利用C# 实现中国象棋的棋盘绘制,以及初始化布局,并不实现中国象棋的对弈逻辑。仅供学习参考使用。 思路: 绘制中国象棋棋盘,竖线九条,横线十条。再中间绘制‘楚河',‘汉界' 。 绘制棋子,然后将棋子布局在棋盘上即可。 涉及知识点: 用户控件:用于实现棋盘的绘制,重写 OnP

  • 我目前正在编写我的第一盘国际象棋,我的棋子有一个小问题。我将在下面添加一些代码,但通常我想检查玩家移动某个棋子(在本例中为国王)的棋盘是否已经被另一个棋子占据,因为在这种情况下,另一个棋子将被杀死(如果棋子属于另一个玩家),或者移动是错误的(棋子被自己的棋子占据)。如果你对如何做有任何想法,我将不胜感激。顺致敬意, 公共抽象类文章{ } 公共类国王延伸件{ }

  • 我正在做一个项目,在那里我采取一个象棋棋盘位置(FEN字符串转换成二进制)&它的评估分数,并将它馈送给一个神经网络。我的目的是让神经网络区分好的和坏的仓位。 我是如何编码位置的:国际象棋中有12个独特的棋子,即棋子,棋子,骑士,主教,王后和国王,白棋和黑棋一样。我使用4位编码每一个片段,其中0000表示一个空的正方形。所以64个方块被编码成256位,我用另外6位来表示游戏状态,比如轮到谁移动,国王