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的正则表达式re模块的常用方法
Mar 09 Python
Python中的Numpy入门教程
Apr 26 Python
Python中的自定义函数学习笔记
Sep 23 Python
python中ConfigParse模块的用法
Sep 29 Python
Python入门篇之文件
Oct 20 Python
Python实现数通设备端口使用情况监控实例
Jul 15 Python
Python数据分析之如何利用pandas查询数据示例代码
Sep 01 Python
Anaconda 离线安装 python 包的操作方法
Jun 11 Python
Python使用selenium + headless chrome获取网页内容的方法示例
Oct 16 Python
Python3.7 读取 mp3 音频文件生成波形图效果
Nov 05 Python
python把一个字符串切开的实例方法
Sep 27 Python
聊聊Python pandas 中loc函数的使用,及跟iloc的区别说明
Mar 03 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
php中关于普通表单多文件上传的处理方法
2011/03/25 PHP
php实现图片添加描边字和马赛克的方法
2014/12/10 PHP
thinkPHP查询方式小结
2016/01/09 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
Ajax请求PHP后台接口返回信息的实例代码
2018/08/21 PHP
PHP观察者模式实例分析【对比JS观察者模式】
2019/05/22 PHP
javascript 传统事件模型构造的事件监听器实现代码
2010/05/31 Javascript
理运用命名空间让js不产生冲突避免全局变量的泛滥
2014/06/15 Javascript
node.js中的url.resolve方法使用说明
2014/12/10 Javascript
jQuery中change事件用法实例
2014/12/26 Javascript
AngularJS中监视Scope变量以及外部调用Scope方法
2016/01/23 Javascript
原生js实现addClass,removeClass,hasClass方法
2016/04/27 Javascript
浅谈JS继承_寄生式继承 & 寄生组合式继承
2016/08/16 Javascript
分享JS代码实现鼠标放在输入框上输入框和图片同时更换样式
2016/09/01 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
解决webpack -p压缩打包react报语法错误的方法
2017/07/03 Javascript
vue-cli脚手架引入图片的几种方法总结
2018/03/13 Javascript
python聊天程序实例代码分享
2013/11/18 Python
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
Python对数据库操作
2016/03/28 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
如何利用Fabric自动化你的任务
2016/10/20 Python
python 实现将txt文件多行合并为一行并将中间的空格去掉方法
2018/12/20 Python
在Django下测试与调试REST API的方法详解
2019/08/29 Python
Matplotlib绘制雷达图和三维图的示例代码
2020/01/07 Python
基于Keras 循环训练模型跑数据时内存泄漏的解决方式
2020/06/11 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
OpenCV利用python来实现图像的直方图均衡化
2020/10/21 Python
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
旧时光糖果:Old Time Candy
2018/02/05 全球购物
Notino芬兰:购买香水和化妆品
2019/04/15 全球购物
公安机关党的群众路线教育实践活动剖析材料
2014/10/10 职场文书
自查自纠整改报告
2014/11/06 职场文书
使用Spring处理x-www-form-urlencoded方式
2021/11/02 Java/Android
python脚本框架webpy的url映射详解
2021/11/20 Python
MySQL提升大量数据查询效率的优化神器
2022/07/07 MySQL