From 16d940253d419bae151179d25b638ed020fe8746 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Thu, 18 Jun 2026 20:51:07 +0200 Subject: [PATCH 01/32] =?UTF-8?q?feature:=20v=C3=BDb=C4=9Br=20kostek:=20od?= =?UTF-8?q?e=C4=8D=C3=ADt=C3=A1n=C3=AD=20vybran=C3=BDch=20kostek=20z=20nov?= =?UTF-8?q?=C3=A9ho=20hodu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/main.py b/main.py index b24ba74..106525d 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,6 @@ from random import randint from os import system, name +import re def throw(count): count = int(count) @@ -24,17 +25,25 @@ def clear(): else: _ = system('clear') -def game(): - new_throw = throw(6) +def evaluate(inp, count): + inp = str(inp) + if re.search("^\d+$", inp): + count = len(inp) + return count + +def game(count): + new_throw = throw(count) clear() print(show_throw(new_throw)) - input("Prosím, stiskněte enter pro další hod:") - game() + inp = input("Vyberte, kterými kostkami chcete hodit znovu (např. 135):") + count = evaluate(inp, count) + game(count) def main(): print("Vítejte ve hře v kostky!") input("Prosím, stiskněte enter pro první hod:") - game() + count = 6 + game(count) if __name__ == "__main__": main() -- 2.47.3 From c1e94faf9896efbc68b9e42390c865f8761043e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Fri, 19 Jun 2026 17:05:19 +0200 Subject: [PATCH 02/32] =?UTF-8?q?feature:=20funkce=20game=20nyn=C3=AD=20do?= =?UTF-8?q?st=C3=A1v=C3=A1=20jako=20argument=20tuple:=20na=20prvn=C3=ADm?= =?UTF-8?q?=20m=C3=ADst=C4=9B=20je=20v=C5=BEdy=20typ=20p=C5=99ed=C3=A1van?= =?UTF-8?q?=C3=BDch=20dat=20(zat=C3=ADm=20"count"/"msg")=20funkce=20evalua?= =?UTF-8?q?te=20kontroluje=20maxim=C3=A1ln=C3=AD=20mo=C5=BEn=C3=BD=20po?= =?UTF-8?q?=C4=8Det=20hozen=C3=BDch=20kostek?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/main.py b/main.py index 106525d..cc6ff48 100644 --- a/main.py +++ b/main.py @@ -28,22 +28,36 @@ def clear(): def evaluate(inp, count): inp = str(inp) if re.search("^\d+$", inp): - count = len(inp) - return count + if len(inp) > count: + data = ("msg", "ER01", "Tolika kostkami nemůžete hodit. Zkuste to znovu:", count) + return data + else: + count = len(inp) + data = ("count", count) + return data -def game(count): - new_throw = throw(count) - clear() - print(show_throw(new_throw)) - inp = input("Vyberte, kterými kostkami chcete hodit znovu (např. 135):") - count = evaluate(inp, count) - game(count) +def game(data: tuple): + if data[0] == "count": + count = data[1] + new_throw = throw(count) + clear() + print(show_throw(new_throw)) + inp = input("Vyberte, kterými kostkami chcete hodit znovu (např. 135):") + data = evaluate(inp, count) + game(data) + elif data[0] == "msg": + if data[1] == "ER01": + msg = data[2] + count = data[3] + inp = input(msg) + data = evaluate(inp, count) + game(data) def main(): print("Vítejte ve hře v kostky!") input("Prosím, stiskněte enter pro první hod:") - count = 6 - game(count) + data = ("count", 6) + game(data) if __name__ == "__main__": main() -- 2.47.3 From a668a4d7b3053b5b570cca1a3ae5d0e957bc7dfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Fri, 19 Jun 2026 19:52:24 +0200 Subject: [PATCH 03/32] =?UTF-8?q?feature/hod:=20implementov=C3=A1n=20error?= =?UTF-8?q?=20pro=20=C4=8D=C3=ADslo=20kostky=20mimo=20platn=C3=BD=20rozsah?= =?UTF-8?q?=20(zb=C3=BDvaj=C3=ADc=C3=AD=20po=C4=8Det=20kostek=20+=20n)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index cc6ff48..7ff30e6 100644 --- a/main.py +++ b/main.py @@ -31,7 +31,15 @@ def evaluate(inp, count): if len(inp) > count: data = ("msg", "ER01", "Tolika kostkami nemůžete hodit. Zkuste to znovu:", count) return data - else: + else: + for x in inp: + if int(x) > count: + if count == 1: + range = "1" + else: + range = f"1–{count}" + data = ("msg", "ER02", f"Zvolte prosím kostky v platném rozsahu ({range}):", count) + return data count = len(inp) data = ("count", count) return data @@ -46,7 +54,7 @@ def game(data: tuple): data = evaluate(inp, count) game(data) elif data[0] == "msg": - if data[1] == "ER01": + if data[1] == "ER01" or data[1] == "ER02": msg = data[2] count = data[3] inp = input(msg) -- 2.47.3 From 6952c7c9648ba2e68c54bba57f9f566ebc05b4e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Fri, 19 Jun 2026 20:20:19 +0200 Subject: [PATCH 04/32] =?UTF-8?q?feature/hod:=20z=C3=A1klady=20logiky=20pr?= =?UTF-8?q?o=20vyhodnocov=C3=A1n=C3=AD=20hodnoty=20kostek:=20na=C4=8Dten?= =?UTF-8?q?=C3=AD=20hodnot=20odlo=C5=BEen=C3=BDch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/main.py b/main.py index 7ff30e6..b413e39 100644 --- a/main.py +++ b/main.py @@ -25,33 +25,43 @@ def clear(): else: _ = system('clear') -def evaluate(inp, count): +def evaluate(inp, count, throw): inp = str(inp) if re.search("^\d+$", inp): if len(inp) > count: data = ("msg", "ER01", "Tolika kostkami nemůžete hodit. Zkuste to znovu:", count) return data - else: + else: for x in inp: - if int(x) > count: + x = int(x) + if x > count: if count == 1: - range = "1" + ran = "1" else: - range = f"1–{count}" - data = ("msg", "ER02", f"Zvolte prosím kostky v platném rozsahu ({range}):", count) + ran = f"1–{count}" + data = ("msg", "ER02", f"Zvolte prosím kostky v platném rozsahu ({ran}):", count) return data + old_throw = [] + for y in range(count): + if str(y) in inp: + old_throw.append(throw[y]) + count = len(inp) - data = ("count", count) + data = ("count", count, old_throw) return data def game(data: tuple): if data[0] == "count": count = data[1] + old_throw = data[2] new_throw = throw(count) clear() print(show_throw(new_throw)) - inp = input("Vyberte, kterými kostkami chcete hodit znovu (např. 135):") - data = evaluate(inp, count) + msg = "Vyberte, kterými kostkami chcete hodit znovu (např. 135):" + if old_throw != "": + msg += f"\nHodnoty odložených kostek: {old_throw}" + inp = input(msg) + data = evaluate(inp, count, new_throw) game(data) elif data[0] == "msg": if data[1] == "ER01" or data[1] == "ER02": @@ -60,11 +70,14 @@ def game(data: tuple): inp = input(msg) data = evaluate(inp, count) game(data) + else: + msg = data[1] + print(msg) def main(): print("Vítejte ve hře v kostky!") input("Prosím, stiskněte enter pro první hod:") - data = ("count", 6) + data = ("count", 6, "") game(data) if __name__ == "__main__": -- 2.47.3 From d796c6012b98d5e78b941b1396ed7a983bfc2e35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Fri, 19 Jun 2026 20:40:31 +0200 Subject: [PATCH 05/32] feature/hod: csv s hodnotami --- hodnoty.csv | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 hodnoty.csv diff --git a/hodnoty.csv b/hodnoty.csv new file mode 100644 index 0000000..bcccc97 --- /dev/null +++ b/hodnoty.csv @@ -0,0 +1,30 @@ +111111,8000 +666666,4800 +11111,4000 +555555,4000 +444444,3200 +66666,2400 +333333,2400 +1111,2000 +55555,2000 +44444,1600 +222222,1600 +123456,1500 +6666,1200 +33333,1200 +111,1000 +5555,1000 +23456,1000 +4444,800 +22222,800 +12345,750 +666,600 +3333,600 +555,500 +444,400 +2222,400 +333,300 +11,200 +222,200 +1,100 +5,50 \ No newline at end of file -- 2.47.3 From ac6d8d918221fea216250f2b6fe00e2824cc20a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Sun, 21 Jun 2026 15:02:45 +0200 Subject: [PATCH 06/32] feature/hod: import csv s hodnotami --- main.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/main.py b/main.py index b413e39..709f2b3 100644 --- a/main.py +++ b/main.py @@ -1,6 +1,18 @@ from random import randint from os import system, name import re +import csv + +hodnoty = {} + +with open("hodnoty.csv", "r") as csv_file: + csv_reader = csv.reader(csv_file) + + for row in csv_reader: + key = str(row[0]) + value = str(row[1]) + + hodnoty[key] = value def throw(count): count = int(count) -- 2.47.3 From d854190480411d6b35720e81fa59dbb68ad71346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Sun, 21 Jun 2026 15:52:03 +0200 Subject: [PATCH 07/32] =?UTF-8?q?feature/hod:=20=C3=BAvodn=C3=AD=20kontrol?= =?UTF-8?q?a=20kombinace=20v=20hodu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/main.py b/main.py index 709f2b3..b4f6b60 100644 --- a/main.py +++ b/main.py @@ -62,6 +62,17 @@ def evaluate(inp, count, throw): data = ("count", count, old_throw) return data +def check_value(throw): + throw.sort() + throw_str = "".join(throw) + hodnota = False + for h in hodnoty: + if h in throw_str: + hodnota = True + break + + return hodnota + def game(data: tuple): if data[0] == "count": count = data[1] @@ -69,12 +80,15 @@ def game(data: tuple): new_throw = throw(count) clear() print(show_throw(new_throw)) - msg = "Vyberte, kterými kostkami chcete hodit znovu (např. 135):" - if old_throw != "": - msg += f"\nHodnoty odložených kostek: {old_throw}" - inp = input(msg) - data = evaluate(inp, count, new_throw) - game(data) + if check_value(new_throw): + msg = "Vyberte, kterými kostkami chcete hodit znovu (např. 135):" + if old_throw != "": + msg += f"\nHodnoty odložených kostek: {old_throw}" + inp = input(msg) + data = evaluate(inp, count, new_throw) + game(data) + else: + print("Smůla, třeba příště.") elif data[0] == "msg": if data[1] == "ER01" or data[1] == "ER02": msg = data[2] -- 2.47.3 From e4fc41a65632db97593b4d53e4c38b523b63a998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Sun, 21 Jun 2026 16:08:04 +0200 Subject: [PATCH 08/32] feature/hod: oprava check_value --- main.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index b4f6b60..a1a577a 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,7 @@ from os import system, name import re import csv +score = 0 hodnoty = {} with open("hodnoty.csv", "r") as csv_file: @@ -55,7 +56,7 @@ def evaluate(inp, count, throw): return data old_throw = [] for y in range(count): - if str(y) in inp: + if str(y+1) in inp: old_throw.append(throw[y]) count = len(inp) @@ -63,8 +64,9 @@ def evaluate(inp, count, throw): return data def check_value(throw): - throw.sort() - throw_str = "".join(throw) + throw_s = throw.copy() + throw_s.sort() + throw_str = "".join(throw_s) hodnota = False for h in hodnoty: if h in throw_str: -- 2.47.3 From b7ec4eb17f522b2c8989a383045028f4729a44fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Sun, 21 Jun 2026 16:31:23 +0200 Subject: [PATCH 09/32] =?UTF-8?q?feature/hod:=20nahrazen=C3=AD=20throw=20l?= =?UTF-8?q?istu=20stringem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/main.py b/main.py index a1a577a..d6e531a 100644 --- a/main.py +++ b/main.py @@ -15,20 +15,25 @@ with open("hodnoty.csv", "r") as csv_file: hodnoty[key] = value -def throw(count): +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): - pretty_list = ", ".join(throw) + 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) + 1): + for i in range(1, len(throw_temp) + 1): pretty_list += "^ " pretty_list += "\n" - for i in range(1, len(throw) + 1): + for i in range(1, len(throw_temp) + 1): pretty_list += f"{i} " return pretty_list @@ -64,8 +69,7 @@ def evaluate(inp, count, throw): return data def check_value(throw): - throw_s = throw.copy() - throw_s.sort() + throw_s = sorted(throw) throw_str = "".join(throw_s) hodnota = False for h in hodnoty: -- 2.47.3 From 1997f96232470b26e4d5729a519c2288989b75ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Sun, 21 Jun 2026 16:37:52 +0200 Subject: [PATCH 10/32] =?UTF-8?q?refactor:=20definice=20typ=C5=AF=20u=20fu?= =?UTF-8?q?nkc=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index d6e531a..327e079 100644 --- a/main.py +++ b/main.py @@ -1,3 +1,4 @@ +from typing import Any from random import randint from os import system, name import re @@ -23,7 +24,7 @@ def throw(count: int) -> str: new_throw = "".join(new_throw) return new_throw -def show_throw(throw): +def show_throw(throw: str) -> str: throw_temp = [] for x in throw: throw_temp.append(x) @@ -43,7 +44,7 @@ def clear(): else: _ = system('clear') -def evaluate(inp, count, throw): +def evaluate(inp: Any, count: int, throw: str) -> tuple: inp = str(inp) if re.search("^\d+$", inp): if len(inp) > count: @@ -68,7 +69,7 @@ def evaluate(inp, count, throw): data = ("count", count, old_throw) return data -def check_value(throw): +def check_value(throw: str) -> bool: throw_s = sorted(throw) throw_str = "".join(throw_s) hodnota = False -- 2.47.3 From f91f7c874ab912879352bad89ed7c14988921ae4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Sun, 21 Jun 2026 17:09:25 +0200 Subject: [PATCH 11/32] =?UTF-8?q?feature/hod:=20vyhodnocov=C3=A1n=C3=AD=20?= =?UTF-8?q?hodu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 51 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 13 deletions(-) diff --git a/main.py b/main.py index 327e079..c6c5ae4 100644 --- a/main.py +++ b/main.py @@ -12,7 +12,7 @@ with open("hodnoty.csv", "r") as csv_file: for row in csv_reader: key = str(row[0]) - value = str(row[1]) + value = int(row[1]) hodnoty[key] = value @@ -45,6 +45,14 @@ def clear(): _ = system('clear') def evaluate(inp: Any, count: int, throw: str) -> tuple: + def eval_score(pick: str) -> bool: + if(pick in hodnoty): + global score + score += hodnoty[pick] + return True + else: + return False + inp = str(inp) if re.search("^\d+$", inp): if len(inp) > count: @@ -61,12 +69,24 @@ def evaluate(inp: Any, count: int, throw: str) -> tuple: data = ("msg", "ER02", f"Zvolte prosím kostky v platném rozsahu ({ran}):", count) return data old_throw = [] + pick = [] for y in range(count): - if str(y+1) in inp: + if str(y+1) not in inp: old_throw.append(throw[y]) + if str(y+1) in inp: + pick.append(throw[y]) - count = len(inp) - data = ("count", count, old_throw) + 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 + + data = ("count", new_count, old_throw) return data def check_value(throw: str) -> bool: @@ -83,16 +103,21 @@ def check_value(throw: str) -> bool: def game(data: tuple): if data[0] == "count": count = data[1] - old_throw = data[2] - new_throw = throw(count) - clear() - print(show_throw(new_throw)) - if check_value(new_throw): - msg = "Vyberte, kterými kostkami chcete hodit znovu (např. 135):" - if old_throw != "": - msg += f"\nHodnoty odložených kostek: {old_throw}" + th = data[2] + if(th == ""): + th = throw(count) + # clear() + print(show_throw(th)) + if check_value(th) or (check_value(th) == False and th != ""): + 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" + ) + # if old_throw != "": + # msg += f"\nHodnoty odložených kostek: {old_throw}" inp = input(msg) - data = evaluate(inp, count, new_throw) + data = evaluate(inp, count, th) game(data) else: print("Smůla, třeba příště.") -- 2.47.3 From eb5603bca30af1956f340cc448682f42d0cc3f4f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Sun, 21 Jun 2026 17:13:23 +0200 Subject: [PATCH 12/32] =?UTF-8?q?fix:=20oprava=20p=C5=99ed=C3=A1v=C3=A1n?= =?UTF-8?q?=C3=AD=20dat=20do=20funkce=20evaluate=20z=20chybov=C3=BDch=20hl?= =?UTF-8?q?=C3=A1=C5=A1ek?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index c6c5ae4..027e4b9 100644 --- a/main.py +++ b/main.py @@ -56,7 +56,7 @@ def evaluate(inp: Any, count: int, throw: str) -> tuple: inp = str(inp) if re.search("^\d+$", inp): if len(inp) > count: - data = ("msg", "ER01", "Tolika kostkami nemůžete hodit. Zkuste to znovu:", count) + data = ("msg", "ER01", "Tolika kostkami nemůžete hodit. Zkuste to znovu:", count, throw) return data else: for x in inp: @@ -66,7 +66,7 @@ def evaluate(inp: Any, count: int, throw: str) -> tuple: ran = "1" else: ran = f"1–{count}" - data = ("msg", "ER02", f"Zvolte prosím kostky v platném rozsahu ({ran}):", count) + data = ("msg", "ER02", f"Zvolte prosím kostky v platném rozsahu ({ran}):", count, throw) return data old_throw = [] pick = [] @@ -125,8 +125,9 @@ def game(data: tuple): if data[1] == "ER01" or data[1] == "ER02": msg = data[2] count = data[3] + th = data[4] inp = input(msg) - data = evaluate(inp, count) + data = evaluate(inp, count, th) game(data) else: msg = data[1] -- 2.47.3 From 1849c1c05b2e900e446acb2e8542100d22b5a5ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Mon, 22 Jun 2026 18:46:13 +0200 Subject: [PATCH 13/32] hotfix: check_value(th) == False na not check_value(th) --- main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index 027e4b9..2e1c01d 100644 --- a/main.py +++ b/main.py @@ -106,9 +106,9 @@ def game(data: tuple): th = data[2] if(th == ""): th = throw(count) - # clear() + clear() print(show_throw(th)) - if check_value(th) or (check_value(th) == False and th != ""): + if check_value(th) or (not check_value(th) and th != ""): 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" -- 2.47.3 From db76e388fea7240c68ad1982b076665f4fd66e54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Tue, 23 Jun 2026 20:40:30 +0200 Subject: [PATCH 14/32] =?UTF-8?q?fix:=20bust=20se=20vyhodnocuje=20jen=20na?= =?UTF-8?q?=20=C4=8Derstv=C3=A9m=20hodu=20(data[2])?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/main.py b/main.py index 2e1c01d..320e72e 100644 --- a/main.py +++ b/main.py @@ -108,7 +108,9 @@ def game(data: tuple): th = throw(count) clear() print(show_throw(th)) - if check_value(th) or (not check_value(th) and th != ""): + if not check_value(th) and data[2] == "": + print("Smůla, třeba příště.") + else: 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" @@ -119,8 +121,7 @@ def game(data: tuple): inp = input(msg) data = evaluate(inp, count, th) game(data) - else: - print("Smůla, třeba příště.") + elif data[0] == "msg": if data[1] == "ER01" or data[1] == "ER02": msg = data[2] -- 2.47.3 From 5b282416de402ebca7477830ee5687f690650ea7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Mon, 22 Jun 2026 19:24:08 +0200 Subject: [PATCH 15/32] =?UTF-8?q?feature/hraci:=20z=C3=A1kladn=C3=AD=20log?= =?UTF-8?q?ika=20pro=20p=C5=99id=C3=A1n=C3=AD=20hr=C3=A1=C4=8D=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/main.py b/main.py index 320e72e..d0c6e12 100644 --- a/main.py +++ b/main.py @@ -6,6 +6,8 @@ import csv score = 0 hodnoty = {} +players = {} +pointer = "" with open("hodnoty.csv", "r") as csv_file: csv_reader = csv.reader(csv_file) @@ -100,6 +102,33 @@ def check_value(throw: str) -> bool: return hodnota +def add_players(iter=False): + global players + global pointer + + 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] = [] + print(f"Do seznamu přidáno jméno {inp}.") + if not iter: + pointer = inp + add_players(True) + def game(data: tuple): if data[0] == "count": count = data[1] @@ -136,6 +165,7 @@ def game(data: tuple): 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) -- 2.47.3 From 6ad58046a68c58776e1c79af54d8eb639fec76cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Tue, 23 Jun 2026 21:08:47 +0200 Subject: [PATCH 16/32] =?UTF-8?q?feature/hraci:=20dal=C5=A1=C3=AD=20hod=20?= =?UTF-8?q?v=20r=C3=A1mci=20"tahu"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/main.py b/main.py index d0c6e12..62555be 100644 --- a/main.py +++ b/main.py @@ -90,6 +90,9 @@ def evaluate(inp: Any, count: int, throw: str) -> tuple: data = ("count", new_count, old_throw) return data + elif inp == "h": + data = ("count", count, "") + return data def check_value(throw: str) -> bool: throw_s = sorted(throw) -- 2.47.3 From 7e412f4d9efee3b0d391cae19fd399eec15fd4d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Tue, 23 Jun 2026 21:17:35 +0200 Subject: [PATCH 17/32] =?UTF-8?q?feature/hraci:=20pomocn=C3=A1=20funkce=20?= =?UTF-8?q?next=5Fplayer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/main.py b/main.py index 62555be..633f49e 100644 --- a/main.py +++ b/main.py @@ -8,6 +8,7 @@ score = 0 hodnoty = {} players = {} pointer = "" +first = "" with open("hodnoty.csv", "r") as csv_file: csv_reader = csv.reader(csv_file) @@ -55,6 +56,17 @@ def evaluate(inp: Any, count: int, throw: str) -> tuple: 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("^\d+$", inp): if len(inp) > count: @@ -108,6 +120,7 @@ def check_value(throw: str) -> bool: def add_players(iter=False): global players global pointer + global first if not iter: var = "prvního hráče" @@ -130,6 +143,7 @@ def add_players(iter=False): print(f"Do seznamu přidáno jméno {inp}.") if not iter: pointer = inp + first = inp add_players(True) def game(data: tuple): -- 2.47.3 From 9added32009ae56de00c2e0c8359e8e15b80547c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Tue, 23 Jun 2026 21:31:15 +0200 Subject: [PATCH 18/32] =?UTF-8?q?feature/hraci:=20vyhodnocen=C3=AD=20konce?= =?UTF-8?q?=20"tahu";=20p=C5=99epnut=C3=AD=20na=20dal=C5=A1=C3=ADho=20hr?= =?UTF-8?q?=C3=A1=C4=8De=20v=20=C5=99ad=C4=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 633f49e..2484b49 100644 --- a/main.py +++ b/main.py @@ -68,7 +68,7 @@ def evaluate(inp: Any, count: int, throw: str) -> tuple: pointer = nxt_key inp = str(inp) - if re.search("^\d+$", 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 @@ -105,6 +105,13 @@ def evaluate(inp: Any, count: int, throw: str) -> tuple: elif inp == "h": data = ("count", count, "") return data + elif inp == "k": + global score + players[pointer].append(score) + score = 0 + next_player() + data = ("count", 6, "") + return data def check_value(throw: str) -> bool: throw_s = sorted(throw) -- 2.47.3 From 61dc5056ff74cb21566b8b3a6fe170128187e264 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Tue, 23 Jun 2026 21:38:17 +0200 Subject: [PATCH 19/32] =?UTF-8?q?feature/hraci:=20o=C5=A1et=C5=99en=C3=AD?= =?UTF-8?q?=20edge-case:=20hot=20dice?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 2484b49..8250dec 100644 --- a/main.py +++ b/main.py @@ -161,9 +161,11 @@ def game(data: tuple): th = throw(count) clear() print(show_throw(th)) - if not check_value(th) and data[2] == "": + if not check_value(th) and data[2] == "" and count != 0: print("Smůla, třeba příště.") 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" -- 2.47.3 From 83f4a222ade3891956df80554058a10a8dc1f3ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Tue, 23 Jun 2026 21:49:40 +0200 Subject: [PATCH 20/32] =?UTF-8?q?feature/hraci:=20hod=20s=20nulovou=20hodn?= =?UTF-8?q?otou=20zap=C3=AD=C5=A1e=200=20bod=C5=AF=20a=20p=C5=99epne=20na?= =?UTF-8?q?=20dal=C5=A1=C3=ADho=20hr=C3=A1=C4=8De?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 8250dec..1306607 100644 --- a/main.py +++ b/main.py @@ -162,7 +162,11 @@ def game(data: tuple): clear() print(show_throw(th)) if not check_value(th) and data[2] == "" and count != 0: - print("Smůla, třeba příště.") + global score + score = 0 + input("Oh no... anyway.") + data = evaluate("k", count, th) + game(data) else: if count == 0: count = 6 -- 2.47.3 From cf21f7fbdde411f5abb6164b4492c097bbe6a4a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Tue, 23 Jun 2026 22:04:44 +0200 Subject: [PATCH 21/32] =?UTF-8?q?feature/hraci:=20z=C3=A1kaz=20nov=C3=A9ho?= =?UTF-8?q?=20hodu=20v=C3=ADce=20ne=C5=BE=20jednou=20v=20=C5=99ad=C4=9B=20?= =?UTF-8?q?(v=C4=8Detn=C4=9B=20hodu=20n=C3=A1sleduj=C3=ADc=C3=ADho=20po=20?= =?UTF-8?q?prvn=C3=ADm=20hodu=20tahu)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 1306607..a77dfe7 100644 --- a/main.py +++ b/main.py @@ -9,6 +9,7 @@ hodnoty = {} players = {} pointer = "" first = "" +h_bool = True with open("hodnoty.csv", "r") as csv_file: csv_reader = csv.reader(csv_file) @@ -48,6 +49,9 @@ def clear(): _ = 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 @@ -99,16 +103,25 @@ def evaluate(inp: Any, count: int, throw: str) -> tuple: 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": - data = ("count", count, "") + 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) score = 0 + h_bool = True next_player() data = ("count", 6, "") return data @@ -175,6 +188,7 @@ def game(data: tuple): " - Hodit znovu: [h].\n" f" - Ukončit hod a ponechat si skóre z tohoto hodu ({score}): [k].\n" ) + print(players) # if old_throw != "": # msg += f"\nHodnoty odložených kostek: {old_throw}" inp = input(msg) -- 2.47.3 From 0e134eb4a873f0a594887206e4c661e7004ccf1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Tue, 23 Jun 2026 22:15:31 +0200 Subject: [PATCH 22/32] =?UTF-8?q?feature/hraci:=20p=C5=99id=C3=A1n=20ukaza?= =?UTF-8?q?tel=20aktivn=C3=ADho=20hr=C3=A1=C4=8De=20s=20aktu=C3=A1ln=C3=AD?= =?UTF-8?q?m=20sk=C3=B3re=20p=C5=99es=20agrega=C4=8Dn=C3=AD=20prom=C4=9Bnn?= =?UTF-8?q?ou?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index a77dfe7..820743e 100644 --- a/main.py +++ b/main.py @@ -10,6 +10,7 @@ players = {} pointer = "" first = "" h_bool = True +aggr = {} with open("hodnoty.csv", "r") as csv_file: csv_reader = csv.reader(csv_file) @@ -120,6 +121,7 @@ def evaluate(inp: Any, count: int, throw: str) -> tuple: elif inp == "k": global score players[pointer].append(score) + aggr[pointer] = sum(players[pointer]) score = 0 h_bool = True next_player() @@ -160,6 +162,7 @@ def add_players(iter=False): 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 @@ -173,6 +176,7 @@ def game(data: tuple): 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 @@ -188,7 +192,6 @@ def game(data: tuple): " - Hodit znovu: [h].\n" f" - Ukončit hod a ponechat si skóre z tohoto hodu ({score}): [k].\n" ) - print(players) # if old_throw != "": # msg += f"\nHodnoty odložených kostek: {old_throw}" inp = input(msg) -- 2.47.3 From 973a08ebd51bc7c956542426ea64b3f801d9f1dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Tue, 23 Jun 2026 22:28:00 +0200 Subject: [PATCH 23/32] =?UTF-8?q?feature/hraci:=20o=C5=A1et=C5=99en=C3=AD?= =?UTF-8?q?=20pr=C3=A1zdn=C3=A9ho=20vstupu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 820743e..10bd7a1 100644 --- a/main.py +++ b/main.py @@ -127,6 +127,9 @@ def evaluate(inp: Any, count: int, throw: str) -> tuple: 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) @@ -192,6 +195,7 @@ def game(data: tuple): " - 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) @@ -199,10 +203,11 @@ def game(data: tuple): game(data) elif data[0] == "msg": - if data[1] == "ER01" or data[1] == "ER02": + 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) -- 2.47.3 From 1cd796d3d92206d1bccdd5da0c803a302056196b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Tue, 23 Jun 2026 22:35:37 +0200 Subject: [PATCH 24/32] =?UTF-8?q?refactor:=20=C4=8Di=C5=A1t=C4=9Bn=C3=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/main.py b/main.py index 10bd7a1..84e7913 100644 --- a/main.py +++ b/main.py @@ -101,7 +101,7 @@ def evaluate(inp: Any, count: int, throw: str) -> tuple: new_count = len(old_throw) - if eval_score(pick) == False: + if not eval_score(pick): new_count = count old_throw = throw else: @@ -195,9 +195,6 @@ def game(data: tuple): " - 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) -- 2.47.3 From e1450a1d301d6d0339853a0e6f49a3faf8cf8d89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Wed, 24 Jun 2026 10:14:46 +0200 Subject: [PATCH 25/32] =?UTF-8?q?feature/konec-hry:=20nastaven=C3=AD=20v?= =?UTF-8?q?=C3=ADt=C4=9Bzn=C3=A9ho=20sk=C3=B3re?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index 84e7913..1a1a0d7 100644 --- a/main.py +++ b/main.py @@ -11,6 +11,7 @@ pointer = "" first = "" h_bool = True aggr = {} +final_score = 10000 with open("hodnoty.csv", "r") as csv_file: csv_reader = csv.reader(csv_file) @@ -146,6 +147,7 @@ def add_players(iter=False): global players global pointer global first + global final_score if not iter: var = "prvního hráče" @@ -157,6 +159,11 @@ def add_players(iter=False): if inp == "x": if not iter: add_players() + inp = input("Zadejte finální skóre (nechte prázdné pro výchozích 10 000): ") + if inp != "": + inp = int(inp) + final_score = inp + elif inp == "": print("Jméno nemůže být prázdné.") add_players(iter) @@ -179,7 +186,8 @@ def game(data: tuple): if(th == ""): th = throw(count) clear() - print(f"Na tahu je {pointer} ({aggr[pointer]})") + 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 @@ -213,6 +221,7 @@ def game(data: tuple): print(msg) def main(): + clear() print("Vítejte ve hře v kostky!") add_players() input("Prosím, stiskněte enter pro první hod:") -- 2.47.3 From 4ec5a15e321b3526c6f6f749c12e58b1a4556390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Wed, 24 Jun 2026 23:34:00 +0200 Subject: [PATCH 26/32] =?UTF-8?q?feature/konec-hry:=20vyhodnocen=C3=AD=20v?= =?UTF-8?q?=C3=ADt=C4=9Bze=20v=C4=8Detn=C4=9B=20p=C5=99=C3=ADpadu=20stejn?= =?UTF-8?q?=C3=A9ho=20po=C4=8Dtu=20bod=C5=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/main.py b/main.py index 1a1a0d7..0a6331f 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,7 @@ from random import randint from os import system, name import re import csv +from collections import Counter score = 0 hodnoty = {} @@ -127,6 +128,10 @@ def evaluate(inp: Any, count: int, throw: str) -> tuple: h_bool = True next_player() data = ("count", 6, "") + if pointer == first: + winner = check_win() + if winner: + data = ("win", winner, aggr[winner]) return data else: data = ("msg", "ER03", "Zadejte prosím platnou hodnotu:", count, throw) @@ -179,6 +184,30 @@ def add_players(iter=False): first = inp add_players(True) +def check_win() -> str: + over_limit = {} + for p in aggr: + if aggr[p] >= final_score: + over_limit[p] = aggr[p] + + i = 1 + 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 i == 1: + if count[c] == 1: + winner = over_limit_sorted_list[0][0] + return winner + def game(data: tuple): if data[0] == "count": count = data[1] @@ -219,6 +248,14 @@ def game(data: tuple): else: msg = data[1] print(msg) + + 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ě.") def main(): clear() -- 2.47.3 From e550f7d50ac244f996d12db4ad4b7e2167987054 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Wed, 24 Jun 2026 23:53:07 +0200 Subject: [PATCH 27/32] =?UTF-8?q?fix:=20opraveno=20iterov=C3=A1n=C3=AD=20v?= =?UTF-8?q?=C3=ADt=C4=9Bze=20v=20check=5Fwin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/main.py b/main.py index 0a6331f..1af2f02 100644 --- a/main.py +++ b/main.py @@ -190,7 +190,6 @@ def check_win() -> str: if aggr[p] >= final_score: over_limit[p] = aggr[p] - i = 1 winner = "" if over_limit: @@ -203,9 +202,10 @@ def check_win() -> str: count = Counter(list(over_limit_sorted.values())) for c in count: - if i == 1: - if count[c] == 1: - winner = over_limit_sorted_list[0][0] + if count[c] == 1: + winner = over_limit_sorted_list[0][0] + break + return winner def game(data: tuple): -- 2.47.3 From 4da38654aab3961cadfc514e117dea9d87e13d54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Thu, 25 Jun 2026 13:15:18 +0200 Subject: [PATCH 28/32] =?UTF-8?q?fix/loop:=20zm=C4=9Bna=20z=20rekurzivn?= =?UTF-8?q?=C3=AD=20funkce=20na=20while=20loop=20v=20game()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 90 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 45 insertions(+), 45 deletions(-) diff --git a/main.py b/main.py index 1af2f02..b411869 100644 --- a/main.py +++ b/main.py @@ -209,53 +209,53 @@ def check_win() -> str: return winner def game(data: tuple): - 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) - 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" - ) - 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] + while True: + if data[0] == "count": + count = data[1] + th = data[2] + if(th == ""): + th = throw(count) clear() - inp = input(msg) - data = evaluate(inp, count, th) - game(data) - else: - msg = data[1] - print(msg) - - elif data[0] == "win": - winner = data[1] - score = data[2] + 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" + ) + inp = input(msg) + data = evaluate(inp, count, th) - clear() - print(f"Vítězem se stává {winner} s {score} body!") - print("Díky za hru a zase příště.") + 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() -- 2.47.3 From 663cc79a3543b66bcde7ed88c93d79bc14a78ce3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Thu, 25 Jun 2026 13:36:33 +0200 Subject: [PATCH 29/32] =?UTF-8?q?fix/loop:=20zm=C4=9Bna=20z=20rekurzivn?= =?UTF-8?q?=C3=AD=20funkce=20add=5Fplayers()=20na=20while=20loop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 51 ++++++++++++++++++++++++--------------------------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/main.py b/main.py index b411869..ab926d1 100644 --- a/main.py +++ b/main.py @@ -149,40 +149,37 @@ def check_value(throw: str) -> bool: return hodnota def add_players(iter=False): - global players - global pointer - global first - global final_score + global pointer, first, final_score - 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}: ") + 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 - if inp == "x": - if not iter: - add_players() - inp = input("Zadejte finální skóre (nechte prázdné pro výchozích 10 000): ") - if inp != "": - inp = int(inp) - final_score = inp - - elif inp == "": - print("Jméno nemůže být prázdné.") - add_players(iter) - else: - if inp in players: + 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}.") - if not iter: - pointer = inp - first = inp - add_players(True) + + inp = input("Zadejte finální skóre (nechte prázdné pro výchozích 10 000): ") + if inp != "": + inp = int(inp) + final_score = inp def check_win() -> str: over_limit = {} -- 2.47.3 From 5f5d3319ed1e05b9830472e479d4cb9bc645abda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Thu, 25 Jun 2026 13:38:06 +0200 Subject: [PATCH 30/32] =?UTF-8?q?fix/loop:=20zad=C3=A1v=C3=A1n=C3=AD=20c?= =?UTF-8?q?=C3=ADlov=C3=A9ho=20sk=C3=B3re=20jako=20while=20loop=20s=20try-?= =?UTF-8?q?except=20blokem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/main.py b/main.py index ab926d1..dcb2bba 100644 --- a/main.py +++ b/main.py @@ -176,10 +176,18 @@ def add_players(iter=False): aggr[inp] = 0 print(f"Do seznamu přidáno jméno {inp}.") - inp = input("Zadejte finální skóre (nechte prázdné pro výchozích 10 000): ") - if inp != "": - inp = int(inp) - final_score = 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 as e: + print("Zadejte prosím platnou číselnou hodnotu.") + else: + break + else: + break def check_win() -> str: over_limit = {} -- 2.47.3 From 7f9e3e9ef7e6ba47c24b1427d3d36bbefb4f5e89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Sp=C3=A1=C4=8Dil?= Date: Thu, 25 Jun 2026 13:46:38 +0200 Subject: [PATCH 31/32] =?UTF-8?q?fix/loop:=20drobn=C3=A9=20opravy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/main.py b/main.py index dcb2bba..ffefad1 100644 --- a/main.py +++ b/main.py @@ -148,7 +148,7 @@ def check_value(throw: str) -> bool: return hodnota -def add_players(iter=False): +def add_players(): global pointer, first, final_score while True: @@ -182,7 +182,7 @@ def add_players(iter=False): try: inp = int(inp) final_score = inp - except ValueError as e: + except ValueError: print("Zadejte prosím platnou číselnou hodnotu.") else: break -- 2.47.3 From ed309a10b4f689ba348c7ec31a815a346f35eefb Mon Sep 17 00:00:00 2001 From: david Date: Thu, 25 Jun 2026 14:02:11 +0200 Subject: [PATCH 32/32] Aktualizovat README.md --- README.md | 92 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) diff --git a/README.md b/README.md index de96784..c240e8c 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,94 @@ # kostky +Textová (CLI) hra v kostky pro více hráčů – varianta klasického *Farkle* +(„tisícovky“). Běží celá v terminálu a je napsaná v čistém Pythonu bez +externích závislostí. + +## Požadavky + +- Python 3.7+ (hra se spoléhá na zachování pořadí klíčů ve slovníku) +- Žádné externí balíčky – používá se jen standardní knihovna + (`random`, `os`, `re`, `csv`, `collections`, `typing`) + +## Spuštění + +```bash +git clone https://gitea.spacilovi.eu/david/kostky.git +cd kostky +python main.py +``` + +> Hru spouštěj z adresáře projektu – soubor `hodnoty.csv` (bodovací tabulka) +> se načítá relativní cestou vůči aktuálnímu adresáři. + +## Jak se hraje + +### Začátek hry + +1. Zadej jméno prvního hráče (povinné, nesmí být prázdné). +2. Přidávej další hráče; zadáním `x` zadávání ukončíš. Jména musí být unikátní. +3. Zadej cílové skóre, nebo nech pole prázdné pro výchozích **10 000**. + +### Průběh tahu + +Na začátku tahu uvidíš cílové skóre, kdo je na tahu (a jeho celkové skóre) +a hod šesti kostkami s očíslovanými pozicemi: + +``` +Vítězné skóre: 10000. +Na tahu je Anna (0). +1, 5, 3, 2, 6, 4 +^ ^ ^ ^ ^ ^ +1 2 3 4 5 6 +``` + +Pak zvolíš jednu z akcí: + +| Vstup | Akce | +| --- | --- | +| `pozice kostek` | Odložíš vybrané kostky k vyhodnocení (např. `1`, `34`, `123456`). Hodnoty na zvolených pozicích musí dohromady tvořit některou kombinaci z bodovací tabulky. | +| `h` | Hodíš znovu zbývajícími kostkami. Povoleno až poté, co v tomto tahu odložíš aspoň jednu bodující kombinaci. | +| `k` | Ukončíš tah, připíšeš si nasbírané skóre a předáš tah dalšímu hráči. | + +Odkládat můžeš i víc kombinací po sobě – po každém vyhodnocení pokračuješ se +zbývajícími kostkami a body se v rámci tahu sčítají. + +### Smůla, hot dice a výhra + +- **Smůla (bust):** když čerstvý hod neobsahuje žádnou bodující kombinaci, + o body z tohoto tahu přijdeš a tah přechází na dalšího hráče. +- **Hot dice:** když se ti podaří odložit všech šest kostek, dostaneš čerstvý + hod šesti kostkami a pokračuješ ve stejném tahu. +- **Výhra:** po dokončení každého kola se kontroluje, jestli někdo dosáhl + cílového skóre. Vyhrává osamocený lídr nad limitem; při shodě na první + příčce se hraje dál. + +## Bodování + +Kompletní tabulka je v souboru [`hodnoty.csv`](hodnoty.csv). Kombinace se +vyhodnocuje podle hodnot odložených kostek – na jejich pořadí nezáleží. + +### Stejné kostky + +| Kostka | ×1 | ×2 | ×3 | ×4 | ×5 | ×6 | +| --- | --- | --- | --- | --- | --- | --- | +| **1** | 100 | 200 | 1000 | 2000 | 4000 | 8000 | +| **2** | – | – | 200 | 400 | 800 | 1600 | +| **3** | – | – | 300 | 600 | 1200 | 2400 | +| **4** | – | – | 400 | 800 | 1600 | 3200 | +| **5** | 50 | – | 500 | 1000 | 2000 | 4000 | +| **6** | – | – | 600 | 1200 | 2400 | 4800 | + +(„–“ = daná kombinace samostatně neboduje.) + +### Postupky + +| Kombinace | Body | +| --- | --- | +| 1-2-3-4-5 | 750 | +| 2-3-4-5-6 | 1000 | +| 1-2-3-4-5-6 | 1500 | + +## Licence + +Projekt je licencovaný pod [GPL-3.0](LICENSE). \ No newline at end of file -- 2.47.3