V-MAGE-DEMO / game /supermario_game.py
Fengx1n's picture
Initial DEMO
e53fda1
import argparse
import pygame, sys, os
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + "/..")
from utils.dict_utils import get_with_warning
from game.pygame_base import PygameBase
from utils.config import Config
from game.supermario.classes.Dashboard import Dashboard
from game.supermario.classes.Level import Level
from game.supermario.classes.Menu import Menu
from game.supermario.classes.Sound import Sound
from game.supermario.entities.Mario import Mario
config = Config()
class SuperMarioGame(PygameBase):
def __init__(
self,
output_dir,
):
super(SuperMarioGame, self).__init__(output_dir, "Super Mario")
self.valid_actions = ["UP", "LEFT", "RIGHT", "UP+LEFT", "UP+RIGHT", "NONE"]
self.sample_frames = 5
def set_level_config(self, level_config):
current_level = get_with_warning(level_config, "level", 0)
self.max_round = get_with_warning(level_config, "max_round", 300)
windowSize = 640, 480
self.screen = pygame.display.set_mode(windowSize)
self.dashboard = Dashboard("game/supermario/img/font.png", 8, self.screen)
self.sound = Sound()
self.level = Level(self.screen, self.sound, self.dashboard)
self.menu = Menu(self.screen, self.dashboard, self.level, self.sound)
self.menu.levelNames = self.menu.loadLevelNames()
print("Level Names: ", self.menu.levelNames)
self.menu.inChoosingLevel = False
self.menu.dashboard.state = "start"
self.menu.dashboard.time = 0
self.menu.level.loadLevel(self.menu.levelNames[current_level])
print(len(self.menu.level.level))
print(len(self.level.level))
self.menu.dashboard.levelName = self.menu.levelNames[current_level].split("Level")[1]
self.menu.start = True
self.mario = Mario(0, 0, self.level, self.screen, self.dashboard, self.sound)
def step(self, action, dt=None):
print("step Action: ", action)
self.level.drawLevel(self.mario.camera)
self.dashboard.update()
self.mario.update(action)
pygame.display.update()
print("len(self.game_frames): ", len(self.game_frames))
if len(self.game_frames) >= self.max_round or self.mario.restart:
self.over = True
self.score = self.dashboard.points
if self.over:
info = f"Game Over, You got {self.score} scores."
else:
info = "Game is running."
return self.over, info
def human_mode_action(self, event):
action = None
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
action = "UP"
elif event.key == pygame.K_DOWN:
action = "DOWN"
elif event.key == pygame.K_LEFT:
action = "LEFT"
elif event.key == pygame.K_RIGHT:
action = "RIGHT"
else:
action = "NONE"
return action
def get_score(self):
return {
"score" : self.score, # win or lose
"frames" : len(self.game_frames),
"valid rate" : len(self.game_frames) / ( len(self.game_frames) + self.invalid_action_count ),
}
if __name__ == '__main__':
print(os.path.dirname(os.path.abspath(__file__)) + "/..")
parser = argparse.ArgumentParser()
parser.add_argument("--levelConfig", type=str, default="./config/level_config/supermariogame/level1.json", help="The path to the level config file.")
args = parser.parse_args()
levelConfig = args.levelConfig
config.load_level_config(levelConfig)
supermario_game = SuperMarioGame("")
supermario_game.run(None, human_mode=True)
# python game/supermario_game.py