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中的列表推导浅析
Apr 26 Python
跟老齐学Python之集成开发环境(IDE)
Sep 12 Python
Python 元类实例解析
Apr 04 Python
Python采集代理ip并判断是否可用和定时更新的方法
May 07 Python
儿童编程python入门
May 08 Python
对pandas里的loc并列条件索引的实例讲解
Nov 15 Python
pyttsx3实现中文文字转语音的方法
Dec 24 Python
numpy.where() 用法详解
May 27 Python
python爬虫增加访问量的方法
Aug 22 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
Dec 23 Python
golang/python实现归并排序实例代码
Aug 30 Python
基于django和dropzone.js实现上传文件
Nov 24 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
整理的9个实用的PHP库简介和下载
2010/11/09 PHP
PHP的一个完美GIF等比缩放类,附带去除缩放黑背景
2014/04/01 PHP
Zend Framework创建自己的动作助手详解
2016/03/05 PHP
php处理抢购类功能的高并发请求
2018/02/08 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
jquery中的$(document).ready()与window.onload的区别
2009/11/18 Javascript
Javascript中的isNaN函数使用说明
2011/11/10 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
jQuery随便控制任意div隐藏的方法
2013/06/28 Javascript
纯JS实现动态时间显示代码
2014/02/08 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
Angular.js中$resource高大上的数据交互详解
2017/07/30 Javascript
webpack4 + react 搭建多页面应用示例
2018/08/03 Javascript
总结javascript三元运算符知识点
2018/09/28 Javascript
详解vue如何使用rules对表单字段进行校验
2018/10/17 Javascript
vue写h5页面的方法总结
2019/02/12 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
Node.js之删除文件夹(含递归删除)代码实例
2019/09/09 Javascript
python调用新浪微博API项目实践
2014/07/28 Python
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
Django添加sitemap的方法示例
2018/08/06 Python
python打开windows应用程序的实例
2019/06/28 Python
Pyinstaller 打包exe教程及问题解决
2019/08/16 Python
python Pillow图像处理方法汇总
2019/10/16 Python
python Django框架实现web端分页呈现数据
2019/10/31 Python
python与mysql数据库交互的实现
2020/01/06 Python
PyCharm无法识别PyQt5的2种解决方法,ModuleNotFoundError: No module named 'pyqt5'
2020/02/17 Python
Python爬虫与反爬虫大战
2020/07/30 Python
Prometheus开发中间件Exporter过程详解
2020/11/30 Python
Django数据模型中on_delete使用详解
2020/11/30 Python
你正在寻找的CSS3 动画技术
2011/07/27 HTML / CSS
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
乱丢垃圾袋检讨书
2014/10/08 职场文书
结婚保证书(三从四德)
2015/02/26 职场文书
2015国际残疾人日活动总结
2015/03/24 职场文书