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备份文件以及mysql数据库的脚本代码
Jun 10 Python
python中as用法实例分析
Apr 30 Python
详解Python的Django框架中的模版相关知识
Jul 15 Python
Python 多线程Threading初学教程
Aug 22 Python
python的Tqdm模块的使用
Jan 10 Python
详细解读tornado协程(coroutine)原理
Jan 15 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
pygame实现俄罗斯方块游戏(基础篇1)
Oct 29 Python
python3+opencv生成不规则黑白mask实例
Feb 19 Python
如何一键升级Python所有包
Nov 05 Python
详解Python描述符的工作原理
Jun 11 Python
Python pandas之求和运算和非空值个数统计
Aug 07 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打包压缩文件之ZipArchive方法用法分析
2016/04/30 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
Jquery Post处理后不进入回调的原因及解决方法
2014/07/15 Javascript
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
第一次接触神奇的Bootstrap菜单和导航
2016/08/01 Javascript
JavaScript制作简单分页插件
2016/09/11 Javascript
Sublime Text新建.vue模板并高亮(图文教程)
2017/10/26 Javascript
Nuxt.js实战详解
2018/01/18 Javascript
Vue脚手架的简单使用实例
2018/07/10 Javascript
Angular ElementRef简介及其使用
2018/10/01 Javascript
关于vue-cli 3配置打包优化要点(推荐)
2019/04/22 Javascript
JQuery常用简单动画操作方法回顾与总结
2019/12/07 jQuery
antd-DatePicker组件获取时间值,及相关设置方式
2020/10/27 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
解决python3运行selenium下HTMLTestRunner报错的问题
2018/12/27 Python
python for 循环获取index索引的方法
2019/02/01 Python
Python  Django 母版和继承解析
2019/08/09 Python
python批量解压zip文件的方法
2019/08/20 Python
python多任务之协程的使用详解
2019/08/26 Python
Django REST framework 单元测试实例解析
2019/11/07 Python
matplotlib 对坐标的控制,加图例注释的操作
2020/04/17 Python
Python如何发送与接收大型数组
2020/08/07 Python
汽车销售求职自荐信
2013/10/01 职场文书
信息服务专业毕业生求职信
2014/03/02 职场文书
高中教师评语大全
2014/04/25 职场文书
安全演讲稿开场白
2014/08/25 职场文书
相亲活动方案
2014/08/26 职场文书
无犯罪记录证明
2014/09/19 职场文书
2015年幼儿园元旦游艺活动策划书
2014/12/09 职场文书
爱情保证书
2015/01/17 职场文书
世界遗产的导游词
2015/02/13 职场文书
作弊检讨书范文
2015/05/06 职场文书
2016年暑假学生家长评语
2015/12/01 职场文书
Python通过loop.run_in_executor执行同步代码 同步变为异步
2022/04/11 Python