import os import json try: import android_ui as ui COLORS = {"RED": "", "END": ""} except ImportError: import terminal_ui as ui COLORS = {"RED": "\033[91m", "END": "\033[0m"} MIN_CELL_WIDTH = 15 SAVE_FILE = "save.json" def clear(): os.system("cls" if os.name in ("nt", "dos") else "clear") def remove_line(d): for key in d.keys(): del d[key][-1] def calc_points(guess, result): if guess == result: return 20 + guess * 10 else: return -10 * abs(guess - result) def print_standings(players, guesses, results): # Header width = max(MIN_CELL_WIDTH, *[len(player) for player in players]) print("| Runde |", end="") for player in players: pad = " " * (width - len(player) - 2) print(f" {player}{pad} |", end="") print() print("-" * (9 + len(players) * (width + 1))) # Data points = {player: 0 for player in players} for num_round in range(1, len(guesses[players[0]]) + 1): pad = 7 - len(str(num_round)) - 2 print(f"| {' ' * pad}{num_round} |", end="") for player in players: if num_round <= len(results[player]): points[player] += calc_points( guesses[player][num_round - 1], results[player][num_round - 1] ) correct = ( guesses[player][num_round - 1] != results[player][num_round - 1] ) text = f"{COLORS['RED'] if correct else ''}{points[player]} / {guesses[player][num_round - 1]} ({results[player][num_round - 1]}){COLORS['END'] if correct else ''}" else: text = f"??? / {guesses[player][num_round - 1]} (?)" # Remove invisivle characters for padding calculation clean = text for color in COLORS.values(): clean = clean.replace(color, "") pad = " " * (width - len(clean) - 2) print(f" {pad}{text} |", end="") print() def main(): # SETUP clear() print("Hey! Willkommen bei WiZaRδ!\n") # LOAD LAST GAME if os.path.isfile("save.json") and ui.query_yes_no("Letztes Spiel laden? (save.json)"): with open(SAVE_FILE, "r") as file: save = json.load(file) players = save["players"] guesses = save["guesses"] results = save["results"] else: players = [ name.strip() for name in ui.query("Gib die Spielernamen ein (Kommagetrennt)").split(",") ] guesses = {player: [] for player in players} results = {player: [] for player in players} num_rounds = 60 // len(players) # NORMAL GAMEPLAY for i in range(len(guesses[players[0]]) + 1, num_rounds + 1): print("\n\n") print(f"Runde {i} von {num_rounds}.") print( f"{players[(i - 1) % len(players)]} teilt aus, {players[i % len(players)]} fängt an.\n\n" ) # INPUT GUESSES print() while True: guess_sum = 0 summary = "Das heißt " for j in range(i, i + len(players)): player = players[j % len(players)] if j == i: guess = ui.query_int(f"{player}, wie viele Stiche machst du?", None) else: not_allowed = i - guess_sum guess = ui.query_int( f"(Summe: {guess_sum}) {player}?{f' ({not_allowed} ist nicht erlaubt)' if j == i + len(players) - 1 and i > 3 and i - guess_sum >= 0 else ''}", None, ) guesses[player] += [guess] guess_sum += guess if j != i + len(players) - 1: summary += f"{', ' if j != i else ''}{player} schätzt {guess}" else: summary += f" und {player} schätzt {guess}" if ui.query_yes_no(f"{summary}, passt das?"): break else: remove_line(guesses) # PRINT STANDINGS print() print_standings(players, guesses, results) input("\nDrücke ENTER um fortzufahren...") # INPUT RESULTS print() while True: summary = "Also " for j in range(i, i + len(players)): player = players[j % len(players)] if j == i: result = ui.query_int( f"{player}, wie viele Stiche hast du von {guesses[player][-1]} gemacht? [{guesses[player][-1]}]", guesses[player][-1], ) else: result = ui.query_int( f"{player}? [{guesses[player][-1]}]", guesses[player][-1] ) results[player] += [result] if j != i + len(players) - 1: summary += f"{', ' if j != i else ''}{player} hat {result}" else: summary += f" und {player} hat {result} gemacht" if ui.query_yes_no(f"{summary}, passt das?"): break else: remove_line(results) # WRITE RESULTS save = {"players": players, "guesses": guesses, "results": results} with open(SAVE_FILE, "w") as file: json.dump(save, file) # PRINT STANDINGS print() print_standings(players, guesses, results) input("\nDrücke ENTER um fortzufahren...") # Print places results = reversed( sorted( [ (sum(map(calc_points, guesses[player], results[player])), player) for player in players ] ) ) print("\n\n---------------RESULTS---------------") print("-------------------------------------\n") print_standings(players, guesses, results) print() place = 0 count = 1 last = -1 # only multiple points of 10 exist for result, player in results: if result != last: place += count count = 0 print( f"{place}. {player} mit {result} Punkten{' WOOOHOO!!' if place == 1 else ''}" ) count += 1 last = result if __name__ == "__main__": main()