我为象棋游戏做了一个负极算法,我想知道如何使用最终的棋盘值结果。我知道负极算法的最终回报代表了玩家采取最佳策略后的棋盘值,但这并不完全是有用的信息。我需要知道那一步是什么,而不是它的价值。
代码如下:
public int negamax(Match match, int depth, int alpha, int beta, int color) {
if(depth == 0) {
return color*stateScore(match);
}
ArrayList<Match> matches = getChildren(match, color);
if(matches.size() == 0) {
return color*stateScore(match);
}
int bestValue = Integer.MIN_VALUE;
for(int i = 0; i != matches.size(); i++) {
int value = -negamax(matches.get(i), depth-1, -beta, -alpha, -color);
if(value > bestValue) {
bestValue = value;
}
if(value > alpha) {
alpha = value;
}
if(alpha >= beta) {
break;
}
}
return bestValue;
}
public void getBestMove(Match match, int color) {
int bestValue = negamax(match, 4, Integer.MIN_VALUE, Integer.MAX_VALUE, color);
// What to do with bestValue???
}
在确定bestValue后,我考虑重新评估当前匹配状态的子项。然后我遍历它们,找出其中哪个孩子的statecore等于bestValue。但这是行不通的,因为不管怎样,他们中的很多人都会有相同的状态分数,这是他们可以导致的结果。。。
我看得出你在做qsearch和alpha beta。您的算法是众所周知的,但缺少一个关键部分。
让我来概述一下国际象棋搜索的基本算法,它甚至适用于Stockfish(世界上最强的引擎)。
search(Position p) {
if (leaf node)
qsearch(p)
if (need to do move reduction)
do_move_reduction_and_cut_off(p)
moves = generate_moves(p)
for_each(move in moves) {
p.move(move)
v = -search(p, -beta, -alpha)
p.undo(move)
store the score and move into a hash table
if (v > beta)
cutoff break;
}
这只是一个非常简短的草图,但所有国际象棋算法都遵循它。将您的版本与之进行比较,是否注意到您尚未执行p.move(移动)和p.undo(移动)?
基本上,传统的方法为给定的位置生成一个移动列表。循环遍历移动,播放并撤消它并搜索它。如果你这样做,你就确切地知道哪个移动会产生哪个分数。
还要注意将移动和得分存储到哈希表中的行。如果您这样做,您可以轻松地从根节点重建整个主要变体。
我不知道你的Java类Match里面到底有什么,但无论如何,你的尝试很接近,但不完全是经典的搜索方式。记住,你需要在搜索算法中给出一个位置对象,但你给了它一个匹配对象,这是错误的。
我对我的象棋游戏的最小极大算法的实现有问题。它的大部分似乎都起作用了,但它要么从来没有做出好的动作,要么对它们的评估(基于两个玩家的活动棋子的分数)出了问题。例如,如果我设置了check(例如,傻瓜的伴侣),ai会做一些随机的事情,而不是杀死国王。我真的找不出我做错了什么。 评估电路板的类StandardBoardEvaluator在经过一些测试后似乎可以工作,因此问题很可能出现在MiniMax实
上面的代码显示了一个可以上下移动的部分的示例。这不是一个有效的棋步。所以,如果我要移动一个皇后,我该怎么做呢?我们只是假设我们已经有了一个矩阵(x,y)8×8的板。
DreamChess 是一款开放源码、跨平台(可在 Windows、Mac OS X 及 Linux 上运行)的 3D 国际象棋游戏。该游戏包含自身的引擎 Dreamer,提供各种国际象棋棋盘,并具有背景音乐及声效等其他附属功能。
我已经为我的国际象棋游戏实现了alpha-beta算法,但是要最终做出一个相当愚蠢的动作需要很多时间(4-ply需要几分钟)。 我已经试图找到错误(我假设我犯了一个)2天了,我非常感谢对我的代码的一些外部输入。 getMobile函数:为根节点调用,它为所有子节点调用alphaBeta函数(可能的移动),然后选择得分最高的移动。 AlphaBeta函数: 编辑:我应该注意到,评估板只评估棋子的机动
我正在下国际象棋,除了一件事,我几乎得到了所有的东西:我需要使棋手不可能将棋子移动到棋盘上。我很难解决这个问题。 我现在用伪代码生成的有效移动是:类getMoveLocations(我定义了一个位置为国际象棋中的一个方块):如果这个位置在边界内,这个位置的棋子是敌人的棋子,并且模拟的移动不会导致棋盘被检查,然后将该位置添加到工件可以移动到的可能位置。 问题是我如何检查棋盘是否“在检查中”。在我的代
问题内容: 我正在计划制作一个与UCI国际象棋引擎接口的程序。我一直在对此进行一些研究,但是我想在获得更多信息之前获得更多的信息。我想知道你们中是否有人可以提供一些UCI引擎和前端程序之间的“交换”示例。我并不在乎实用的接口代码(例如发送/接收命令),这应该足够简单。我只是想获得一些小游戏的好例子和一些选择。我目前正在使用Stockfish引擎,但是我希望能够使用多个引擎。 因此,无论如何,我正在