From f1055fd6d08ebd57588e242ca76f09826750a0ca Mon Sep 17 00:00:00 2001 From: jonas H Date: Sun, 23 Aug 2026 13:15:14 +0200 Subject: [PATCH] fix another finish bug in myrummy --- myrummy/READEME.txt | 8 +++++++- myrummy/game.py | 28 ++++++++++++++++++---------- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/myrummy/READEME.txt b/myrummy/READEME.txt index 82e0b3a..21b504e 100644 --- a/myrummy/READEME.txt +++ b/myrummy/READEME.txt @@ -38,8 +38,14 @@ Regeln der Implementierung: - Satz: gleiche Zahl, unterschiedliche Farben, 3-4 Karten - Folge: gleiche Farbe, aufsteigend, 3+ Karten - Joker dürfen in Folgen Lücken füllen - - Erstmeldung: mindestens 30 Punkte + - Erstmeldung: mindestens 30 Punkte (abschaltbar) - Wer keine Handkarten mehr hat, gewinnt + - Zug = legen ODER ziehen, nie beides: + - Wer gelegt hat, darf nicht mehr ziehen + - Wer gezogen hat, darf nicht mehr legen und beendet den Zug mit finish + - Nach dem Ziehen ist finish auch ohne 30 Punkte erlaubt (man darf passen, + solange man noch nicht eröffnet hat) + - Leerer Tisch + nicht gezogen: finish verlangt, dass man legt oder zieht Hinweis: Das ist eine bewusst einfache CLI-Version. Die Regeln für Sonderfälle wie Joker-Rücknahme, 1-13-Runden, Punktwertung nach Spielende usw. können später diff --git a/myrummy/game.py b/myrummy/game.py index 5964ee8..e575e78 100644 --- a/myrummy/game.py +++ b/myrummy/game.py @@ -27,6 +27,7 @@ class Game: self.deck=deck(); random.shuffle(self.deck) self.history=[] self.drew=False + self.melded=False self.handover=False for p in self.players: p.hand=sort_hand([self.deck.pop() for _ in range(14)]) @@ -35,12 +36,12 @@ class Game: def p(self): return self.players[self.turn] def save(self): - self.history.append(copy.deepcopy((self.players,self.table,self.deck,self.drew))) + self.history.append(copy.deepcopy((self.players,self.table,self.deck,self.drew,self.melded))) def undo(self): if not self.history: print('Nichts zum Rückgängigmachen.'); return - self.players,self.table,self.deck,self.drew=self.history.pop() + self.players,self.table,self.deck,self.drew,self.melded=self.history.pop() def clear(self): print('\033[2J\033[H',end='') @@ -82,10 +83,12 @@ class Game: return n-1 def move_hand(self,h,g): + if self.drew: raise ValueError('Du hast bereits gezogen - damit ist dein Zug beendet.') hi=self.idx(h,len(self.p.hand)); self.save() card=self.p.hand.pop(hi) if g.lower()=='new': self.table.append([card]) else: self.table[self.idx(g,len(self.table))].append(card) + self.melded=True def move_table(self,g,c): gi=self.idx(g,len(self.table)); ci=self.idx(c,len(self.table[gi])); self.save() @@ -104,6 +107,7 @@ class Game: self.save(); x=self.table[gi]; self.table[gi]=x[:pos]; self.table.insert(gi+1,x[pos:]) def draw(self): + if self.melded: raise ValueError('Du hast bereits Karten gelegt - ziehen ist dann nicht mehr erlaubt.') if self.drew: raise ValueError('Du hast bereits gezogen.') if not self.deck: raise ValueError('Stapel leer.') self.save(); self.p.hand.append(self.deck.pop()); self.p.hand=sort_hand(self.p.hand); self.drew=True @@ -112,17 +116,21 @@ class Game: if any(not g or not valid(g, self.wrap) for g in self.table): print('Zug ungültig: Es gibt eine ungültige Tischgruppe.') return False - if not self.p.opened: - if self.min30: - total=sum(sum(points(c) for c in g) for g in self.table) - if total<30: - print(f'Erstmeldung braucht mindestens 30 Punkte. Aktuell: {total}') - return False - self.p.opened=True + if self.table: + if not self.p.opened: + if self.min30: + total=sum(sum(points(c) for c in g) for g in self.table) + if total<30: + print(f'Erstmeldung braucht mindestens 30 Punkte. Aktuell: {total}') + return False + self.p.opened=True + elif not self.drew: + print('Du musst entweder Karten legen oder ziehen.') + return False if not self.p.hand: print(f'\n{self.p.name} gewinnt!') return True - self.turn=1-self.turn; self.drew=False; self.history=[] + self.turn=1-self.turn; self.drew=False; self.melded=False; self.history=[] self.handover=True return False