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 窗口。

结果

相关推荐
专注API从业者7 分钟前
Python/Java 代码示例:手把手教程调用 1688 API 获取商品详情实时数据
java·linux·数据库·python
java1234_小锋14 分钟前
[免费]基于Python的协同过滤电影推荐系统(Django+Vue+sqlite+爬虫)【论文+源码+SQL脚本】
python·django·电影推荐系统·协同过滤
看海天一色听风起雨落1 小时前
Python学习之装饰器
开发语言·python·学习
XiaoMu_0011 小时前
基于Python+Streamlit的旅游数据分析与预测系统:从数据可视化到机器学习预测的完整实现
python·信息可视化·旅游
THMAIL1 小时前
深度学习从入门到精通 - 生成对抗网络(GAN)实战:创造逼真图像的魔法艺术
人工智能·python·深度学习·神经网络·机器学习·生成对抗网络·cnn
ue星空3 小时前
月2期学习笔记
学习·游戏·ue5
我没想到原来他们都是一堆坏人3 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
wanhengidc3 小时前
云手机运行流畅,秒开不卡顿
运维·网络·科技·游戏·智能手机
总有刁民想爱朕ha3 小时前
车牌模拟生成器:Python3.8+Opencv代码实现与商业应用前景(C#、python 开发包SDK)
开发语言·python·数据挖掘
人衣aoa4 小时前
Python编程基础(八) | 类
开发语言·python