增强学习系列之(三):实现一个打砖块的游戏

1.Acknowledgement

本篇文章中神经网络的结构主要来自于DeepMind的这篇论文
https://www.cs.toronto.edu/~vmnih/docs/dqn.pdf

2. 实现效果

我们要实现的这个游戏,在openai的gym里面,叫做breakout,使用的是v3版本,初始化环境的时候需要声明一下

我们想要实现的效果,基本上是这样的
这里写图片描述

这里写图片描述

输入就是每一帧的图像,输出是当前应该采取的动作

一开始agent只会做随机的运动,在训练了一段时间之后,就可以精准的接住球了

3. 基本框架

基本框架这之前基本相同,都是采用Q-Learning算法

这里写图片描述

具体解释看这篇文章

http://blog.csdn.net/supercally/article/details/54767499

4. 与之前简单版本的区别

最大的区别有这几点:

1. 输入是原始的图像数据

输入是210 * 160 * 3的图像,我们稍作处理,把边上不需要的像素去掉之后降阶采样灰度化,将80 * 80 * 1的图像作为算法的输入

2. 用最近的四帧的序列作为输入

神经网络的输入不是单帧的图像,而是最近的连续四帧图像作为输入。这也很好理解,因为这样就加入了时间序列。对于打砖块这个游戏,如果只用一帧作输入的话,虽然砖块在同一个位置,但是可能是向好几个方向运动的,agent无法判断它的价值。

但是如果我们添加了最近几帧,agent就可以根据前后的时间判断出是向哪个方向运动的,这个状态就完整了

3. 卷积神经网络的结构

在用神经网络判断价值方面,与之前不同。之前简单的训练网络是用了一个隐层的网络来实现的,但是对于处理图像的任务,我们使用的是卷积神经网络

使用的网络的结构是这样的

这里写图片描述

卷积神经网络的大小这样计算

Sizeoutput=WF
  • 6
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 可以的!我可以给你一些简单的步骤: 1. 创建一个窗口,用于显示游戏 2. 加载图像,用于显示砖块和挡板 3. 创建一个循环,用于更新游戏内容 4. 在循环中,检查键盘输入,以控制挡板的移动 5. 检查砖块是否和挡板相撞,如果相撞,就移动砖块的方向 6. 检查砖块是否落地,如果落地,就将砖块从屏幕上移除 7. 如果所有砖块都被移除,就表示游戏结束,显示胜利消息 ### 回答2: 打砖块是一种经典的游戏,我们可以使用Python来实现一个简单的版本。首先,我们需要使用pygame库来创建游戏窗口和处理游戏逻辑。 在游戏开始时,我们要绘制一个滑块和一排砖块。滑块可以通过键盘的左右方向键来控制,用于接住从顶部下落的小球。砖块可以用二维数组表示,其中每个元素代表一个砖块的状态(是否被破坏)。 游戏的主循环中,我们需要检测用户的输入,并根据输入来移动滑块。同时,我们还需要不断地更新小球的位置,并检测其与滑块和砖块的碰撞。如果小球与滑块碰撞,则反弹回去;如果小球与砖块碰撞,则砖块被破坏并得分增加。 当所有砖块都被破坏或小球触底时,游戏结束。我们可以在游戏结束后显示得分,并等待用户选择重新开始或退出游戏。 总结起来,用Python写一个打砖块游戏需要完成以下几个步骤: 1. 导入pygame库和其他必要的模块。 2. 初始化游戏窗口和游戏变量。 3. 绘制游戏元素,包括滑块和砖块。 4. 创建游戏主循环,处理用户的输入和更新游戏逻辑。 5. 创建碰撞检测函数,处理小球与滑块和砖块的碰撞。 6. 处理游戏结束时的逻辑和用户选择。 以上是一个简单的打砖块游戏实现的大致步骤,通过使用Python和pygame库,我们可以实现一个简单但有趣的游戏。当然,我们还可以进一步优化和添加更多的功能来提升游戏的可玩性。 ### 回答3: 打砖块游戏是一款经典的游戏,我们可以使用Python编写一个简单的版本。 首先,我们需要导入pygame库。你可以使用pip命令在终端上安装: ``` pip install pygame ``` 然后,创建一个游戏窗口,并初始化pygame的库: ```python import pygame from pygame.locals import * SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 pygame.init() screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption("打砖块游戏") ``` 接下来,我们可以使用pygame的图形绘制功能来创建砖块、球和挡板: ```python BRICK_WIDTH = 60 BRICK_HEIGHT = 20 BRICK_COLOR = (255, 0, 0) PADDLE_WIDTH = 100 PADDLE_HEIGHT = 10 PADDLE_COLOR = (0, 0, 255) BALL_RADIUS = 10 BALL_COLOR = (0, 255, 0) brick = pygame.Rect(0, 0, BRICK_WIDTH, BRICK_HEIGHT) paddle = pygame.Rect(0, SCREEN_HEIGHT - PADDLE_HEIGHT, PADDLE_WIDTH, PADDLE_HEIGHT) ball = pygame.Rect(SCREEN_WIDTH // 2 - BALL_RADIUS, SCREEN_HEIGHT // 2 - BALL_RADIUS, BALL_RADIUS, BALL_RADIUS) def draw(): screen.fill((0, 0, 0)) pygame.draw.rect(screen, BRICK_COLOR, brick) pygame.draw.rect(screen, PADDLE_COLOR, paddle) pygame.draw.circle(screen, BALL_COLOR, ball.center, BALL_RADIUS) pygame.display.update() ``` 在游戏循环中,我们需要实现挡板的移动和球的运动逻辑: ```python PADDLE_SPEED = 5 BALL_SPEED_X = 3 BALL_SPEED_Y = 3 while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() keys = pygame.key.get_pressed() if keys[K_LEFT]: paddle.left -= PADDLE_SPEED if keys[K_RIGHT]: paddle.left += PADDLE_SPEED ball.left += BALL_SPEED_X ball.top += BALL_SPEED_Y if ball.left <= 0 or ball.right >= SCREEN_WIDTH: BALL_SPEED_X *= -1 if ball.top <= 0 or ball.colliderect(paddle): BALL_SPEED_Y *= -1 draw() ``` 以上就是简单的打砖块游戏,运行代码后你将看到一个可以左右移动的挡板和一个可以弹跳的球。你可以根据自己的需求,进一步添加砖块、计分等功能来完善游戏

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值