From 3d64e2e8344780e94a6424a3352c7dadd9bcce56 Mon Sep 17 00:00:00 2001 From: Simon Pirkelmann Date: Fri, 10 Sep 2021 16:07:46 +0200 Subject: [PATCH] show current program in beamer mode + general improvements; stable version --- gauss-turing/game/gauss_turing.py | 86 ++++++++++++++++++------------- 1 file changed, 51 insertions(+), 35 deletions(-) diff --git a/gauss-turing/game/gauss_turing.py b/gauss-turing/game/gauss_turing.py index 038da06..ea44fd7 100644 --- a/gauss-turing/game/gauss_turing.py +++ b/gauss-turing/game/gauss_turing.py @@ -245,6 +245,7 @@ class Program: tile['star'] = False if 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' @@ -315,6 +316,8 @@ class Game: self.run_text = myfont.render('RUN', False, tuple(BLACK)) self.stop_text = myfont_small.render('STOP', False, tuple(BLACK)) self.step_text = myfont_small.render('STEP', False, tuple(BLACK)) + self.prg_text = myfont_small.render('CURRENT PROGRAM', False, tuple(GREEN)) + # save initial state self.initial_pos = (self.robot.x, self.robot.y, self.robot.orientation) @@ -330,7 +333,7 @@ class Game: :return: """ if self.beamer_mode: - dx = 0 + dx = self.xoffset dy = 0 else: dx = int(0.05 * self.screen.get_width()) @@ -345,57 +348,69 @@ class Game: board_surf.blit(robot_surf, (self.robot.x * self.scale_fac, self.robot.y * self.scale_fac, self.scale_fac, self.scale_fac)) self.screen.blit(board_surf, (dx, dy, dx + self.board.tiles.shape[1] * self.scale_fac, dy + self.board.tiles.shape[0] * self.scale_fac)) - if not self.beamer_mode: - # if we are not in beamer mode we also show the current program / inputs + # render program + if self.state == 'input': + # in input mode we highlight the command which is selected for edit + prg_surf = self.prg.render(self.scale_fac, prg_counter_override=self.programmer.command_to_edit) + else: + # in other modes we render the current program counter + prg_surf = self.prg.render(self.scale_fac) + prg_surf = pygame.transform.scale(prg_surf, (self.screen.get_width() * 2 // 3, self.scale_fac * 2 // 3)) + self.prg.screen_rect = pygame.Rect( + (dx, board_surf.get_height() + 2 * dy, prg_surf.get_width(), prg_surf.get_height())) + # render input fields and buttons + inp_surf = self.programmer.render(self.scale_fac) + inp_surf = pygame.transform.scale(inp_surf, (self.screen.get_width() * 2 // 3, self.scale_fac * 2 // 3)) + self.programmer.screen_rect = pygame.Rect( + (dx, board_surf.get_height() + prg_surf.get_height() + 3 * dy, inp_surf.get_width(), inp_surf.get_height())) + btn_surf = pygame.Surface((3 * self.scale_fac // 2, self.scale_fac)) + self.btn_rect = pygame.Rect((2 * dx + prg_surf.get_width(), board_surf.get_height() + 2 * dy, + btn_surf.get_height(), btn_surf.get_width())) + if self.state == 'input': + btn_surf.fill(tuple(GREEN)) + btn_surf.blit(self.run_text, (0, 10)) + elif self.state == 'running': + btn_surf.fill(tuple(RED)) + btn_surf.blit(self.stop_text, (0, 10)) + elif self.state == 'stepping': + btn_surf.fill(tuple(YELLOW)) + btn_surf.blit(self.step_text, (0, 10)) - # render program - if self.state == 'input': - # in input mode we highlight the command which is selected for edit - prg_surf = self.prg.render(self.scale_fac, prg_counter_override=self.programmer.command_to_edit) - else: - # in other modes we render the current program counter - prg_surf = self.prg.render(self.scale_fac) - prg_surf = pygame.transform.scale(prg_surf, (self.screen.get_width() * 2 // 3, self.scale_fac * 2 // 3)) - self.prg.screen_rect = pygame.Rect((dx, board_surf.get_height() + 2 * dy, prg_surf.get_width(), prg_surf.get_height())) + if not self.beamer_mode: + # if we are not in beamer mode we render program and inputs below the board self.screen.blit(prg_surf, self.prg.screen_rect) - # render input fields and buttons - inp_surf = self.programmer.render(self.scale_fac) - inp_surf = pygame.transform.scale(inp_surf, (self.screen.get_width() * 2 // 3, self.scale_fac * 2 // 3)) - self.programmer.screen_rect = pygame.Rect((dx, board_surf.get_height() + prg_surf.get_height() + 3 * dy, inp_surf.get_width(), inp_surf.get_height())) self.screen.blit(inp_surf, self.programmer.screen_rect) - btn_surf = pygame.Surface((3 * self.scale_fac//2, self.scale_fac)) - self.btn_rect = pygame.Rect((2 * dx + prg_surf.get_width(), board_surf.get_height() + 2 * dy, - btn_surf.get_height(), btn_surf.get_width())) - if self.state == 'input': - btn_surf.fill(tuple(GREEN)) - btn_surf.blit(self.run_text, (0, 10)) - elif self.state == 'running': - btn_surf.fill(tuple(RED)) - btn_surf.blit(self.stop_text, (0, 10)) - elif self.state == 'stepping': - btn_surf.fill(tuple(YELLOW)) - btn_surf.blit(self.step_text, (0, 10)) self.screen.blit(btn_surf, self.btn_rect) + else: + prg_surf = pygame.transform.scale(prg_surf, (dx, dx//5)) + # in beamer mode we render the program to the left of the board to appear on the laptop + self.screen.blit(prg_surf, (0,100)) + + prg_descr_surb = pygame.Surface((500, 100)) + #prg_descr_surb.blit(self.prg_text) + self.screen.blit(self.prg_text, (50, 50)) + mode_text = myfont_small.render(f'STATE: {self.state}', False, tuple(GREEN)) + self.screen.blit(mode_text, (50, dx//5 + 350)) # render messages if self.state == 'game_over': - game_over_surf = pygame.Surface((self.screen.get_width() // 2, self.screen.get_height() // 2)) + game_over_surf = pygame.Surface(((self.screen.get_width() - dx) // 2, self.screen.get_height() // 2)) game_over_surf.fill(tuple(GREEN)) game_over_surf.blit(self.game_over_text, ((game_over_surf.get_width() - self.game_over_text.get_width()) // 2, (game_over_surf.get_height() - self.game_over_text.get_height()) // 2)) - self.screen.blit(game_over_surf, (self.screen.get_width() // 4, self.screen.get_height() // 4)) + self.screen.blit(game_over_surf, (dx + (self.screen.get_width() - dx) // 4, self.screen.get_height() // 4)) pygame.display.update() pygame.time.wait(1500) self.state = 'reset' elif self.state == 'won': - won_surf = pygame.Surface((self.screen.get_width() // 2, self.screen.get_height() // 2)) + won_surf = pygame.Surface(((self.screen.get_width() - dx) // 2, self.screen.get_height() // 2)) won_surf.fill(tuple(GREEN)) won_surf.blit(self.won_text, ((won_surf.get_width() - self.won_text.get_width()) // 2, (won_surf.get_height() - self.won_text.get_height()) // 2)) - self.screen.blit(won_surf, (self.screen.get_width() // 4, self.screen.get_height() // 4)) + self.screen.blit(won_surf, (dx + (self.screen.get_width() - dx) // 4, self.screen.get_height() // 4)) pygame.display.update() pygame.time.wait(1500) self.state = 'reset' @@ -435,9 +450,10 @@ class Game: if event.key == pygame.K_x: if not self.beamer_mode: # switch to beamer mode - os.environ['SDL_VIDEO_WINDOW_POS'] = '1920, 280' + self.xoffset = 1000 + os.environ['SDL_VIDEO_WINDOW_POS'] = f'{1920-self.xoffset}, 280' self.scale_fac = 180 - self.screen = pygame.display.set_mode((self.board.tiles.shape[1] * self.scale_fac, + self.screen = pygame.display.set_mode((self.xoffset + self.board.tiles.shape[1] * self.scale_fac, self.board.tiles.shape[0] * self.scale_fac), pygame.NOFRAME) self.beamer_mode = True @@ -509,7 +525,7 @@ if __name__ == "__main__": seed = 2 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=3, roboty=1, use_real_robot=True) game.run() # TODOs