Python :: Aufgabe #300 :: Lösung #1

2 Lösungen Lösungen öffentlich
#300

Kniffel (Yahtzee, Pasch)

Fortgeschrittener - Python von JKooP - 06.11.2020 um 15:24 Uhr
Schreibe eine Klasse/Modul mit der/dem es möglich ist das Spiel Kniffel in abgespeckter Form abzubilden.
Zur Vereinfachung soll statt 3 nur 1 Mal gewürfelt werden.
Als Ergebnis sollen alle möglichen Gewinnstufen eines Wurfs sowohl des oberen als auch des unteren Blocks mit der erreichten Punktzahl ausgegeben werden.

Beispielwurf: 2-2-2-4-4

Oberer Block:
Zweier: 2+2+2 = 6 (nur Summe der 2er zählen)
Vierer: 4+4 = 8 (nur Summe der 4er zählen)

Unterer Block:
Dreierpasch: 2+2+2 und 4+6 = 16 (Summe aller Augen)
Full House: Dreierpasch + Zweierpasch -> Sonderwertung = 25
Chance: 2+2+2+4+6 = 16 (Summe aller Augen)

Als Erweiterung kann auch das dreimalige Würfeln implementiert werden.
Da die Interaktion mit der Konsole nicht allzu bedienerfreundlich ist, sollte
man vielleicht auf eine grafischen Benutzeroberfläche ausweichen.

Viel Spaß
#1
vote_ok
von Klaus (1960 Punkte) - 02.12.2020 um 23:26 Uhr
Quellcode ausblenden Python-Code
from random import randint

class Yahtzee:
    def __init__(self):
        self.roll=[]
        self.roll_result={}
        self.block = {}

    def start(self, iteration):
        for index in range(iteration):
            self.roll_dice()
            print(f'\nWurf: {self.roll}')
            self.evaluate_roll()
            self.show_result()

    def roll_dice(self):
        self.roll=[]
        self.roll_result={1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0}

        for index in range(5):
            self.roll.append(randint(1, 6))
        for element in self.roll:
            self.roll_result[element] += 1

    def evaluate_roll(self):
        self.block = {
            'Einser': 0,
            'Zweier': 0,
            'Dreier': 0,
            'Vierer': 0,
            'Fünfer': 0,
            'Sechser': 0,
            'Dreierpasch': 0,
            'Viererpasch': 0,
            'Full House': 0,
            'Kleine Straße': 0,
            'Große Straße': 0,
            'Yahtzee': 0,
            'Chance': 0
        }

        if self.__check_dice_rolled():
            self.block['Einser'] = self.roll_result[1] * 1
            self.block['Zweier'] = self.roll_result[2] * 2
            self.block['Dreier'] = self.roll_result[3] * 3
            self.block['Vierer'] = self.roll_result[4] * 4
            self.block['Fünfer'] = self.roll_result[5] * 5
            self.block['Sechser'] = self.roll_result[6] * 6
            if max(self.roll_result.values()) >= 3:
                self.block['Dreierpasch'] = sum(self.roll)
            if max(self.roll_result.values()) >= 4:
                self.block['Viererpasch'] = sum(self.roll)
            if 3 in self.roll_result.values() and 2 in self.roll_result.values():
                self.block['Full House'] = 25
            check_list = sorted(set(self.roll))
            if check_list == [1, 2, 3, 4] or check_list == [2, 3, 4, 5] or check_list == [3, 4, 5, 6]:
                self.block['Kleine Straße'] = 30
            if sorted(self.roll) in [[1, 2, 3, 4, 5], [2, 3, 4, 5, 6]]:
                self.block['Große Straße'] = 40
                self.block['Kleine Straße'] = 30
            if max(self.roll_result.values()) == 5:
                self.block['Yahtzee'] = 50
            self.block['Chance'] = sum(self.roll)
        else:
            print('Sie müssen die Würfel erst werfen, bevor Sie das Ergebnis auswerten können.') 

    def show_result(self):
        if self.__check_result_evaluated():
            for element in self.block:
                if self.block[element] != 0:
                    print(f'{element:15.15}{str(self.block[element]):>2.2} Pkt.')
        else:
            print('Sie müssen erst würfeln bzw. den Wurf auswerten, bevor Sie die Ergebnisse angezeigt bekommen.')

    def __check_dice_rolled(self):
        if not self.roll:
            return False
        else:
            return True

    def __check_result_evaluated(self):
        if not self.block:
            return False
        else:
            return True

if __name__ == "__main__":
    y = Yahtzee()
    y.start(5)

Kommentare:

Für diese Lösung gibt es noch keinen Kommentar

Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
1988428

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.