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 相关文章推荐
PyCharm使用教程之搭建Python开发环境
Jun 07 Python
Python实现读取文件最后n行的方法
Feb 23 Python
Python实现的异步代理爬虫及代理池
Mar 17 Python
Python中对象的引用与复制代码示例
Dec 04 Python
初探TensorFLow从文件读取图片的四种方式
Feb 06 Python
python使用epoll实现服务端的方法
Oct 16 Python
python合并已经存在的sheet数据到新sheet的方法
Dec 11 Python
Django分页功能的实现代码详解
Jul 29 Python
scrapy与selenium结合爬取数据(爬取动态网站)的示例代码
Sep 28 Python
selenium+超级鹰实现模拟登录12306
Jan 24 Python
Pytorch实现图像识别之数字识别(附详细注释)
May 11 Python
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
May 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
PHPMailer邮件发送的实现代码
2013/05/04 PHP
PHP设计模式之结构模式的深入解析
2013/06/13 PHP
php打开远程文件的方法和风险及解决方法
2013/11/12 PHP
php+mysqli使用面向对象方式更新数据库实例
2015/01/29 PHP
php实现Mysql简易操作类
2015/10/11 PHP
PHP浮点比较大小的方法
2016/02/14 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
JavaScript Perfection kill 测试及答案
2010/03/23 Javascript
javascript 运算数的求值顺序
2011/08/23 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
在AngularJS中使用AJAX的方法
2015/06/17 Javascript
chrome调试javascript详解
2015/10/21 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
jQuery实现将div中滚动条滚动到指定位置的方法
2016/08/10 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
jQuery动态创建元素以及追加节点的实现方法
2016/10/20 Javascript
微信小程序 支付简单实例及注意事项
2017/01/06 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
requirejs按需加载angularjs文件实例
2017/06/08 Javascript
详解使用create-react-app快速构建React开发环境
2018/05/16 Javascript
vue 双向数据绑定的实现学习之监听器的实现方法
2018/11/30 Javascript
浅析Vue中拆分视图层代码的5点建议
2019/08/15 Javascript
js实现随机div颜色位置 类似满天星效果
2019/10/24 Javascript
Python程序设计入门(2)变量类型简介
2014/06/16 Python
Python中的复制操作及copy模块中的浅拷贝与深拷贝方法
2016/07/02 Python
利用Python yagmail三行代码实现发送邮件
2018/05/11 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
基于HTML5 Canvas的3D动态Chart图表的示例
2017/11/02 HTML / CSS
HTML实现代码雨源码及效果示例
2020/02/25 HTML / CSS
财经学院自荐信范文
2014/02/02 职场文书
2014标准社保办理委托书
2014/10/06 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
党员干部学法用法心得体会
2016/01/21 职场文书
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android
叶县这家生产军用电台的兵工厂,人称“四机部”,走出一上将
2022/02/18 无线电
「玫瑰之王的葬礼」舞台剧主视觉图公开
2022/03/21 日漫