我想通过引入深度来限制搜索级别,将无与伦比的井字游戏修改为适用于5乘5的区块.任何建议
I want to modify the unbeatable tic tac to work for 5 by 5 block by introducing the depth to limit the search levels. Any suggestions?
下面是minimax算法的代码片段。对于5乘5的矩阵来说,这似乎需要花费很多时间。我想介绍一个变量来跟踪递归的深度并限制它。下面是整个代码的链接:http://ideone.com/e.js/pyFHRu
int MiniMax(char _board[25], player _player) {
int best_val = -INFINITY, index = 0;
std::list<int> move_list;
char best_moves[25] = {0};
generate_moves(_board, move_list);
while(!move_list.empty()) {
_board[move_list.front()] = _player.symbol;
cSymbol = _player.symbol;
int val = MinMove(_board, _player);
if(val > best_val) {
best_val = val;
index = 0;
best_moves[index] = move_list.front() + 1;
} else if(val == best_val) {
best_moves[++index] = move_list.front() + 1;
}
_board[move_list.front()] = 0;
move_list.pop_front();
}
if(index > 0) {
index = rand() % index;
}
return best_moves[index];
}
// finds best move for 'min player'
int MinMove(char _board[25], player _player) {
int pos_value = evaluate_position(_board, _player);
if(pos_value != -1) {
return pos_value;
}
int best_val = +INFINITY;
std::list<int> move_list;
generate_moves(_board, move_list);
while(!move_list.empty()) {
_player.symbol == 'X' ? cSymbol = 'O' : cSymbol = 'X';
_board[move_list.front()] = cSymbol;
int val = MaxMove(_board, _player);
if(val < best_val) {
best_val = val;
}
_board[move_list.front()] = 0;
move_list.pop_front();
}
return best_val;
}
// finds best move for 'max player'
int MaxMove(char _board[25], player _player) {
int pos_value = evaluate_position(_board, _player);
if(pos_value != -1) {
return pos_value;
}
int best_val = -INFINITY;
std::list<int> move_list;
generate_moves(_board, move_list);
while(!move_list.empty()) {
_player.symbol == 'X' ? cSymbol = 'X' : cSymbol = 'O';
_board[move_list.front()] = cSymbol;
int val = MinMove(_board, _player);
if(val > best_val) {
best_val = val;
}
_board[move_list.front()] = 0;
move_list.pop_front();
}
return best_val;
}
如果您已经在使用较小的深度,那么您必须计算启发式算法。启发式是介于-1和1之间的值,表示位置评估。如果你的深度为10(你计算了10层),那么当你到达评估的最终位置(深度为0或有人获胜)时,你需要计算启发法。
因此,我们可以使用具有有限最大深度的MiniMax算法,在该算法中,如果游戏没有获胜,则使用启发式函数计算对结果位置的评估。如果你想使用启发式方法来消除评估树中看似无用的分支,以进一步优化评估时间,那么你可以使用Alpha Beta prunning,在这里和这里查看更多信息。
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 独立读取-修改-写入顺序
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 修改函数中的指针(将另一个指针作为参数传递)
- 为什么我可以通过引用修改常量返回
- 对于结构,表达式必须是可修改的ivalue
- QML:修改在不同QML文件(而非main.QML)中定义的子对象的属性
- 在C++游戏中与库存系统作斗争
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 修改创建帐户程序
- 我应该如何修改此代码以使用给定字符串中的字母打印菱形图案
- 换位表导致测试失败(但在游戏中运行良好)
- 如何从子成员函数修改父公共成员变量
- 修改 VS Code 中的默认C++代码段
- 为什么在我的函数类型后使用引用运算符 (&) 允许我修改它返回的值?
- 如何使用递归打印修改后的星号三角形图案
- Craps游戏问题,忽略if语句
- 已修改的LinkedList未在文本文件本身中更新
- 绘图线在SDL2 C 中闪烁.如何修改我的游戏循环
- 我想通过引入深度来限制搜索级别,将无与伦比的井字游戏修改为适用于5乘5的区块.任何建议