Files
kostky/main.py
T

279 lines
7.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from typing import Any
from random import randint
from os import system, name
import re
import csv
from collections import Counter
score = 0
hodnoty = {}
players = {}
pointer = ""
first = ""
h_bool = True
aggr = {}
final_score = 10000
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 not eval_score(pick):
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, "")
if pointer == first:
winner = check_win()
if winner:
data = ("win", winner, aggr[winner])
return data
elif inp == "exit":
data = ("exit",)
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():
global pointer, first, final_score
while True:
inp = input("Zadejte jméno prvního hráče: ")
if inp == "":
print("Jméno nemůže být prázdné.")
else:
players[inp] = []
aggr[inp] = 0
pointer = inp
first = inp
print(f"Do seznamu přidáno jméno {inp}.")
break
while True:
inp = input("Zadejte jméno dalšího hráče nebo [x] pro ukončení zadávání hráčů: ")
if inp == "":
print("Jméno nemůže být prázdné.")
elif inp == "x":
break
elif 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}.")
while True:
inp = input("Zadejte finální skóre (nechte prázdné pro výchozích 10 000): ")
if inp != "":
try:
inp = int(inp)
final_score = inp
except ValueError:
print("Zadejte prosím platnou číselnou hodnotu.")
else:
break
else:
break
def check_win() -> str:
over_limit = {}
for p in aggr:
if aggr[p] >= final_score:
over_limit[p] = aggr[p]
winner = ""
if over_limit:
over_limit_sorted = dict(sorted(over_limit.items(), key=lambda x: x[1], reverse=True))
over_limit_sorted_list = []
for ols in over_limit_sorted:
over_limit_sorted_list.append((ols, over_limit_sorted[ols]))
count = Counter(list(over_limit_sorted.values()))
for c in count:
if count[c] == 1:
winner = over_limit_sorted_list[0][0]
break
return winner
def game(data: tuple):
while True:
if data[0] == "count":
count = data[1]
th = data[2]
if(th == ""):
th = throw(count)
clear()
print(f"Vítězné skóre: {final_score}.")
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)
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"
" - Ukončit hru: [exit].\n"
)
inp = input(msg)
data = evaluate(inp, count, th)
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)
else:
msg = data[1]
print(msg)
break
elif data[0] == "win":
winner = data[1]
score = data[2]
clear()
print(f"Vítězem se stává {winner} s {score} body!")
print("Díky za hru a zase příště.")
break
def main():
clear()
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()