Files
wizard/main.py

208 lines
6.7 KiB
Python

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_FILE) and ui.query_yes_no(f"Letztes Spiel laden? ({SAVE_FILE})"):
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?"):
print(f"\nAlso {'sind' if guess_sum > 1 else 'ist'} {guess_sum if guess_sum > 1 else ('ein' if guess_sum == 1 else 'kein')} {'Stiche' if guess_sum > 1 else 'Stich'} in Runde {i} vorhergesagt.")
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 "
result_sum = 0
for j in range(i, i + len(players)):
player = players[j % len(players)]
if j == i: # Player that started the round
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]
result_sum += 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 result_sum != i:
print(f"\nHoppla! Es kann nicht sein, dass ihr {result_sum if result_sum > 1 else ('einen' if result_sum == 1 else 'keinen')} {'Stiche' if result_sum > 1 else 'Stich'} in Runde {i} gemacht habt?!\n")
elif ui.query_yes_no(f"{summary}, passt das?"):
break
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()