fix another finish bug in myrummy

This commit is contained in:
2026-08-23 13:15:14 +02:00
parent 54958e79e7
commit f1055fd6d0
2 changed files with 25 additions and 11 deletions
+7 -1
View File
@@ -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
+18 -10
View File
@@ -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