文章目录

  • 前言
  • 什么是minimax
  • 代码部分

前言

最近有个朋友来找我问井字棋的下棋逻辑怎么用编程表示,搜了一下网上的资料,发现了minimax这个算法,研究了一下发现蛮有意思的,就写一篇文章记录一下

什么是minimax

minimax通常是用于那些满足“零和博弈”(指参与博弈的各方,在严格竞争下,一方的收益必然意味着另一方的损失,博弈各方的收益和损失相加总和永远为“零”,故双方不存在合作的可能)的棋类算法。
其核心是对每一种可能的局面进行打分,在我方回合总是会选择分数更高的分支,而敌方回合总是会显示分数更低的分支。

如图所示。方块为我方回合,三角为敌方回合,最后的圈为游戏结束情况及其对应的得分,可以看到方块就是从所有子节点中取分数最高的,而三角则是从所有子节点中取分数最低的。话不多说,直接上代码

代码部分

def minimax(board, player_mine, player_you, mine_or_you, bestAction, depth=0):if mine_or_you:bestVal = -10else:bestVal= 10if complete(board,player_mine,player_you):if is_win(board,player_you):show_board(board)print('分数是'+str(-10 + depth))return -10 + depth, Noneelif is_win(board,player_mine):show_board(board)print('分数是'+str(10 - depth))return 10 - depth, Noneelse:show_board(board)print('分数是'+'0')return 0,Nonefor action in [i for i in range(9) if board[i] == 0]:if mine_or_you:board=place(board,action,player_mine)else:board = place(board, action, player_you)val, _ = minimax(board, player_mine, player_you, not mine_or_you, bestAction, depth + 1)board=remove(board,action)if mine_or_you:if val > bestVal:bestVal, bestAction = val, actionelse:if val < bestVal:bestVal, bestAction = val, actionreturn bestVal, bestAction

传参中
1、board是个长度为9的数组,代表了棋盘,其中为0的代表空着的点,为1的代表是玩家1下的,为2的代表是玩家2下的
2、player_mine代表函数调用者,先手的为1,后手的为2
3、player_you代表对手,值为3-plyaer_mine
4、mine_or_you为布尔值,因为minimax需要模拟对手(对手是想方设法让得分变低),为true代表自己,为false代表对手
5、bestAction为当前的最优操作,是用来做棋牌回退的
6、depth代表当前走了多少步,从0开始,depth越高,最终计算的分数越接近0

minimax算法(井子棋)相关推荐

  1. C语言--实现(三)井子棋小游戏(基础版)

    相信大家在生活中肯定知道和了解五子棋的玩法,三子棋的玩法和五子棋一样,当有三个一样的"棋子"连成一条线,不管是横竖斜,谁先完成这个条件,谁就获胜. 那大家有没有想过用编码的形式怎么 ...

  2. c语言实现三子棋(井子棋)

    目录 前言 一.初步构思 二.实现步骤 1.text.c 2.game.c 3.game.h 总结 前言 通过对c语言的初步学习,我们可以用循环,数组,函数的相关知识写一个简单的游戏.增强自信心的同时 ...

  3. 极小化极大算法实现井字棋

    Minimax算法 Minimax 算法又叫极小化极大算法,是一种找出失败的最大可能性中的最小值的算法.(维基百科) alpha-beta 剪枝 Minimax算法中,由于每个节点都是取的极值,所以可 ...

  4. Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)

    前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...

  5. java井字棋ai_简单的井字棋 AI DEMO | Minimax 算法

    在"类与对象"实训课上,有一道附加题让我们用 OOP 做一个的井字棋模拟程序,要求中电脑是随机落子的,这样显然不是很优雅.回忆起以前学的对抗搜索(这里叫 MaxMin 算法),我继 ...

  6. MiniMax算法实现井字棋

    使用MiniMax算法实现井字棋,下面是问题的记录 源代码地址:gitee仓库地址 python中列表的浅复制和深复制 在函数传递中,如果实参传递可变数据类型(list.set.dict)实际上传递的 ...

  7. 组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战

    来源 | MyEncyclopedia 上一篇我们从原理层面解析了AlphaGo Zero如何改进MCTS算法,通过不断自我对弈,最终实现从零棋力开始训练直至能够打败任何高手.在本篇中,我们在已有的N ...

  8. python井字棋ai_实现AI下井字棋的alpha-beta剪枝算法(python实现)

    代码参考自中国大学mooc上人工智能与信息社会陈斌老师的算法,我在原来的基础上增加了玩家输入的异常捕获 AlphaBeta剪枝算法是对Minimax方法的优化,能够极大提高搜索树的效率,如果对这个算法 ...

  9. 采用α-β算法实现井字棋游戏

    题目描述 (1)图形化界面. (2)随机选取先手后手. (3)可以人-计算机或计算机-计算机 界面效果 算法 基本思想 Max-Min算法: 采用Max-Min算法进行对抗搜索,Max和Min双方均要 ...

  10. C++实现的基于α-β剪枝算法的井字棋游戏

    "井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...

最新文章

  1. 有了Unicode为啥还需要UTF-8
  2. sublime生产力提升利器
  3. Spring 多线程
  4. python入门实践19章_求助贴,python编程才能够入门到实践 第19章 19.2.2 代码出错
  5. scapy获取ip_如何使用scapy从数据包中读取整个ip层和tcp层?
  6. 耶鲁大学教授:给研究生的11条军规
  7. vim中替换字符串的方法有哪些
  8. oracle:如何构造一个随机姓名出来?
  9. 你的短信接口真的安全吗?
  10. 利用ISA防火墙发布邮件服务器并部署OWA访问
  11. 危机2.0时代,企业任重而道远
  12. java 水波纹_java实现水波纹扩散效果
  13. python怎么保留整数输出_python怎么保留整数
  14. win7计算机里没有桌面快捷方式,Win7桌面快捷方式图标消失的解决办法
  15. JS轮播图(网易云轮播图)
  16. MT6701磁编码器使用指南,14Bit单圈绝对值,I2C stm32 HAL库读角度,兼容AS5600
  17. Kali Linux SQL注入攻击教程
  18. 蝙蝠算法c语言,一种新颖的群智能算法:飞蛾扑火优化算法
  19. springboot log4j:WARN No appenders could be found for logger
  20. BigDecimal使用不当,造成P0事故!

热门文章

  1. 周易版化学元素周期表
  2. 点进来看看,这篇文章告诉你什么软件可以识别PDF中的文字!
  3. 定额中计算机主机工作内容,计算机核定定额的业务操作指引.doc
  4. 微信公众号开发(1)微信公众号简介
  5. 《大数据之路:阿里巴巴大数据实践》-第1篇 数据技术篇 -第3章数据同步
  6. 移动硬盘根目录里的msdia80.dll文件
  7. (一) Windows环境下的Detours编译
  8. ipadpro画流程图_Paper 推出适用于快速制作流程图的 Think 套件
  9. JAVA 事务不生效的常见场景和修改方案
  10. WizTree v4.03 最快的磁盘空间分析工具中文便携版