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实现更改图片尺寸大小的方法(基于Pillow包)
Sep 19 Python
Python迭代和迭代器详解
Nov 10 Python
flask使用session保存登录状态及拦截未登录请求代码
Jan 19 Python
python2.7安装图文教程
Mar 13 Python
python psutil库安装教程
Mar 19 Python
python爬虫实例详解
Jun 19 Python
python添加模块搜索路径和包的导入方法
Jan 19 Python
Django中使用Whoosh进行全文检索的方法
Mar 31 Python
Django使用中间键实现csrf认证详解
Jul 22 Python
Django中URL的参数传递的实现
Aug 04 Python
用什么库写 Python 命令行程序(示例代码详解)
Feb 20 Python
OpenCV利用python来实现图像的直方图均衡化
Oct 21 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
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
2013/04/08 PHP
php获取qq用户昵称和在线状态(实例分析)
2013/10/27 PHP
浅谈Eclipse PDT调试PHP程序
2014/06/09 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
PHP错误和异常处理功能模块示例
2016/11/12 PHP
Laravel框架实现定时发布任务的方法
2018/08/16 PHP
PHP树形结构tree类用法示例
2019/02/01 PHP
js计算页面刷新的次数
2009/07/20 Javascript
Javascript事件热键兼容ie|firefox
2010/12/30 Javascript
JavaScript实现的encode64加密算法实例分析
2015/04/15 Javascript
通过js修改input、select默认字体颜色
2017/04/19 Javascript
Angular排序实例详解
2017/06/28 Javascript
EasyUI创建人员树的实例代码
2017/09/15 Javascript
jquery获取元素到屏幕四周可视距离的方法
2018/09/05 jQuery
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
Python实现的一个找零钱的小程序代码分享
2014/08/25 Python
wxPython窗口中文乱码解决方法
2014/10/11 Python
django的ORM模型的实现原理
2019/03/04 Python
python实现QQ空间自动点赞功能
2019/04/09 Python
python3调用windows dos命令的例子
2019/08/14 Python
Python如何把十进制数转换成ip地址
2020/05/25 Python
使用Python项目生成所有依赖包的清单方式
2020/07/13 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
HTML5、Select下拉框右边加图标的实现代码(增进用户体验)
2017/10/16 HTML / CSS
布里斯班女装时尚品牌:Adrift
2017/12/28 全球购物
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
年终自我鉴定
2013/10/09 职场文书
毕业生自我鉴定实例
2014/01/21 职场文书
薪酬专员岗位职责
2014/02/18 职场文书
如何理解Vue前后端数据交互与显示
2021/05/10 Vue.js
go语言中http超时引发的事故解决
2021/06/02 Golang
Java Spring读取和存储详细操作
2022/08/05 Java/Android