游戏规则
“一字棋"游戏(又叫"三子棋"或"井字棋”),是一款十分经典的益智小游戏。“井字棋"的棋盘很简单,是一个 3×3 的格子,很像中国文字中的"井"字,所以得名"井字棋”。"井字棋"游戏的规则与"五子棋"十分类似,"五子棋"的规则是一方首先五子连成一线就胜利;“井字棋"是一方首先三子连成一线就胜利。
极小极大分析法
设有九个空格,由 MAX,MIN 二人对弈,轮到谁走棋谁就往空格上放一只自己的棋子,谁先使自己的棋子构成"三子成一线”(同一行或列或对角线全是某人的棋子),谁就取得了胜利。
估价函数定义如下:设棋局为 P,估价函数为 e§。
(1) 若 P 对任何一方来说都不是获胜的位置,则 e§=e(那些仍为 MAX 空着的完全的行、列或对角线的总数)-e(那些仍为 MIN 空着的完全的行、列或对角线的总数)
(2) 若 P 是 MAX 必胜的棋局,则 e§=+∞ (实际上赋了 60)。
(3) 若 P 是 B 必胜的棋局,则 e§=-∞ (实际上赋了-20)。

# -*- coding: utf-8 -*-import random
import copy
import numpy as np
import matplotlib.pyplot as plt
from numpy.linalg import choleskyclass maps:def __init__(self,inf):#初始化self.matrix = [[" "]*3,[" "]*3,[" "]*3]for i in range(0,3):for j in range(0,3):self.matrix[i][j] = inf[i][j]self.cnt = 0 def __str__(self):return str( self.matrix[0] ) + "\n" +str( self.matrix[1] ) + "\n" +str( self.matrix[2] ) + "\n"def getvalue(self):for i in range(0,3):if self.matrix[0][i] == 'X' and self.matrix[1][i] == 'X' and self.matrix[2][i] == 'X' :return 100if self.matrix[0][i] == 'O' and self.matrix[1][i] == 'O' and self.matrix[2][i] == 'O' :return -100if self.matrix[i] == ['X', 'X', 'X']:return 100if self.matrix[i] == ['O', 'O', 'O']:return -100if self.matrix[0][0] == 'X' and self.matrix[1][1] == 'X' and self.matrix[2][2] == 'X' :return 100if self.matrix[0][0] == 'O' and self.matrix[1][1] == 'O' and self.matrix[2][2] == 'O' :return -100if self.matrix[0][2] == 'X' and self.matrix[1][1] == 'X' and self.matrix[2][0] == 'X' :return 100if self.matrix[0][2] == 'O' and self.matrix[1][1] == 'O' and self.matrix[2][0] == 'O' :return -100value = 0for i in range(0,3):if self.matrix[0][i] != 'O' and self.matrix[1][i] != 'O' and self.matrix[2][i] != 'O' :value += 1if self.matrix[0][i] != 'X' and self.matrix[1][i] != 'X' and self.matrix[2][i] != 'X' :value -= 1if self.matrix[0][i] != 'O' and self.matrix[1][i] != 'O' and self.matrix[2][i] != 'O' :value += 1if self.matrix[0][i] != 'X' and self.matrix[1][i] != 'X' and self.matrix[2][i] != 'X' :value -= 1if self.matrix[0][0] != 'O' and self.matrix[1][1] != 'O' and self.matrix[2][2] != 'O' :value += 1if self.matrix[0][0] != 'X' and self.matrix[1][1] != 'X' and self.matrix[2][2] != 'X' :value -= 1if self.matrix[0][2] != 'O' and self.matrix[1][1] != 'O' and self.matrix[2][0] != 'O' :value += 1if self.matrix[0][2] != 'X' and self.matrix[1][1] != 'X' and self.matrix[2][0] != 'X' :value -= 1return valuedef dfs(nowmaps , pre ,step):#博弈树核心算法#print(nowmaps,nowmaps.getvalue())if nowmaps.cnt == 9 or nowmaps.getvalue() == 100 or nowmaps.getvalue() == -100:return nowmaps.getvalue();if step % 2 ==0:value = 200for i in range(0,3):for j in range(0,3):if nowmaps.matrix[i][j] == ' ' :nowmaps.matrix[i][j] = 'O'nowmaps.cnt += 1 tmp = dfs(nowmaps,value,step+1)nowmaps.cnt -= 1 nowmaps.matrix[i][j] = ' 'if tmp < value:value = tmpif value <= pre :return valueelse:value = -200for i in range(0,3):for j in range(0,3):if nowmaps.matrix[i][j] == ' ' :nowmaps.matrix[i][j] = 'X'nowmaps.cnt += 1 tmp = dfs(nowmaps,value,step+1)nowmaps.cnt -= 1 nowmaps.matrix[i][j] = ' 'if tmp > value:value = tmpif value >= pre :return valuereturn valueif __name__ == '__main__':start = maps([[" "]*3,[" "]*3,[" "]*3])print(start)time = 0 while True :if start.getvalue() == 100 or start.getvalue() == -100:break print("轮到你下棋")x , y = input("输入下棋的点:").split()x = int(x)-1y = int(y)-1start.matrix[x][y]='O'start.cnt += 1 print("你下棋后")print(start)time += 1if time == 9:#下满了棋盘breakmaxvalue = -200for i in range(0,3):#遍历、寻找一个合适的点for j in range(0,3):if start.matrix[i][j] == ' ' :start.cnt += 1 start.matrix[i][j] = 'X'tmp = dfs(start,maxvalue,0)start.matrix[i][j] = ' 'start.cnt -= 1 if tmp > maxvalue:maxvalue = tmpx,y=i,jstart.matrix[x][y]='X'start.cnt += 1 print("电脑下棋后")print(start)time += 1#breakif start.getvalue() == -100 :print("胜利")elif start.getvalue() == 100 :print("失败")else:print("平局")

利用α-β搜索的博弈树算法编写一字棋游戏 python相关推荐

  1. c语言编简单博弈小游戏,[2018年最新整理]实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏.doc...

    [2018年最新整理]实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏 实验二:利用α-β搜索过程的博弈树搜索算法编写一字棋游戏 一.实验目的与要求 (1)了解极大极小算法的原理和使用方法,并 ...

  2. C语言第十课:编写井字棋游戏(综合练习1)

    目录 前言: 一.文件建立: 1.头文件game.h: 2.函数定义文件game.c: 3.工程测试文件test.c: 二.编写井字棋游戏: 1.程序整体执行思路: 2.menu菜单函数实现: 3.g ...

  3. java——博弈算法实现井字棋游戏

    通过java语言开发了一个简单的井字棋游戏.主要有6个类,其中有一个是主类(Main.java),一个是抽象类(PiecesMove.java)组成. 下面对各个类简单介绍一下: TicTicToe. ...

  4. MCTS蒙特卡洛搜索树实现井字棋游戏

    利用蒙特卡洛搜索树实现简单的井字棋游戏,重点不是井字棋,是熟悉蒙特卡洛搜索树的应用,而且我们知道,MCTS可以应用到非常复杂的博弈游戏中,比如象棋,围棋,在搜索空间非常大的时候,普通的极大极小搜索树无 ...

  5. 一字棋游戏设计-极大极小搜索

    1.     问题定义 一字棋游戏,包括两个选手.用户可以在一个3*3的棋盘上任意的选择空闲的位置拜访棋子,最早在水平方向上,或者垂直方向上或者对角线方向上形成三子一线者获胜.棋盘如图1所示.这里我们 ...

  6. python编写井字棋_编写井字游戏

    python编写井字棋 Programming computer games may be the most technically challenging (and possibly the bes ...

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

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

  8. 用C语言实现简单的一字棋游戏

    问题分析设计目录 棋盘显示和标记以及棋盘的设计 搜索树叶子节点设计 搜索树设计 节点静态估值计算 完整代码 总结 棋盘显示和标记以及棋盘的设计 用int一维数组表示一字棋的棋盘位置,0~8,数组位置i ...

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

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

最新文章

  1. windows下 nginx安装 使用
  2. 森近林之助【字符串处理】
  3. Docker 方式安装部署 rocketMQ 、部署 图形化界面控制台、rocketMQ 控制台
  4. 用户和组 win2003
  5. php把视频剪辑成15秒一段,如何快速分割视频 一个视频或一个电影截取变成几份的功能 一段段截取 太累了...
  6. ElementUI-自定义模板包含编辑与删除的功能
  7. 如何压缩PDF文件的大小
  8. 微信公众号发送客服消息-中文乱码
  9. RSA算法详解及手算过程
  10. nginx配置多个一级域名https访问的配置
  11. sp01事务码_修复了Server 2003 SP2上的“新事务无法在指定事务协调器中登记”
  12. java毕业设计——基于Java+Socket的视频会议系统设计与实现(毕业论文+程序源码)——视频会议系统
  13. 网狐荣耀系列之微星棋牌在运营过程中用户登录不上
  14. C语言中的标识符有:关键字、预定义标识符、用户标识符
  15. tracert命令介绍
  16. 英特尔下代安腾芯片全面揭秘
  17. [Java] lomboz eclipse 下载. 后来安装启动报错,google了好久,未果。放弃之,转Myeclipse
  18. Android网页浏览器开发详解(一)
  19. 白居易:琵琶行 演唱:肖婵娟
  20. Win11使用串口转换USB失败问题处理

热门文章

  1. 语句摘抄——第21周
  2. 换个方式认识一下——微信公众号搜索公众号列表 API
  3. 谈一谈url实现文件下载
  4. 游戏对战平台搭建要选什么服务器
  5. fps php,帧率60帧是什么意思
  6. Honor笔记本 (2018款intel版本)win11升级教程(TPM2.0)
  7. 瑞幸咖啡新获2.5亿美元融资背后
  8. 一个功能简洁,使用简易的微信机器人
  9. 小米、街电、携程等名企找人了,免费内推
  10. Jetson nano使用anaconda 2021-5-15