diff --git a/Bop_it_sensors.py b/Bop_it_sensors.py index 6f6499c..f12d4de 100644 --- a/Bop_it_sensors.py +++ b/Bop_it_sensors.py @@ -2,15 +2,86 @@ import random import time from gpiozero import Button from gpiozero import RotaryEncoder +import json laser = Button(17) #Die Zahl entspricht dem Pin auf dem ARPI600 Board sound = Button(18, pull_up=True) rotate = RotaryEncoder(20, 21) tilt = Button(23) +round_duration = 4 +highscore_file_path = "./Highscores.json" #das heisst, die Datei wird im selben Verzeichnis wie der Code gespeichert +score_separator = " --- " +highscore_length = 5 + +def save_highscore(highscores): + with open(highscore_file_path, mode="w", encoding="utf-8") as write_file: + json.dump(highscores, write_file) + +def load_highscore(): + try: + with open(highscore_file_path, mode="r" , encoding="utf-8") as read_file: + return json.load(read_file) + except Exception: + return [] + +def show_menu(): + print(" __________________________________________________") + print("| |") + print("| MENU |") + print("|__________________________________________________|") + print("") + print("1 - Play a round of Bop it!") + print("2 - Show Highscores") + print("3 - End game") + print("----------------------------------------------------") + print("Enter choice: ") + print("----------------------------------------------------") + return input() + +def show_highscores(): + scores = load_highscore() + print("") + if len(scores) == 0: + print("Be the first to Bop it!") + else: + for index, element in enumerate(scores): + print(f"{index + 1}. {element}") + print("") + +def get_name_for_highscore(rank, score): + print("----------------------------------------------------") + print(f"Congratulations! You are the new number {rank}") + print("----------------------------------------------------") + print("Enter your name, champ: ") + new_name = input() + return new_name + score_separator + str(score) + +def check_if_highscore(score): + scores = load_highscore() + has_highscore = False + for index, entry in enumerate(scores): + name, entry_score = entry.split(score_separator) + if score > int(entry_score): + new_entry = get_name_for_highscore(index + 1, score) + scores.insert(index, new_entry) + if len(scores) > highscore_length: + loser = scores.pop().split(score_separator)[0] + print("----------------------------------------------------") + print(f"{loser} was kicked off the highscore list. Bye bye!") + print("----------------------------------------------------") + has_highscore = True + break + if not has_highscore and len(scores) < highscore_length: + scores.append(get_name_for_highscore(len(scores)+1, score)) + save_highscore(scores) + +def decrease_round_duration(): + global round_duration + round_duration = round_duration * 0.97 def command_tilt(): print("Tilt me!") - result = tilt.wait_for_press(timeout=10) + result = tilt.wait_for_press(timeout=round_duration) if result: time.sleep(0.3) # soll verhindern, dass die vorherige Runde die jetzige beeinflusst print(success_message()) @@ -22,7 +93,7 @@ def command_tilt(): def command_blind(): print('Blind me!') - result = laser.wait_for_press(timeout=10) + result = laser.wait_for_press(timeout=round_duration) if result: print(success_message()) return 1 @@ -31,7 +102,7 @@ def command_blind(): def command_scream(): print('Make noise at me!') - result = sound.wait_for_press(timeout=10) + result = sound.wait_for_press(timeout=round_duration) if result: time.sleep(0.3) #soll verhindern, dass dasGeräuschsignal aus der vorherigen Runde gezählt wird print(success_message()) @@ -44,7 +115,7 @@ def command_spin(): used_direction = random.choice(directions) print(f"Spin me... {used_direction}!") rotate.value = 0 # damit jede Runde wieder bei Null anfängt, Werte würden allgemein vom -1 bis 1 reichen - result = rotate.wait_for_rotate(timeout=10) + result = rotate.wait_for_rotate(timeout=round_duration) if result and rotate.value > 0 and used_direction == "clockwise" or result and rotate.value < 0 and used_direction == "counter-clockwise": print(success_message()) return 1 @@ -58,23 +129,39 @@ def success_message(): message = random.choice(list_of_messages) return message -def main(): - score = 0 +def play_game(): result = 0 - print("Raspberry will now tell you what to do.") - print("Every correct action will give you a point.") - print("How many can you get?") - print("Let's go!") + score = 0 list_command_choices =[command_spin, command_tilt, command_blind, command_scream] while result != -1: score += result # war zuerst ein paar Zeilen weiter unten, hat dann aber nach einer falschen Runde den Score erhöht time.sleep(0.5) + print("----------------------------------------------------") print("Get ready for the next round!") + print(f"Your time is {round_duration} seconds.") + print("----------------------------------------------------") round = random.choice(list_command_choices) result = round() + decrease_round_duration() + print("----------------------------------------------------") print(f"Game over! Your Score is {score}") + print("----------------------------------------------------") + check_if_highscore(score) - +def main(): + user_choice = None + print("=== WELCOME TO BOP IT! ===") + print("Raspberry will now tell you what to do.") + print("Every correct action will give you a point.") + print("How many can you get?") + print("Let's go!") + user_choice = show_menu() + while user_choice != "3": + if user_choice == "1": + play_game() + elif user_choice == "2": + show_highscores() + user_choice = show_menu() main()