当在国际象棋中计算将死国王时,您是否确定其他玩家可能对您的国王采取的行动?或者你只考虑他们单位的影响力?如果你说是前者,那么就会有一个矛盾,比如“这个说法是错误的”。考虑这个图像,两个国王相距一个正方形,他们的骑士保护上面的车。如果我们假设可能的动作的定义必须防止基于敌人可能的动作进行检查,那么逻辑就会递归地交替。
- 首先,我们说我们的国王受到敌方骑士的控制,因此我们无法移动自己的骑士,因为我们必须逃跑。
- 然后我们意识到骑士没有可用的移动方式进入我们国王的方格,因为他将把他的国王置于我们的车的控制之下。他毕竟无法控制我们的国王。
- 然后我们意识到,不受制止,我们现在能够将我们自己的骑士移动到敌方国王处,迫使他摆脱制止并阻止他进一步的选择。
- 然而,我们注意到我们不能这样做,因为这会让我们与敌方车形成牵制。
- 我们意识到,由于我们实际上无法移动我们的骑士,因此敌方国王实际上并没有受到控制,因此他可以自由地使用他的骑士来攻击我们的国王。
- 转到步骤 2(无论您已经执行了多少次)。
好吧,所以也许我们假设无论敌人的检查状态如何,到达总是很重要。如果我们的国王处于敌方骑士通常的攻击范围之内,我们就将其视为一次检定,并且必须解决它。这就是实际游戏的规则吗?这似乎是对游戏逻辑编程时面临的问题的一个简单解决方案,但我不确定它是否正确。
我做了一些思考并得出了这样的分析:我认为你已经证明了两个国王都受制的情况(不一定是我展示的棋盘的情况)不可能矛盾地存在。一次只有一名玩家可以采取行动。因此,一名玩家做出初始动作,从没有王受制的状态转变为一些王受制的状态。根据规则,如果该玩家的王结果是过牌,则不允许此步棋。(我很快就会指出“结果”的重要性)这意味着无论如何定义检查,如果他的国王满足该条件,他就无法采取任何行动。因此,从不检查到检查的唯一转变是敌人受到检查。敌人必须逃脱检查,仍然遵循一招不进入检查的规则。剩下的状态将是游戏结束或国王逃脱检查。
所以我明白,两个国王都受到控制是不可能的。现在我展示的板要么可以访问,要么无法访问。我们假设董事会是可以到达的,看看是否存在矛盾。让我们模糊地假设轮到白棋了,因为场景是对称的。这意味着黑色刚刚移动。因此,黑王不受制。只有白骑士才能到达黑国王。因此,白骑士必须受到某种规则的限制,不能攻击黑王。可以强制执行该结论的唯一两个可能的规则是:
- 白骑士目前正在保护他的国王免受检查。
- 白王已经受制,这一着棋并不能解决制止问题。
首先,无论1如何,都假设2为真。白王处于受制状态,攻击范围内唯一的棋子是黑骑士。然而,黑骑士不能攻击包含国王的方格,因为这会限制他自己的国王。因此 1 一定为真,并且白王不受制。所以两位国王都不受制于。我们反转游戏板,看看是否可以到达。假设场景有以下改变:白方有一个象 2 上,黑车右 1 个。黑王在左边一格。白王位于右侧一格。没有国王处于任何其他棋子的范围内,因此假设可以达到此初始状态可能是合理的。黑骑士正在保护他的国王免受主教的侵害,因此它无法移动到白骑士的下方。白王向左移动。现在白骑士正在保护白王,无法移动到黑骑士的下方。黑王向右移动一格。这样,场景就可以实现了。唯一受到质疑的假设是,当考虑任何移动时,可以安全地假设检查规则已计算。因此,一个国王可能会进入一个单位的射程内,而该单位可能会因为阻止他自己的国王受到控制而无法攻击它。如果不做这个假设,那么棋子就可以简单地遵循不允许国王进入敌方单位的无限制攻击范围的规则。现在,有趣的是看看这个场景是否可以在没有无限循环的情况下进行计算。对于依赖关系,我将使用箭头。对于最初的白王向左移动,白王 -> 黑骑士停止 -> 白主教攻击黑王 这些都是单步计算,到目前为止没有依赖关系循环。黑王向右移动,黑王->白骑士停止->黑车攻击白王仍然没有依赖性。当我们现在尝试检查白骑士的可用动作(包括攻击黑王)时怎么样?白骑士停下->黑车攻击白王 如果白车攻击黑车怎么办?白车停止 -> 黑马攻击白王 白棋剩下的选择是将王向右或向下移动。
我们的结论是,
- 可以在不违反“不进入检查”规则的情况下进入此棋盘状态。
- 这个棋盘状态显然假设计算检查取决于敌人可能的移动,而不是他们简单的本机攻击范围。
- 当达到这种状态时,两个国王都不受控制。
- 至少这可能不是僵局。(未知是否总是)
所以我终于在维基百科上找到了关于控制另一位国王的规则,即使这会损害自己的国王。因此,我们无法在第 2 部分中做出假设,因此无法到达棋盘状态。“一块无法移动的棋子,因为它会阻止自己的国王(它被固定在自己的国王上),但它仍然可以向对方玩家提供检查。” 因此,我们对国际象棋明显的实际规则的最终结论是,棋盘状态无法达到,因为它遵循检查规则。
我将选择 Icedtrees 答案,因为遵循游戏规则的有价值的逻辑:
if for every move for player X (ignoring rules about king threats),
player Y can capture player X's king next turn,
then player X is in checkmate.
Run Code Online (Sandbox Code Playgroud)
但是,我会将它们修复为以下内容:
{X is checkmate}
if and only if {
For all legal …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 alpha-beta 剪枝和转置表来实现极小极大算法。这是针对可能循环的 pacman 代理,因此必须特别注意这一点。如果一个状态(游戏和回合的状态(pacman 或 Ghost))在换位表中,并且之前看到的状态是该节点的父节点(祖父节点,...),则可以将其丢弃。这适用于没有 ab 剪枝的极小极大。从之前的搜索来看,tt(转置表)与ab的实现似乎要困难得多。我试图使代码尽可能清晰,它基于伪代码Artificial Intelligence: A Modern Approach。我希望使用第一种方法使最终结果尽可能接近。
我发现的每个伪代码都以非常不同的方式定义:
大多数差异看起来只是表面上的。但这些代码都没有完全符合我正在寻找的结构:用 ab 剪枝除以 minValue 和 maxValue 的 minimax
提前致谢,
请询问任何进一步的解释
algorithm chess artificial-intelligence minimax alpha-beta-pruning
我正在制作一个基于位板的国际象棋引擎,我想问 - 假设我为每个棋子制作了一个位板,我该怎么办?我读了一些关于一些技术的内容,比如如果你将棋子位板向左移动 7 和 9,你会得到一个代表他们攻击的方格的位板,但我该如何使用它呢?或者如何使用车位板或主教位板?比如他们的目标是什么,如果我找到了它,我如何将它与其他块位板连接起来?我已经搜索了好几天了,但没有找到足够的答案......谢谢
所以我试图用Java显示一个棋盘。到目前为止,我可以正确绘制一堆矩形并为其着色,并正确调整窗口和矩形的大小。但是,现在我想在这些矩形的顶部添加一个国际象棋棋子的图像,但我不知道如何继续。
我为棋子创建了一个 png 的图像视图,但是当我尝试将其添加到网格窗格中(就像我对矩形所做的那样)时,它给了我一个重复的子错误。
这是迄今为止有效的代码
package test3;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.TilePane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.scene.*;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.scene.image.*;
/**
*
*/
public class Test3 extends Application {
GridPane root = new GridPane();
final int size = 8;
ImageView pawn = new ImageView("file:pawn.png");
@Override
public void start(Stage primaryStage) throws Exception {
for (int row = 0; row < size; row++) {
for (int col = 0; …
Run Code Online (Sandbox Code Playgroud) 假设我们有一个棋盘(任意大小)和最初放置在 N 个方格上的 N 个国王。假设现在我们选择 N 个新方格来通过一系列合法的移动(无碰撞)将国王移动到其中。目标是最小化所有国王移动的总距离。我真的想不出一种算法/适应可以处理移动所有棋子,同时防止“碰撞”国王。该算法应该比递归选择目标方块和选择最小传输更快。我希望有人对这个问题提出宝贵的建议。
谢谢
我用c#开发了一个多人棋,但是我不知道如何用c#实现国际象棋的限制规则,说实话我从来没有做过我生命中的一点点游戏编程,所以我不知道如何在这个领域工作.
有没有简单的国际象棋程序源代码示例?坦率地说,我没有成功搜索国际象棋源代码或如何在国际象棋中实现移动规则.
所以,如果你认为你可以帮助我,那将是值得赞赏的.
问候.
我正在制作一个国际象棋应用程序,需要创建一本开放书,一个可能包含数百万个动作和位置的文件.我们有64平方米,其中一些已被占用,而有些是空的.让我们用以下比特表示我们的作品(使用霍夫曼编码技术).
White Black
-Empty 0
-Pawn 110 100
-Rook 11111 11110
-Knight 10110 10101
-Bishop 10100 11100
-Queen 111010 111011
-King 101110 101111
Run Code Online (Sandbox Code Playgroud)
在初始位置,我们有32个不同的部分被占用,32个是空的.为了提高效率,我必须将位置存储在连续位中.片段位将按顺序放置在位数组中,从a1平方开始,然后是a2平方,... a8,然后是b1,b2 ... b8平方等等.
因此,对于起始位置,这相当于32 x 1 + 16 x 3 + 12 x 5 + 4 x 6 = 164位.
另外还有一些额外的16位用于不同的游戏情况,例如是否启用了castling,以及定义了enpassant square(如果适用).所以我需要大约180位(或23字节= 184位)来存储棋盘的单个位置.
现在的问题是我必须执行一些按位操作,因此想要知道该方案如何在我的代码中操作它以及如何存储在文件中.意味着我应该使用哪种数据结构.例如,最大长度(数据类型)将仅包含4个字节= 64位.我想避免使用字符串.任何机构都可以建议如何继续这一点.
我正在使用C#.Net,Framework 3.5.
注意:这个问题看起来有点像我几周前发布的另一个问题.那时我没有把按钮添加为数组,这就是为什么这次对我来说更难.
我正在与一个国际象棋游戏合作,我已经能够自己设置一个64个方格的棋盘.然而,对于我来说,管理为正方形添加颜色似乎有点太复杂了.
我的代码看起来像这样:
Chess.java
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Chess implements config {
public static void main(String[] args) {
int[] squareArray;
squareArray = new int[65];
int i = 1;
JFrame frame = new JFrame("Chessboard");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridLayout(ROWS, COLS, 2, 2));
for (i = 1; i < 65; i++) {
squareArray[i] = i;
frame.add(new JButton("" + squareArray[i]));
}
frame.setSize(800, 800);
frame.setVisible(true);
}
}
Run Code Online (Sandbox Code Playgroud)
Piece.java
import java.awt.Color;
import javax.swing.JFrame;
public class Piece extends JFrame implements config {
public Piece …
Run Code Online (Sandbox Code Playgroud) 我正在尝试用8x8 2D阵列制作一个简单的国际象棋棋盘作为我的棋子.但输出并不是我想要的,因为数组刚刚下降.(对不起我的语言.我不太擅长编程)这是我的代码:
public class ChessBoard {
String[][] board = new String[8][8];
public void fillBoard() {
//Fills the empty spaces
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
board[i][j] = " ";
}
}
// Rooks
board [0][0] = "R";
board [0][7] = "R";
board [7][0] = "R";
board [7][7] = "R";
// Knights
board [0][1] = "N";
board [0][6] = "N";
board [7][1] = "N";
board [7][6] = …
Run Code Online (Sandbox Code Playgroud) 我正在尝试将精力放在基于属性的测试和国际象棋上。目前,我将我的国际象棋游戏表示为2D数组,而我实现的唯一部件是用来作怪的典当和骑士。
典当和骑士代表他们的动作allMoves(x,y) \ invalidMoves(board,x,y)
。因此,我可以想到的一项性能就是对其进行测试allMoves(x,y) ? invalidMoves(board,x,y) === allMoves
。但是除此之外,我不确定还需要测试什么。我假设我需要为国际象棋棋盘建立一个简化的Oracle模型,但是我不确定这样的模型是什么。