Python游戏开发实例之graphics实现AI五子棋


Posted in Python onNovember 01, 2021

前言

利用Python+graphics模块实现AI五子棋。
让我们愉快地开始吧~~~

效果展示

Python游戏开发实例之graphics实现AI五子棋

源码

import sys
import cfg

from modules.misc.Buttons import *
from modules.ai.playWithAI import *
from modules.online.playOnline import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

'''游戏开始界面'''
class gameStartUI(QWidget):
	def __init__(self, parent=None, **kwargs):
		super(gameStartUI, self).__init__(parent)
		self.setFixedSize(760, 650)
		self.setWindowTitle('五子棋-微信号: ilove-python')
		self.setWindowIcon(QIcon(cfg.ICON_FILEPATH))
		# 背景图片
		palette = QPalette()
		palette.setBrush(self.backgroundRole(), QBrush(QPixmap(cfg.BACKGROUND_IMAGEPATHS.get('bg_start'))))
		self.setPalette(palette)
		# 按钮
		# --人机对战
		self.ai_button = PushButton(cfg.BUTTON_IMAGEPATHS.get('ai'), self)
		self.ai_button.move(250, 200)
		self.ai_button.show()
		self.ai_button.click_signal.connect(self.playWithAI)
		# --联机对战
		self.online_button = PushButton(cfg.BUTTON_IMAGEPATHS.get('online'), self)
		self.online_button.move(250, 350)
		self.online_button.show()
		self.online_button.click_signal.connect(self.playOnline)
	'''人机对战'''
	def playWithAI(self):
		self.close()
		self.gaming_ui = playWithAIUI(cfg)
		self.gaming_ui.exit_signal.connect(lambda: sys.exit())
		self.gaming_ui.back_signal.connect(self.show)
		self.gaming_ui.show()
	'''联机对战'''
	def playOnline(self):
		self.close()
		self.gaming_ui = playOnlineUI(cfg, self)
		self.gaming_ui.show()


'''run'''
if __name__ == '__main__':
	app = QApplication(sys.argv)
	handle = gameStartUI()
	font = QFont()
	font.setPointSize(12)
	handle.setFont(font)
	handle.show()
	sys.exit(app.exec_())

开发工具

Python版本: 3.6.4

相关模块:

graphics模块。

环境搭建

安装Python并添加到环境变量即可。

注:
graphics模块在相关文件中已经提供,就是一个py文件,直接放在当前路径或者放到python安装文件夹下的site-packages文件夹内均可。

原理简介

对于五子棋这样的博弈类AI,很自然的想法就是让计算机把当前所有可能的情况都尝试一遍,找到最优的落子点。这里有两个问题:

(1)如何把所有可能的情况都尝试一遍;

(2)如何定量判断某落子点的优劣。

对于第一个问题,其实就是所谓的博弈树搜索,对于第二个问题,其实就是所谓的选择评估函数。评估函数的选取直接决定了AI算法的优劣,其形式也千变万化。可以说,每个评估函数就是一个选手,对不同的棋型每个选手自然有不同的看法和应对措施,当然他们的棋力也就因此各不相同了。

但博弈树搜索就比较固定了,其核心思想无非是让计算机考虑当前局势下之后N步所有可能的情况,其中奇数步(因为现在轮到AI下)要让AI方的得分最大,偶数步要让AI方的得分最小(因为对手也就是人类,也可以选择最优策略)。

当然这样的搜索其计算量是极大的,这时候就需要剪枝来减少计算量。例如下图:

Python游戏开发实例之graphics实现AI五子棋

其中A代表AI方,P代表人类方。AI方搜索最大值,人类方搜索最小值。因此Layer3的A1向下搜索的最终结果为4,Layer3的A2向下搜索,先搜索Layer4的P3,获得的分值为6,考虑到Layer2的P1向下搜索时取Layer3的A1和A2中的较小值,而Layer3的A2搜索完Layer4的P3时,其值就已经必大于Layer3的A1了,就没有搜索下去的必要了,因此Layer3到Layer4的路径3就可以剪掉了

上述搜索策略其实质就是:

minimax算法+alpha-beta剪枝算法。

了解了上述原理之后,就可以自己写代码实现了。当然实际实现过程中,我做了一些简化,但万变不离其宗,其核心思想都是一样的。

 

到此这篇关于Python游戏开发实例之graphics实现AI五子棋的文章就介绍到这了,更多相关Python AI五子棋内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python 多进程通信模块的简单实现
Feb 20 Python
python打开网页和暂停实例
Sep 30 Python
Python获取Linux系统下的本机IP地址代码分享
Nov 07 Python
深入探究Python中变量的拷贝和作用域问题
May 05 Python
深入理解python多进程编程
Jun 12 Python
Python性能提升之延迟初始化
Dec 04 Python
Python设计实现的计算器功能完整实例
Aug 18 Python
python机器学习实战之K均值聚类
Dec 20 Python
windows下 兼容Python2和Python3的解决方法
Dec 05 Python
python分块读取大数据,避免内存不足的方法
Dec 10 Python
Python使用Excel将数据写入多个sheet
May 16 Python
Python 可视化神器Plotly详解
Dec 26 Python
Python Django获取URL中的数据详解
Nov 01 #Python
python编程项目中线上问题排查与解决
Nov 01 #Python
python实现层次聚类的方法
Python list列表删除元素的4种方法
Nov 01 #Python
Python面向对象编程之类的概念
Nov 01 #Python
python代码实现扫码关注公众号登录的实战
python编程实现清理微信重复缓存文件
Nov 01 #Python
You might like
apache php模块整合操作指南
2012/11/16 PHP
php版微信公众账号第三方管理工具开发简明教程
2016/09/23 PHP
js电信网通双线自动选择技巧
2008/11/18 Javascript
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
2009/11/30 Javascript
CSS(js)限制页面显示的文本字符长度
2012/12/27 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
2014/08/16 Javascript
在JavaScript中使用开平方根的sqrt()方法
2015/06/15 Javascript
js select实现省市区联动选择
2020/04/17 Javascript
Angular4如何自定义首屏的加载动画详解
2017/07/26 Javascript
详解angular笔记路由之angular-router
2017/09/12 Javascript
详解ES6 Symbol 的用途
2018/10/14 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
Vue的全局过滤器和私有过滤器的实现
2020/04/20 Javascript
javascript中layim之查找好友查找群组
2021/02/06 Javascript
Python记录详细调用堆栈日志的方法
2015/05/05 Python
基于python的字节编译详解
2017/09/20 Python
使用Python制作微信跳一跳辅助
2018/01/31 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
2020/04/23 Python
Python系统监控模块psutil功能与经典用法分析
2018/05/24 Python
Python3实现的爬虫爬取数据并存入mysql数据库操作示例
2018/06/06 Python
python实现彩色图转换成灰度图
2019/01/15 Python
python tkinter实现彩球碰撞屏保
2019/07/30 Python
pandas按行按列遍历Dataframe的几种方式
2019/10/23 Python
解决flask接口返回的内容中文乱码的问题
2020/04/03 Python
python3.4中清屏的处理方法
2020/07/06 Python
python3字符串输出常见面试题总结
2020/12/01 Python
Veronica Beard官网:在酷、经典和别致之间找到了平衡
2018/01/11 全球购物
Koral官方网站:女性时尚运动服
2019/04/10 全球购物
求职者简历中的自我评价
2013/10/20 职场文书
大学生找工作推荐信范文
2013/11/28 职场文书
党章学习思想汇报
2014/01/14 职场文书
大学生党员自我评价范文
2014/04/09 职场文书
电子信息工程自荐信
2014/05/26 职场文书
行风评议整改报告
2014/11/06 职场文书
2016年情人节问候语
2015/11/11 职场文书
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS