show current program in beamer mode + general improvements; stable version

This commit is contained in:
Simon Pirkelmann 2021-09-10 16:07:46 +02:00
parent e669b10ebc
commit 3d64e2e834

View File

@ -245,6 +245,7 @@ class Program:
tile['star'] = False tile['star'] = False
if all([not t['star'] for t in self.board.tiles.flatten()]): 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") print("YOU WON")
return 'won' return 'won'
@ -315,6 +316,8 @@ class Game:
self.run_text = myfont.render('RUN', False, tuple(BLACK)) self.run_text = myfont.render('RUN', False, tuple(BLACK))
self.stop_text = myfont_small.render('STOP', False, tuple(BLACK)) self.stop_text = myfont_small.render('STOP', False, tuple(BLACK))
self.step_text = myfont_small.render('STEP', 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 # save initial state
self.initial_pos = (self.robot.x, self.robot.y, self.robot.orientation) self.initial_pos = (self.robot.x, self.robot.y, self.robot.orientation)
@ -330,7 +333,7 @@ class Game:
:return: :return:
""" """
if self.beamer_mode: if self.beamer_mode:
dx = 0 dx = self.xoffset
dy = 0 dy = 0
else: else:
dx = int(0.05 * self.screen.get_width()) dx = int(0.05 * self.screen.get_width())
@ -345,9 +348,6 @@ 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)) 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)) 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 # render program
if self.state == 'input': if self.state == 'input':
# in input mode we highlight the command which is selected for edit # in input mode we highlight the command which is selected for edit
@ -356,16 +356,14 @@ class Game:
# in other modes we render the current program counter # in other modes we render the current program counter
prg_surf = self.prg.render(self.scale_fac) 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)) 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())) self.prg.screen_rect = pygame.Rect(
self.screen.blit(prg_surf, self.prg.screen_rect) (dx, board_surf.get_height() + 2 * dy, prg_surf.get_width(), prg_surf.get_height()))
# render input fields and buttons # render input fields and buttons
inp_surf = self.programmer.render(self.scale_fac) 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)) 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.programmer.screen_rect = pygame.Rect(
self.screen.blit(inp_surf, self.programmer.screen_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))
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, 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())) btn_surf.get_height(), btn_surf.get_width()))
if self.state == 'input': if self.state == 'input':
@ -377,25 +375,42 @@ class Game:
elif self.state == 'stepping': elif self.state == 'stepping':
btn_surf.fill(tuple(YELLOW)) btn_surf.fill(tuple(YELLOW))
btn_surf.blit(self.step_text, (0, 10)) btn_surf.blit(self.step_text, (0, 10))
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)
self.screen.blit(inp_surf, self.programmer.screen_rect)
self.screen.blit(btn_surf, self.btn_rect) 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 # render messages
if self.state == 'game_over': 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.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.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)) (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.display.update()
pygame.time.wait(1500) pygame.time.wait(1500)
self.state = 'reset' self.state = 'reset'
elif self.state == 'won': 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.fill(tuple(GREEN))
won_surf.blit(self.won_text, won_surf.blit(self.won_text,
((won_surf.get_width() - self.won_text.get_width()) // 2, ((won_surf.get_width() - self.won_text.get_width()) // 2,
(won_surf.get_height() - self.won_text.get_height()) // 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.display.update()
pygame.time.wait(1500) pygame.time.wait(1500)
self.state = 'reset' self.state = 'reset'
@ -435,9 +450,10 @@ class Game:
if event.key == pygame.K_x: if event.key == pygame.K_x:
if not self.beamer_mode: if not self.beamer_mode:
# switch to 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.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), self.board.tiles.shape[0] * self.scale_fac),
pygame.NOFRAME) pygame.NOFRAME)
self.beamer_mode = True self.beamer_mode = True
@ -509,7 +525,7 @@ if __name__ == "__main__":
seed = 2 seed = 2
random.seed(seed) random.seed(seed)
np.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() game.run()
# TODOs # TODOs