0. 渲染游戏画面

1 用到的函数

python 复制代码
# initialize env
env = gym.make() 
frame = env.render()  
frame = np.transpose(frame, (1, 0, 2))  # 调整图像方向
frame = pygame.surfarray.make_surface(frame)
screen.blit(frame, (0, 0))
pygame.display.flip()

1.1 检查图像的形状

首先,我们需要确认从 env.render() 返回的图像的形状。通常情况下,rgb_array 模式返回的图像形状是 (height, width, channels),其中 channels 通常是 3(RGB)。

python 复制代码
import gym
import numpy as np

env = gym.make('Pendulum-v1',render_mode="rgb_array")
env.reset()

# 获取一帧图像
frame = env.render()
print(f"Frame shape: {frame.shape}")

env.close()

1.2 根据图像形状调整

假设 frame.shape 输出的结果是 (height, width, 3),那么我们不需要调整图像方向。如果确实需要调整图像方向,可以根据实际情况调整 np.transpose 的参数。

例如,如果你需要将图像的宽度和高度对调,可以使用以下代码:

python 复制代码
frame = np.transpose(frame, (1, 0, 2))  # 将宽度和高度对调

但如果 frame.shape(height, width, 3),那么直接使用 frame 即可,无需调整。

1.3 代码解读

首先,需要确保您已经导入了 pygame,并正确地初始化了 pygame 显示窗口。

python 复制代码
import pygame
import numpy as np

# 初始化 pygame
pygame.init()

# 假设您的环境分辨率为 800x600
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))

# 训练或测试中的代码部分,处理帧显示
for episode in range(test_episodes):
    state = env.reset()
    done = False

    while not done:
        # 渲染环境并获取帧
        frame = env.render(mode='rgb_array')  # 使用 'rgb_array' 模式来获取帧
        frame = np.transpose(frame, (1, 0, 2))  # 转置 frame,使得宽度和高度与显示的顺序一致

        # 将 numpy 数组转换为 pygame.Surface
        frame_surface = pygame.surfarray.make_surface(frame)

        # 显示帧
        screen.blit(frame_surface, (0, 0))
        pygame.display.flip()

        # 智能体选择动作
        action = agent.select_action(state)

        # 执行动作
        next_state, reward, done, _ = env.step(action)
        state = next_state

    # 结束后保持一段时间
    pygame.time.wait(500)

# 关闭 pygame 和环境
pygame.quit()
env.close()

代码详细说明

  1. 获取环境渲染帧

    • frame = env.render():使用 'rgb_array' 模式从环境中获取帧,这样返回的是一个 numpy 数组,形状为 (height, width, channels),通常是 RGB 三通道图像。
  2. 转换 numpy 数组为 Pygame Surface

    • 使用 pygame.surfarray.make_surface(frame)numpy.ndarray 转换为 pygame.Surface
    • pygame.surfarray.make_surface() 只能处理二维数组的转置形式,因此如果渲染出来的帧的维度是 (height, width, channels),您可能需要调整顺序(例如使用 np.transpose(frame, (1, 0, 2))),以便适应 make_surface 的输入要求。
  3. 显示帧

    • screen.blit(frame_surface, (0, 0)):将转换后的 Surface 对象绘制到屏幕上。
    • pygame.display.flip() 刷新显示以确保更新的帧在屏幕上显示。
  4. 初始化 Pygame

    • 使用 pygame.init() 进行初始化,并使用 pygame.display.set_mode() 来创建显示窗口。
  5. 延迟以查看效果

    • 使用 pygame.time.wait(500) 保持画面以便观察智能体的效果。

注意

  • 问题来源env.render() 返回的是 numpy.ndarray,而 pygameblit() 方法需要一个 Surface 对象。
  • 解决方法 :使用 pygame.surfarray.make_surface()numpy.ndarray 转换为 pygame.Surface,这样就可以正确地显示在屏幕上。

这样就能将 OpenAI Gym 环境的帧显示到 Pygame 窗口中,并使用智能体执行的动作来实时观察它在环境中的行为。

2 完整示例代码

以下是一个完整的示例代码,展示了如何在 PyGame 中显示 Gym 环境的渲染结果,并控制帧率:

python 复制代码
import gym
import pygame
import numpy as np
import time

pygame.init()
screen_width, screen_height = 800, 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption('CartPole-v1')

env = gym.make('CartPole-v1',render_mode="rgb_array")
env.reset()

# 获取一帧图像,检查形状
frame = env.render()
print(f"Frame shape: {frame.shape}")

for _ in range(100):
    frame = env.render()  # 获取图像帧

    # 检查并调整图像方向(如果需要)
    if frame.shape[0] > frame.shape[1]:
        frame = np.transpose(frame, (1, 0, 2))  # 将宽度和高度对调

    # 将图像转换为 PyGame 表面
    frame = pygame.surfarray.make_surface(frame)
    frame_surface = pygame.transform.scale(frame, (screen_width, screen_height))
    screen.blit(frame_surface, (0, 0))
    pygame.display.flip()

    # 控制帧率
    time.sleep(0.05)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            quit()

    action = env.action_space.sample()
    _, _, done, _, _ = env.step(action)
    if done:
        break

env.close()
pygame.quit()

解释

  1. 初始化 PyGame:设置 PyGame 环境,创建一个窗口。
  2. 创建 Gym 环境 :加载 CartPole-v1 环境并重置。
  3. 检查图像形状:获取一帧图像并打印其形状,确保你知道图像的尺寸。
  4. 调整图像方向 :根据需要调整图像的方向。如果 frame.shape(height, width, 3),则不需要调整。
  5. 显示图像:将图像转换为 PyGame 表面并显示在窗口中。
  6. 控制帧率 :使用 time.sleep 控制每帧图像的显示时间。
  7. 处理事件:处理 PyGame 事件,如窗口关闭。
  8. 执行动作:随机选择一个动作并执行。
  9. 关闭环境:关闭 Gym 环境和 PyGame 窗口。

结果

相关推荐
LKID体41 分钟前
Python操作neo4j库py2neo使用(一)
python·oracle·neo4j
小尤笔记1 小时前
利用Python编写简单登录系统
开发语言·python·数据分析·python基础
FreedomLeo11 小时前
Python数据分析NumPy和pandas(四十、Python 中的建模库statsmodels 和 scikit-learn)
python·机器学习·数据分析·scikit-learn·statsmodels·numpy和pandas
007php0072 小时前
GoZero 上传文件File到阿里云 OSS 报错及优化方案
服务器·开发语言·数据库·python·阿里云·架构·golang
Tech Synapse2 小时前
Python网络爬虫实践案例:爬取猫眼电影Top100
开发语言·爬虫·python
一行玩python2 小时前
SQLAlchemy,ORM的Python标杆!
开发语言·数据库·python·oracle
数据小爬虫@3 小时前
利用Python爬虫获取淘宝店铺详情
开发语言·爬虫·python
编程修仙4 小时前
Collections工具类
linux·windows·python
芝麻团坚果4 小时前
对subprocess启动的子进程使用VSCode python debugger
linux·ide·python·subprocess·vscode debugger
EterNity_TiMe_4 小时前
【论文复现】神经网络的公式推导与代码实现
人工智能·python·深度学习·神经网络·数据分析·特征分析