from typing import Any from random import randint from os import system, name import re import csv score = 0 hodnoty = {} players = {} pointer = "" first = "" h_bool = True aggr = {} with open("hodnoty.csv", "r") as csv_file: csv_reader = csv.reader(csv_file) for row in csv_reader: key = str(row[0]) value = int(row[1]) hodnoty[key] = value def throw(count: int) -> str: count = int(count) new_throw = [] for dice in range(count): new_throw.append(str(randint(1, 6))) new_throw = "".join(new_throw) return new_throw def show_throw(throw: str) -> str: throw_temp = [] for x in throw: throw_temp.append(x) pretty_list = ", ".join(throw_temp) pretty_list += "\n" for i in range(1, len(throw_temp) + 1): pretty_list += "^ " pretty_list += "\n" for i in range(1, len(throw_temp) + 1): pretty_list += f"{i} " return pretty_list def clear(): if name == 'nt': _ = system('cls') else: _ = system('clear') def evaluate(inp: Any, count: int, throw: str) -> tuple: global h_bool def eval_score(pick: str) -> bool: if(pick in hodnoty): global score score += hodnoty[pick] return True else: return False def next_player() -> None: global pointer keys_iter = iter(players) for key in keys_iter: if key == pointer: nxt_key = next(keys_iter, first) break pointer = nxt_key inp = str(inp) if re.search(r"^\d+$", inp): if len(inp) > count: data = ("msg", "ER01", "Tolika kostkami nemůžete hodit. Zkuste to znovu:", count, throw) return data else: for x in inp: x = int(x) if x > count: if count == 1: ran = "1" else: ran = f"1–{count}" data = ("msg", "ER02", f"Zvolte prosím kostky v platném rozsahu ({ran}):", count, throw) return data old_throw = [] pick = [] for y in range(count): if str(y+1) not in inp: old_throw.append(throw[y]) if str(y+1) in inp: pick.append(throw[y]) old_throw = "".join(old_throw) pick.sort() pick = "".join(pick) new_count = len(old_throw) if eval_score(pick) == False: new_count = count old_throw = throw else: h_bool = False data = ("count", new_count, old_throw) return data elif inp == "h": if h_bool: clear() input("Nemůžete házet znovu, dokud nevyhodnotíte některé kostky.") data = ("count", count, throw) else: h_bool = True data = ("count", count, "") return data elif inp == "k": global score players[pointer].append(score) aggr[pointer] = sum(players[pointer]) score = 0 h_bool = True next_player() data = ("count", 6, "") return data else: data = ("msg", "ER03", "Zadejte prosím platnou hodnotu:", count, throw) return data def check_value(throw: str) -> bool: throw_s = sorted(throw) throw_str = "".join(throw_s) hodnota = False for h in hodnoty: if h in throw_str: hodnota = True break return hodnota def add_players(iter=False): global players global pointer global first if not iter: var = "prvního hráče" else: var = "dalšího hráče nebo [x] pro ukončení zadávání hráčů" inp = input(f"Zadejte jméno {var}: ") if inp == "x": if not iter: add_players() elif inp == "": print("Jméno nemůže být prázdné.") add_players(iter) else: if inp in players: print("Zadávejte, prosím, unikátní jména.") else: players[inp] = [] aggr[inp] = 0 print(f"Do seznamu přidáno jméno {inp}.") if not iter: pointer = inp first = inp add_players(True) def game(data: tuple): if data[0] == "count": count = data[1] th = data[2] if(th == ""): th = throw(count) clear() print(f"Na tahu je {pointer} ({aggr[pointer]})") print(show_throw(th)) if not check_value(th) and data[2] == "" and count != 0: global score score = 0 input("Oh no... anyway.") data = evaluate("k", count, th) game(data) else: if count == 0: count = 6 msg = ("Jakou akci chcete provést?\n" " - Zadejte kombinaci kostek k ponechání (dojde k jejich vyhodnocení): [pozice kostek] (např. 1 nebo 34 nebo 123456).\n" " - Hodit znovu: [h].\n" f" - Ukončit hod a ponechat si skóre z tohoto hodu ({score}): [k].\n" ) print(f"Count je {count}") # if old_throw != "": # msg += f"\nHodnoty odložených kostek: {old_throw}" inp = input(msg) data = evaluate(inp, count, th) game(data) elif data[0] == "msg": if data[1] == "ER01" or data[1] == "ER02" or data[1] == "ER03": msg = data[2] count = data[3] th = data[4] clear() inp = input(msg) data = evaluate(inp, count, th) game(data) else: msg = data[1] print(msg) def main(): print("Vítejte ve hře v kostky!") add_players() input("Prosím, stiskněte enter pro první hod:") data = ("count", 6, "") game(data) if __name__ == "__main__": main()