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 list 合并连接字符串的方法
Mar 09 Python
python高并发异步服务器核心库forkcore使用方法
Nov 26 Python
用Python将动态GIF图片倒放播放的方法
Nov 02 Python
Python编程之微信推送模板消息功能示例
Aug 21 Python
Python Pandas找到缺失值的位置方法
Apr 12 Python
python实现弹窗祝福效果
Apr 07 Python
python KNN算法实现鸢尾花数据集分类
Oct 24 Python
Python多线程threading创建及使用方法解析
Jun 17 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 Python
Django项目在pycharm新建的步骤方法
Mar 02 Python
python脚本框架webpy的url映射详解
Nov 20 Python
Python if else条件语句形式详解
Mar 24 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
跟我学小偷程序之成功偷取首页(第三天)
2006/10/09 PHP
PHP 创建标签云函数代码
2010/05/26 PHP
php模拟asp中的XmlHttpRequest实现http请求的代码
2011/03/24 PHP
php 随机排序广告的实现代码
2011/05/09 PHP
php实现将Session写入数据库
2015/07/26 PHP
PHP判断数组是否为空的常用方法(五种方法)
2017/02/08 PHP
Laravel框架基础语法与知识点整理【模板变量、输出、include引入子视图等】
2019/12/03 PHP
php数组函数array_push()、array_pop()及array_shift()简单用法示例
2020/01/26 PHP
html读出文本文件内容
2007/01/22 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
2016/03/14 Javascript
基于jquery实现简单的分页控件
2016/03/17 Javascript
jQuery使用ajax跨域获取数据的简单实例
2016/05/18 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
2016/10/31 Javascript
javascript实现一个网页加载进度loading
2017/01/04 Javascript
jQuery-ui插件sortable实现自由拖动排序
2018/12/01 jQuery
React通过redux-persist持久化数据存储的方法示例
2019/02/14 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
简单了解vue中的v-if和v-show的区别
2019/10/08 Javascript
Vue.js下拉菜单组件使用方法详解
2019/10/19 Javascript
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
Opencv图像处理:如何判断图片里某个颜色值占的比例
2020/06/03 Python
python如何保存文本文件
2020/06/07 Python
python3.8动态人脸识别的实现示例
2020/09/21 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
2021/02/06 Python
HTML table 表格边框的实现思路
2019/10/12 HTML / CSS
如何用PHP实现邮件发送
2012/12/26 面试题
电大物流学生的自我评价
2013/10/25 职场文书
秋季运动会通讯稿
2014/01/24 职场文书
法人授权委托书
2014/09/16 职场文书
临时租车协议范本
2014/09/23 职场文书
党员评议思想汇报
2014/10/08 职场文书
2014年高校辅导员工作总结
2014/12/09 职场文书
2015建军节87周年演讲稿
2015/03/19 职场文书
2019年幼儿园管理条例范本!
2019/07/17 职场文书
关于拾金不昧的感谢信(五篇)
2019/10/18 职场文书
MYSQL如何查看操作日志详解
2022/05/30 MySQL