Exemple #1
0
class CustomEnv:
    def __init__(self):
        self.high = np.array([1.1, 1.1, 0.85, 1.03, 1.03])
        self.low = np.array([-1.1, -1.1, -0.01, -0.04, -0.04])

        self.WIDTH = world_settings["WIDTH"]
        self.HEIGHT = world_settings["HEIGHT"]

        self.display_render = False
        self.game_over = False

        self.player = Player(
            self,
            random.randint(0, self.WIDTH -
                           player_setting["width"]),  #Randon position x 
            self.HEIGHT - player_setting["height"] -
            player_setting["padding"],  #position bottom
        )
        self.autoplayer = Player(
            self,
            random.randint(0, self.WIDTH -
                           player_setting["width"]),  #Randon position x 
            player_setting["height"] -
            player_setting["padding"],  #position top
        )
        self.ball = Ball(
            self,
            random.randint(16, self.WIDTH - 16),
            self.HEIGHT / 2 - 8,
            [self.player, self.autoplayer]  #Interact with
        )
        self.clock = pg.time.Clock()

    def return_observation(self):
        return [
            self.ball.vector["x"], self.ball.vector["y"],
            self.player.x / self.WIDTH, self.ball.x / self.WIDTH,
            self.ball.y / self.HEIGHT
        ]

    def reset(self):
        self.__init__()
        return self.return_observation()

    def step(self, action):
        self.ball.update()  #Upgrade positon ball
        self.ball.speed += 0.001  #Acceleration
        self.player.move(action -
                         1)  #action happens input (0, 1, 2) - 1 = (-1, 0, 1)
        self.autoplayer.auto(self.ball)  #Auto move bot
        return self.return_observation(), self.player.score, self.game_over

    def render(self, FPS):
        if not self.display_render:
            self.display = pg.display.set_mode((self.WIDTH, self.HEIGHT))
            self.display_render = True
        pg.event.get()
        pg.display.update()
        self.display.fill((0, 0, 0))
        self.ball.draw()
        self.player.draw()
        self.autoplayer.draw()
        self.clock.tick(FPS)