c++游戏程序例子_组合游戏系列3: 井字棋、五子棋的OpenAI Gym GUI环境

继上一篇完成了井字棋(N子棋)的minimax 最佳策略后,我们基于Pygame来创造一个图形游戏环境,可供人机和机器对弈,为后续模拟AlphaGo的自我强化学习算法做环境准备。OpenAI Gym 在强化学习领域是事实标准,我们最终封装成OpenAI Gym的接口。本篇所有代码都在github.com/MyEncyclopedia/ConnectNGym。

  • 第一篇: Leetcode中的Minimax 和 Alpha Beta剪枝

  • 第二篇: 井字棋Leetcode系列题解和Minimax最佳策略实现

  • 第三篇: 井字棋、五子棋的OpenAI Gym GUI环境

  • 第四篇: 井字棋、五子棋的蒙特卡洛树搜索(MCTS)

井字棋、五子棋 Pygame 实现

76f59f82c730e4a5b48adde879e745b1.gif  
Pygame 井字棋玩家对弈效果

Python 上有Tkinter,PyQt等跨平台GUI类库,主要用于桌面程序编程,但此类库容量较大,编程也相对麻烦。Pygame具有代码少,开发快的优势,比较适合快速开发五子棋这类桌面小游戏。

Pygame 极简入门

与所有的GUI开发相同,Pygame也是基于事件的单线程编程模型。下面的例子包含了显示一个最简单GUI窗口,操作系统产生事件并发送到Pygame窗口,while True 控制了python主线程永远轮询事件。我们在这里仅仅判断了当前是否是关闭应用程序事件,如果是则退出进程。此外,clock 用于控制FPS。

import sys
import pygame
pygame.init()
display = pygame.display.set_mode((800,600))
clock = pygame.time.Clock()

while True:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      sys.exit(0)
    else:
      pygame.display.update()
      clock.tick(1)

PyGameBoard 主体代码

PyGameBoard类封装了Pygame实现游戏交互和显示的逻辑。上一篇中,我们完成了ConnectNGame逻辑,这里PyGameBoard需要在初始化时,指定传入ConnectNGame 实例(见下图),支持通过API 方式改变其状态,也支持GUI交互方式等待人类玩家的输入。next_user_input(self)实现了等待人类玩家输入的逻辑,本质上是循环检查GUI事件直到有合法的落子产生。

f0cdf081-de4d-eb11-8da9-e4434bdf6706.svg  
PyGameBoard Class Diagram
class PyGameBoard:

 def __init__(self, connectNGame: ConnectNGame):
  self.connectNGame = connectNGame
  pygame.init()

 def next_user_input(self) -> Tuple[int, int]:
  self.action = None
  while not self.action:
   self.check_event()
   self._render()
   self.clock.tick(60)
  return self.action
  
  def move(self, r: int, c: int) -> int:
  return self.connectNGame.move(r, c)
  
if __name__ == '__main__':
 connectNGame = ConnectNGame()
 pygameBoard = PyGameBoard(connectNGame)
 while not pygameBoard.isGameOver():
  pos = pygameBoard.next_user_input()
  pygameBoard.move(*pos)

 pygame.quit()

check_event 较之极简版本增加了处理用户输入事件,这里我们仅支持人类玩家鼠标输入。方法_handle_user_input 将鼠标点击事件转换成棋盘行列值,并判断点击位置是否合法,合法则返回落子位置,类型为Tuple[int, int],例如(0, 0)表示棋盘最左上角位置。

def check_event(self):
 for e in pygame.event.get():
  if e.type == pygame.QUIT:
   pygame.quit()
   sys.exit(0)
  elif e.type == pygame.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值