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方的得分最小(因为对手也就是人类,也可以选择最优策略)。

当然这样的搜索其计算量是极大的,这时候就需要剪枝来减少计算量。例如下图:

其中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五子棋内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python编写五子棋游戏

    本文实例为大家分享了python编写五子棋游戏的具体代码,供大家参考,具体内容如下 游戏代码及部分注释 import pygame #导入pygame游戏模块 import time #调用time库 import sys from pygame.locals import * initChessList = [] #保存的是棋盘坐标 initRole = 1 #1:代表白棋: 2:代表黑棋 resultFlag = 0 #结果标志 class StornPoint(): def __init_

  • python实现网络五子棋

    本文实例为大家分享了python实现网络五子棋的具体代码,供大家参考,具体内容如下 服务器端: import os import socket import threading from tkinter import * from tkinter.messagebox import * def drawQiPan(): for i in range(0, 15): cv.create_line(20, 20 + 40 * i, 580, 20 + 40 * i, width=2) for i i

  • python游戏实战项目之智能五子棋

    目录 导语 正文 总结 导语 ​ 今日游戏更新,大家好,我是木木子,每天都给大家更新最好玩的游戏!关注我,从此你再也不用去费力找游戏了! 最热门最好玩的Python游戏点击即玩! 今天推荐的游戏是五子棋小游戏--人机对战.联机对战皆可! 你是否还记得?中学时代和同桌下过的五子棋? ​ 这样下棋只怕是会被打!​!!!我怀疑他开挂了,并且找到了证据. ​ 正文 首先准备好需要的图片等素材部分如下: ​​​ 好了!直接上代码吧--设置游戏开始界面: class gameStartUI(QWidget)

  • python实现双人五子棋(终端版)

    五子棋还是有很多大佬发的,今天我也发一篇萌新写的小五子棋 这个是终端版的,如果有问题请大家指出,我去修改 代码如下: screen = [] screen_change=0 def into():#初始空白棋盘 for i in range(screen_change): list_width=[] for j in range(screen_change): list_width.append(' '+' |') screen.append(list_width) def user_black

  • Python tkinter制作单机五子棋游戏

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Python家庭,作者Python家庭 实战项目:使用Python编写一个能够完成基本对战的五子棋游戏.面向新手. 程序主要包括两个部分,图形创建与逻辑编写两部分. 程序的运行结果: 样式创建 老规矩,先把用到的包导入进来. from tkinter import * import math 然后建立一个样式的类,类名称chessBoard.这里加了很多注释,避免

  • python单机五子棋的代码实现示例

    五子棋相信大家都玩过,那么你们有没有试过自己动手编写过五子棋呢?今天来带着大家实现以下五子棋. def initChessSquare(x,y): #初始化棋盘 for i in range(15): # 每一行的交叉点坐标 rowlist = [] for j in range(15): # 每一列的交叉点坐标 pointX = x+ j*40 pointY = y+ i*40 sp = StornPoint(pointX,pointY,0) rowlist.append(sp) initCh

  • Python五子棋小游戏实例分享

    本文实例为大家分享了Python实现五子棋小游戏的具体代码,供大家参考,具体内容如下 使用的库 pygame.pyautogui 流程简述 1.画棋盘 设置网格间隔40px ,留白 80 px ,与网格横竖线数量 ,初定19 × 19 . 2.鼠标点击 鼠标点击取得坐坐标(x0 , y0),再获得最近的网格上的点(x1 , y1),再将每次动作获得的(x1 , y1 )放入列表 chess_location 中. 再通过: chess_location_b = chess_location[0:

  • python游戏实战项目之智能五子棋简易版

    目录 导语 正文 总结 导语 前段时间不是制作了一款升级版本五子棋的嘛! 但是居然有粉丝私信我说: "准备拿到代码玩一下ok过去了!太难了准备放收藏夹落灰q@q~" 所噶,今天先放一个简易版本的五子棋给大家看看!学习嘛~从简单到难 还是慢慢来撒~ 学玩这篇可以学下一篇难一点的撒: Pygame实战:下五子棋吗?信不信我让你几步你也赢不了?​​​​​​​ 正文 嘿嘿!这五子棋只有人机对战了哈!不要看人机对战感觉很简单,其实代码量也超多滴. 主要代码:都有注释的撒!就不一步一步介绍了. i

  • 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.Q

  • Python游戏开发之魔塔小游戏的实现

    前言 这一期我们继续完善我们的魔塔小游戏. 废话不多说,让我们愉快地开始吧~ 开发工具 Python版本: 3.7.4 相关模块: cpgames模块: 以及一些python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 本期我们实现一些之前还没实现的功能,以及做一些功能优化(部分内容为了测试方便,我会把人物设置成无敌状态).首先,是拾取物品等游戏事件的提示效果,核心代码如下: '''游戏事件提示''' def showinfo(self, s

  • Pygame游戏开发实例讲解之图形绘制与键鼠事件

    目录 图形绘制 绘制矩形 绘制直线 绘制圆弧 案例 键鼠事件 键盘事件 鼠标事件 图形绘制 格式: pygame.draw.circle(surface, color, center, radius, width=0, draw_top_right=None, draw_top_left=None, draw_bottom_left=None, draw_bottom_right=None) 参数: surface: 需要绘制的表面 color: RGB 格式, 圆形的颜色 center: 元组

  • Python图形用户界面与游戏开发实例详解

    目录 前言 基于tkinter模块的GUI 基于wxPython模块的GUI Pygame游戏开发 1.在游戏窗口中绘图 2.图形的处理 3.动画效果 4.碰撞检测 5.事件处理 总结 前言 对于使用过计算机的人,应该对图形用户界面(GUI)应该都不会太陌生,这里就不在赘述.那么对于python这样的动态语言有没有GUI相关的库呢?答案是肯定有的,那么常见的有哪些呢?主要有tkinter.wxPython.PyQt.PyGTK等模块,而tkinter是python默认的模块,没有功能特别强大的G

  • python游戏开发的五个案例分享

    一.序列应用--猜单词游戏 1. 游戏介绍 猜单词游戏就是计筧机随机产生一个单词,打乱字母顺序,供玩家去猜测.此游戏采用控制字符界面, 2.  程序设计思路 游戏中,可使用序列中的元组存储所有待猜测的单词.因为猜单词游戏需要随机产生某个待猜测单词以及随机数字,所以引入random模块随机数函数.其中,random.choice()可以从序列中随机选取元素. 在游戏中,随机挑出一个单词word后,把单词word的字母顺序打乱的方法是随机单词字符串中选择一个位置position,把position位

  • python游戏开发之视频转彩色字符动画

    本文实例为大家分享了python视频转彩色字符动画的具体代码,供大家参考,具体内容如下 一.效果 原图: 转换后: 效果可通过代码开头几行的参数调节 二.代码 开头几行代码,自己看着调整,把效果调到最佳就ok. 依赖库: pip install opencv-python pip install pygame 代码: import pygame import cv2 FONT_SIZE = 18 # 字体大小,可自行调整 WIN_SIZE = (1440, 1000) # 窗口大小,可自行调整

  • Python计算斗牛游戏概率算法实例分析

    本文实例讲述了Python计算斗牛游戏概率算法.分享给大家供大家参考,具体如下: 过年回家,都会约上亲朋好友聚聚会,会上经常会打麻将,斗地主,斗牛.在这些游戏中,斗牛是最受欢迎的,因为可以很多人一起玩,而且没有技术含量,都是看运气(专业术语是概率). 斗牛的玩法是: 1. 把牌中的JQK都拿出来 2. 每个人发5张牌 3. 如果5张牌中任意三张加在一起是10的 倍数,就是有牛.剩下两张牌的和的10的余数就是牛数. 牌的大小: 4条 > 3条 > 牛十 > 牛九 > -- >

  • Android游戏开发学习之引擎用法实例详解

    本文实例讲述了Android游戏开发学习之引擎用法.分享给大家供大家参考.具体如下: 汽车引擎是汽车的心脏,其决定了汽车的性能和稳定性,是人们在购车时相当关注的.而游戏中的物理引擎就如汽车的引擎一样,占据了非常重要的位置.一款好的物理引擎可以非常真实地模拟现实世界,使得游戏更加逼真,提供更好的娱乐体验. 一.JBox2D简介 JBox2D是开源物理引擎Box2D的Java版本,可以直接用于Android.由于JBox2D的图形渲染使用的是Processing库,因此在Android平台上使用JB

  • python能开发游戏吗

    python可以写游戏,但不适合.下面我们来分析一下具体原因. 用锤子能造汽车吗? 谁也没法说不能吧?历史上也确实曾经有些汽车,是用锤子造出来的.但一般来说,还是用工业机器人更合适对吗? 比较大型的,使用Python的游戏有两个,一个是<EVE>,还有一个是<文明>.但这仅仅是个例,没有广泛意义. 一般来说,用来做游戏的语言,有两种.一是C++..一是C#.. Python理论上,不仅不适合做游戏,而是只要大型的程序,都不适合.只适合写比较小型的东西,比如一个计算器,一个爬虫等.

  • HTML5开发Kinect体感游戏的实例应用

    HTML5开发Kinect体感游戏的实例应用 一.简介 我们要做的是怎样一款游戏? 在前不久成都TGC2016展会上,我们开发了一款<火影忍者手游>的体感游戏,主要模拟手游章节<九尾袭来 >,用户化身四代,与九尾进行对决,吸引了大量玩家参与. 表面上看,这款游戏与其它体感体验无异,实际上,它一直运行于浏览器Chrome下,也就是说,我们只需要掌握前端相应技术,就可以开发基于Kinect的网页体感游戏. 二.实现原理 实现思路是什么? 使用H5开发基于Kinect的体感游戏,其实工作

随机推荐