class MakerMasher(): BLINK_EVENT = pygame.USEREVENT + 0 screen=None screen_rect=None font = None current_score=3 events = [] target_results=[] target_results_iter=None in_game=False correct=0 finish_print=False read_input = False player_name="" logos={} image_rect={} def __init__(self, font, screen): self.font = font self.screen=screen self.screen_rect=screen.get_rect() self.off_rect = self.screen_rect.copy() self.off_rect.height=self.screen_rect.height - 200 self.off_text_surface = pygame.Surface(self.off_rect.size) print(self.off_rect) logos = pygame.image.load("img/kmakers.png") image_rect = logos.get_rect() image_rect.y = self.screen_rect.height-70 image_rect.x = self.screen_rect.width - 210 self.screen.blit(logos, image_rect) self.music = ShepherdMusic() self.leaderboard = Leaderboard() self.reset_buttons() def set_logo(self): if not self.logos: self.logos = pygame.image.load("img/kmakers.png") self.image_rect = self.logos.get_rect() self.image_rect.y = self.screen_rect.height - 70 self.image_rect.x = self.screen_rect.width - 210 self.screen.blit(self.logos, self.image_rect) def write_text_on_screen(self, text): print(self.off_rect) print(self.off_text_surface) self.screen.fill((0, 0, 0)) self.set_logo() text_lines = text.split("\n") lines = 0 for line in text_lines: on_text_surface = self.font.render( line, True, pygame.Color('green3') ) blink_rect = on_text_surface.get_rect() blink_rect.center = self.screen_rect.center if len(text_lines) > 6: blink_rect.centery = blink_rect.centery + 50 * lines - (50 * (len(text_lines) - 6)) else: blink_rect.centery = blink_rect.centery + 50 * lines self.screen.blit(on_text_surface, blink_rect) lines += 1 def start_game(self): pygame.time.set_timer(REST_TIME, 0) self.reset_buttons() self.screen.fill((0, 0, 0)) self.write_text_on_screen("GET READY...") self.correct=0 self.in_game = False pygame.display.flip() self.target_results = self.generate_result_based_on_score(self.current_score) self.target_results_iter = iter(self.target_results) self.flash_button(next(self.target_results_iter)) self.finish_print=False pygame.time.set_timer(UPDATE_NUMBER, 100) def button_on(self, val): gpio_value = NUM_TO_LEDS[val] GPIO.output(gpio_value, True) return def button_off(self, val): gpio_value = NUM_TO_LEDS[val] GPIO.output(gpio_value, False) return def gameover_show(self): sleep(0.5) self.button_on("2") self.button_on("4") self.button_on("5") self.button_on("6") self.button_on("8") def reset_buttons(self): self.button_off("1") self.button_off("2") self.button_off("3") self.button_off("4") self.button_off("5") self.button_off("6") self.button_off("7") self.button_off("8") self.button_off("9") def flash_button(self, val): print("flashing" + val) gpio_value= NUM_TO_LEDS[val] self.music.play(int(val)) print("flash button" + str(gpio_value)) for each in range(0, 2): GPIO.output(gpio_value, True) sleep(0.1) GPIO.output(gpio_value, False) sleep(0.1) return def keep_printing(self): if self.finish_print: return print("keep printing") next_number = next(self.target_results_iter, None) print ("next " + str(next_number)) if next_number: self.flash_button(next_number) else: pygame.time.set_timer(UPDATE_NUMBER, 0) self.write_text_on_screen("GO!") self.in_game = True self.target_results_iter = iter(self.target_results) print("target result" + str(self.target_results)) self.finish_print=True self.music = ShepherdMusic() def generate_result_based_on_score(self, score): target= [] prev_num=0 for i in range(score+1): number = random.randint(1,9) while number == 3 or number==prev_num or (score<=4 and number==5): number = random.randint(1, 9) target.append(str(number)) prev_num=number print(target) return target def process_key_down(self, key): if key == pygame.K_SPACE: self.start_game() if pygame.K_0 <= key <= pygame.K_9: print(key) if self.in_game: print("no") self.check_response(pygame.key.name(key)) elif pygame.K_a <= key <= pygame.K_z: if self.read_input: self.process_input_letter(pygame.key.name(key)) elif key == pygame.K_RETURN or key == pygame.K_KP_ENTER: self.finish_player_name() else: print(key) return def process_input_letter(self, letter): if len(self.player_name)==3: self.finish_player_name() return self.player_name += letter.upper() self.write_text_on_screen(self.player_name + "_") def check_response(self, key): next_number = next(self.target_results_iter, None) print("is key {} the same as {}".format(key, next_number)) if next_number: if next_number==key: self.correct += 1 if self.correct == len(self.target_results): self.win_and_next() else: self.game_over() else: self.game_over() def win_and_next(self): self.current_score+=1 self.write_text_on_screen("WELL DONE! \n GET READY...") pygame.time.wait(1000) pygame.time.set_timer(REST_TIME, 2000) def reset(self): self.in_game = False self.correct = 0 self.current_score=3 def game_over(self): if self.leaderboard.is_highscore(self.current_score): self.get_player_name() else: self.write_text_on_screen("GAME OVER!\nYOUR SCORE: {} \n PRESS CENTRAL BUTTON TO START".format(self.current_score) + "\n" + self.leaderboard.get_highscore_string()) self.leaderboard.write("na", self.current_score) self.reset() self.music.play_gameover() self.gameover_show() def get_player_name(self): self.write_text_on_screen("YOU MADE IT TO THE TOP 5! \n ENTER YOUR INITIALS!") self.read_input = True def finish_player_name(self): self.leaderboard.write(self.player_name, self.current_score) self.write_text_on_screen("AWESOME! \n PRESS CENTRAL BUTTON TO START AGAIN " + self.leaderboard.get_highscore_string()) self.player_name = "" self.reset() def process_gpio_buttons(self): global pressed if GPIO.input(21) and GPIO.input(22) and not pressed: pressed = True GPIO.output(26, True) GPIO.output(11, True) pygame.display.quit() pygame.quit() exit() if GPIO.input(22) and not pressed: print('Button 1') self.process_flashy_press(pygame.K_1) if GPIO.input(13) and not pressed: print('Button 2') self.process_flashy_press(pygame.K_2) if GPIO.input(18) and not pressed: print('Button 3') self.process_flashy_press(pygame.K_3) if GPIO.input(12) and not pressed: print('Button 4') self.process_flashy_press(pygame.K_4) if GPIO.input(5) and not pressed: print('Button 5') if not self.in_game: print("start game?") self.start_game() else: self.process_flashy_press(pygame.K_5) if GPIO.input(14) and not pressed: print('Button 6') self.process_flashy_press(pygame.K_6) if GPIO.input(17) and not pressed: print('Button 7') self.process_flashy_press(pygame.K_7) if GPIO.input(10) and not pressed: print('Button 8') self.process_flashy_press(pygame.K_8) if GPIO.input(21) and not pressed: print('Button 9') self.process_flashy_press(pygame.K_9) def process_flashy_press(self, key): global pressed gpio_output = KEY_TO_GPIO[key] pressed = True self.music.play(int(key) - 48) self.process_key_down(key) for each in range(0, 1): GPIO.output(gpio_output, True) sleep(0.1) GPIO.output(gpio_output, False) sleep(0.1) if not self.in_game: sleep(0.5) pressed = False