我是一个初学者,我试图通过应用极小算法来开发Connect4游戏,我被困在决定是最小玩家回合还是最大玩家回合的条件下。我有一种感觉,这是一种简化,但我已经想了两天试图弄清楚。有什么帮助吗?
private int evaluatePlayerMove(int depth, int maxDepth, int col, int alpha, int beta) {
boardsAnalyzed++;
int evaluatedMove=0; // For evaluating min player move or max player move
int min = Integer.MAX_VALUE, minScore = 0; // For min player
int max = Integer.MIN_VALUE, maxScore = 0; // For max player
if (col != -1) {
// Check whether it's min player turn or max player turn
// If it's min player turn then evaluate min move:
if(//it's min player turn){
minScore = board.getHeuristicScore(Board.MARK_BLACK, col, depth, maxDepth);
if(board.blackWinFound()) {
blackWinFound = true;
return minScore;
}
if (depth == maxDepth) {
return minScore;
}
for (int c = 0; c < Board.COLUMNS; c++) {
if (board.isColumnAvailable(c)) {
board.mark(c, Board.MARK_RED);
int value = evaluatePlayerMove(depth + 1, maxDepth, c, alpha, beta);
board.unset(c);
if (value < min) {
min = value;
if (depth == 0) {
column = c;
}
}
if (value < beta) {
beta = value;
}
if (alpha >= beta) {
return beta;
}
}
}
if (min == Integer.MAX_VALUE) {
return 0;
}
evaluatedMove = min;
}
// If it's max player turn then evaluate max move:
if(//it's max player turn) {
maxScore = board.getHeuristicScore(Board.MARK_RED, col, depth, maxDepth);
if (board.redWinFound()) {
redWinFound = true;
return maxScore;
}
if (depth == maxDepth) {
return maxScore;
}
for (int c = 0; c < Board.COLUMNS; c++) {
if (board.isColumnAvailable(c)) {
board.mark(c, Board.MARK_BLACK);
int value = evaluatePlayerMove(depth + 1, maxDepth, c, alpha, beta);
board.unset(c);
if (value > max) {
max = value;
if (depth == 0) {
column = c;
}
}
if (value > alpha) {
alpha = value;
}
if (alpha >= beta) {
return alpha;
}
}
}
if (max == Integer.MIN_VALUE) {
return 0;
}
evaluatedMove= max;
}
}
return evaluatedMove;
}
在大多数实时人工智能情况下,这是你的人工智能程序与人类玩家之间的较量。所以,通常情况下,如果你正在构建一棵min-max树,人工智能程序将只会是min或max,而这棵树的根将是min或max。例如,如果你尝试在人工智能程序中使用max,树的根将始终保持max,你只需要计算max的移动(min moves将是用户输入)。对于这种情况,我建议使用树的深度作为检查条件。
if(root == max){
for any node n:
if(n.depth%2 == 0){
n is max
}
else{
n is min
}
}
因为深度通常用于几乎所有的问题,所以它将是一种有效的方法。
然而,如果这是一个家庭作业问题,你确实需要计算最小和最大的移动,我建议使用一个实例静态布尔变量isMax,它应该在每次移动后翻转。
这是我第一次在C#中使用进度条。我的代码正在复制一些文件,我想通过进度条显示进度。 我不喜欢我的代码的一点是,我必须遍历所有文件来设置最大值...后来我再次经历同样的过程来复制文件。 我只是想不出一个方法来确保在酒吧里流利的进步而不这样做。我首先必须知道最大值对吗?或者有什么诀窍吗? 代码如下所示: > 设置最大值: 复制文件: 增加进度条: 私有静态无效记录器(字符串输出){log.Text=“
条件语句通过判断给定条件的真假来控制程序的执行。在上一小节中,我们已经简要介绍过了语句和块的概念。那么本小节我们将进一步展开介绍 Java 中所有类型的条件语句。 1. if 语句 1.1 语法 当我们需要根据给定的条件来决定是否执行一段代码时,if 语句就派上用场了。if 块仅在与其关联的布尔表达式为 true 时执行。if 块的结构如下: if (条件) { // 当条件成立时执行此处
问题内容: 我正在上高中AP计算机科学课程。 我决定在我们的一个实验室里发表一个声明,只是为了玩弄,但是我遇到了这个错误。 我问了一个关于Stackoverflow 的问题,以找出如何正确执行它,并且我所做的完全如答案之一所示。我真的不明白为什么编译器想要一个语句(至少这是我假设的要求),我也不知道如何使用。似乎希望重新启动的部分是一个变量,但是重新启动只是将程序拉回到第10行的标签,以便用户可以
本文向大家介绍正确使用MySQL INSERT INTO语句,包括了正确使用MySQL INSERT INTO语句的使用技巧和注意事项,需要的朋友参考一下 以下的文章主要介绍的是MySQL INSERT INTO语句的实际用法以及MySQL INSERT INTO语句中的相关语句的介绍,MySQL INSERT INTO语句在实际应用中是经常使用到的语句,所以对其相关的内容还是多多掌握为好。 My
我开始写一个二叉树函数。该方法目前的目标是在树中找到节点并返回节点。根值是数据,左边和右边是子树。当我在调试器中单步执行它时,当它到达return语句时,它会跳回第二个if块,并最终返回null。
我理解下面的代码可以正常工作。在阅读Python中的while循环文档时,他们说while表达式应该是True或False,这很有意义。 现在,函数返回字符串。那么这个while循环是如何工作的呢?