大家好,我是python游戏开发这门课程的主要框架师geo
利用pygame建立的游戏没有办法训练需要基于gym环境下才能训练
在gym中,每一个环境(Environment)都必须实现一组统一接口(standard API),这使得不同的强化学习算法能够在不同的环境中无缝运行
gym 中的必要的统一接口
| 概念 | 说明 |
|---|---|
env.reset() |
重置环境并返回初始状态 |
env.step(action) |
执行动作,返回:新的状态、奖励、是否终止、额外信息 |
observation |
当前状态,可能是向量、图像等 |
action |
采取的动作,离散或连续 |
reward |
当前动作获得的奖励 |
done |
是否达到终止条件 |
env.render() |
显示当前环境状态(部分支持图形) |
close |
关闭环境,释放资源,尤其在渲染窗口开启时需要 |
import gym
from gym import spaces
import numpy as np
import pickle
from pygame_math_snake import snake
class SnakeEnv(gym.Env):
def __init__(self):
super(SnakeEnv, self).__init__()
self.snake_game = snake()
# 定义动作空间和状态空间
self.action_space = spaces.Discrete(4) # 假设游戏有4个动作可选:上、下、左、右
self.observation_space = spaces.Box(low=0, high=255,
shape=(self.snake_game.window_height, self.snake_game.window_width, 3),
dtype=np.uint8) # 假设游戏状态是RGB图像,大小为(window_height, window_width)
def reset(self):
return self.snake_game.reset()
def step(self,action):
return self.snake_game.step(action)
def render(self,mode=None):
# 在屏幕上显示游戏状态,这里需要调用原始snake类的渲染方法
self.snake_game.render(mode=mode)
def close(self):
self.snake_game.close()
def run(self):
action = self.snake_game.render(mode='h')
if action != None :
print(action)
return self.step(action)
def random(self):
action = self.action_space.sample() # sample.
if action != None :
print(action)
return self.step(action)
def framework(self,mode=None):
observation = self.reset()
done = False
if mode in ('sample','human' , 'h'):
match mode :
case 'sample':
while not done:
observation, reward, done, _ = self.random()
case 'human' | 'h':
while not done:
observation, reward, done, _ = self.run()
if __name__ == '__main__':
env = SnakeEnv()
env.framework(mode='human')