From e910041c95a16562923c81c2bf70197a2fb39c1e Mon Sep 17 00:00:00 2001 From: Simon Pirkelmann Date: Sat, 11 Sep 2021 01:44:57 +0200 Subject: [PATCH] added possibility to load level file --- gauss-turing/game/gauss_turing.py | 43 +++++++++++++++++-------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/gauss-turing/game/gauss_turing.py b/gauss-turing/game/gauss_turing.py index 1e24c9d..2130fac 100644 --- a/gauss-turing/game/gauss_turing.py +++ b/gauss-turing/game/gauss_turing.py @@ -1,5 +1,4 @@ import numpy as np -import random import pygame import os import threading @@ -32,18 +31,21 @@ tiledt = np.dtype([('color', np.uint8, 3), ('star', np.bool)]) class Board: valid_colors = [GRAY, RED, BLUE] - def __init__(self, dim_x, dim_y, n_coins=2): - self.tiles = np.zeros((dim_y, dim_x), dtype=tiledt) - for x in range(dim_x): - for y in range(dim_y): - self.tiles[y, x]['color'] = random.choice(Board.valid_colors) + def __init__(self, dim_x, dim_y, n_coins=2, file=None): + if file is None: + self.tiles = np.zeros((dim_y, dim_x), dtype=tiledt) + for x in range(dim_x): + for y in range(dim_y): + self.tiles[y, x]['color'] = Board.valid_colors[np.random.randint(len(Board.valid_colors))] - coins_distributed = False - while not coins_distributed: - coinx = np.random.randint(0, dim_x) - coiny = np.random.randint(0, dim_y) - self.tiles[coiny,coinx]['star'] = True - coins_distributed = sum([t['star'] for t in self.tiles.flatten()]) == n_coins + coins_distributed = n_coins == 0 + while not coins_distributed: + coinx = np.random.randint(0, dim_x) + coiny = np.random.randint(0, dim_y) + self.tiles[coiny,coinx]['star'] = True + coins_distributed = sum([t['star'] for t in self.tiles.flatten()]) == n_coins + else: + self.tiles = np.load(file) def render(self, scale_fac): dimy, dimx = self.tiles.shape @@ -208,7 +210,7 @@ class Program: self.prg_counter = 0 self.screen_rect = None - def step(self, state='running'): + def step(self, state='running', check_victory=True): if self.prg_counter >= len(self.cmds): return 'game_over' cmd = self.cmds[self.prg_counter] @@ -237,7 +239,8 @@ class Program: elif cmd.action == 'P0': self.prg_counter = 0 else: - print("color not matching -> skipping command") + #print("color not matching -> skipping command") + pass # update state for new robot position if (not (0 <= self.robot.x < self.board.tiles.shape[1])) or not (0 <= self.robot.y < self.board.tiles.shape[0]): @@ -251,7 +254,7 @@ class Program: if tile['star']: tile['star'] = False - if all([not t['star'] for t in self.board.tiles.flatten()]): + if check_victory and all([not t['star'] for t in self.board.tiles.flatten()]): self.robot.update_pos(self.board.get_xdims(), self.board.get_ydims()) print("YOU WON") return 'won' @@ -296,9 +299,10 @@ class Program: class Game: - def __init__(self, dimx, dimy, robotx, roboty, use_real_robot=False): - self.robot = Robot(x=robotx, y=roboty, orientation='v', use_real_robot=use_real_robot) - self.board = Board(dimx, dimy) + def __init__(self, dimx, dimy, robotx, roboty, orientation, use_real_robot=False): + self.robot = Robot(x=robotx, y=roboty, orientation=orientation, use_real_robot=use_real_robot) + #self.board = Board(dimx, dimy) + self.board = Board(dimx, dimy, file='levels/56.npy') # TODO fix number of commands at 5 self.cmds = [Command('forward'), Command('left', color=RED), Command('left', color=BLUE), Command('P0'), Command('-')] @@ -529,9 +533,8 @@ if __name__ == "__main__": webserver_thread.start() seed = 4 - random.seed(seed) np.random.seed(seed) - game = Game(dimx=7, dimy=4, robotx=3, roboty=1, use_real_robot=False) + game = Game(dimx=7, dimy=4, robotx=5, roboty=1, orientation='>', use_real_robot=False) game.run() # TODOs