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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
centos系统升级python 2.7.3
Jul 03 Python
Python模块搜索概念介绍及模块安装方法介绍
Jun 03 Python
Django中url的反向查询的方法
Mar 14 Python
使用Python和Prometheus跟踪天气的使用方法
May 06 Python
python 寻找离散序列极值点的方法
Jul 10 Python
python读取Kafka实例
Dec 23 Python
在Python IDLE 下调用anaconda中的库教程
Mar 09 Python
Python2.x与3​​.x版本有哪些区别
Jul 09 Python
Python下opencv使用hough变换检测直线与圆
Jun 18 Python
python3实现常见的排序算法(示例代码)
Jul 04 Python
Python OpenCV实现图形检测示例详解
Apr 08 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
CI框架装载器Loader.php源码分析
2014/11/04 PHP
PHP程序中使用adodb连接不同数据库的代码实例
2015/12/19 PHP
实现PHP搜索加分页
2016/10/12 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
CSS心形加载的动画源码的实现
2021/03/09 HTML / CSS
Javascript 检测、添加、移除样式(className)函数代码
2009/09/08 Javascript
js 居中漂浮广告
2010/03/21 Javascript
jquery 学习之二 属性(类)
2010/11/25 Javascript
setInterval与clearInterval的使用示例代码
2014/01/28 Javascript
基于javascript显示当前时间以及倒计时功能
2016/03/18 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
基于vue.js实现图片轮播效果
2016/12/01 Javascript
基于JS递归函数细化认识及实用实例(推荐)
2017/08/07 Javascript
深入了解js原型模式
2019/05/30 Javascript
微信小程序实现折线图的示例代码
2019/06/07 Javascript
vue配置文件实现代理v2版本的方法
2019/06/21 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
浅谈鸿蒙 JavaScript GUI 技术栈
2020/09/17 Javascript
介绍Python的Urllib库的一些高级用法
2015/04/30 Python
理解生产者消费者模型及在Python编程中的运用实例
2016/06/26 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
Python中pandas dataframe删除一行或一列:drop函数详解
2018/07/03 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
关于Pytorch的MLP模块实现方式
2020/01/07 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
HTML5 canvas基本绘图之绘制阴影效果
2016/06/27 HTML / CSS
用HTML5制作视频拼图的教程
2015/05/13 HTML / CSS
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
建筑工程技术应届生自荐信
2013/09/27 职场文书
国际贸易专业个人求职信格式
2014/02/02 职场文书
文秘个人求职信范文
2014/04/22 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
2015年清剿火患专项行动工作总结
2015/07/27 职场文书
五星级酒店宣传口号
2015/12/25 职场文书