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数据结构之链表的实例讲解
Jul 25 Python
python检测主机的连通性并记录到文件的实例
Jun 21 Python
Python编程flask使用页面模版的方法
Dec 28 Python
Python中py文件转换成exe可执行文件的方法
Jun 14 Python
在django view中给form传入参数的例子
Jul 19 Python
pymysql模块的使用(增删改查)详解
Sep 09 Python
python tkinter组件使用详解
Sep 16 Python
如何基于python生成list的所有的子集
Nov 11 Python
Python3 实现减少可调用对象的参数个数
Dec 20 Python
python连接PostgreSQL过程解析
Feb 09 Python
pytorch中的inference使用实例
Feb 20 Python
利用python如何实现猫捉老鼠小游戏
Dec 04 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之第八天
2006/10/09 PHP
为PHP初学者的8点有效建议
2010/11/20 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
smarty实现多级分类的方法
2014/12/05 PHP
PHP中new static()与new self()的比较
2016/08/19 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
Google Maps API地图应用示例分享
2014/10/23 Javascript
浅谈jQuery中的事件
2015/03/23 Javascript
Javascript对象Clone实例分析
2015/06/09 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
jQuery 弹出层插件(推荐)
2016/05/24 Javascript
angular使用post、get向后台传参的问题实例
2017/05/27 Javascript
JS实现中文汉字按拼音排序的方法
2017/10/09 Javascript
cordova入门基础教程及使用中遇到的一些问题总结
2017/11/14 Javascript
微信小程序获取用户信息及手机号(后端TP5.0)
2019/09/12 Javascript
js实现双人五子棋小游戏
2020/05/28 Javascript
Bootstrap告警框(alert)实现弹出效果和短暂显示后上浮消失的示例代码
2020/08/27 Javascript
python生成指定尺寸缩略图的示例
2014/05/07 Python
Python使用百度API上传文件到百度网盘代码分享
2014/11/08 Python
Python 模板引擎的注入问题分析
2017/01/01 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
python中while和for的区别总结
2019/06/28 Python
python django中8000端口被占用的解决
2019/12/17 Python
Python vtk读取并显示dicom文件示例
2020/01/13 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
python异常处理、自定义异常、断言原理与用法分析
2020/03/23 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
Python爬虫过程解析之多线程获取小米应用商店数据
2020/11/14 Python
开发人员所需要知道的HTML5性能分析面面观
2012/07/05 HTML / CSS
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
澳大利亚在线购买儿童玩具:Toy Universe
2017/12/28 全球购物
师范生实习的个人自我鉴定
2013/10/20 职场文书
九年级体育教学反思
2014/01/23 职场文书
品牌服务方案
2014/06/03 职场文书
2015年生产车间工作总结
2015/04/22 职场文书
2015年建筑工作总结报告
2015/05/04 职场文书