Seite 1 von 1

Mau Mau Spiel

Verfasst: Freitag 23. November 2018, 20:50
von rejes

Code: Alles auswählen

import random


def spielernamevergabe():
    deck = []
    nummer = list(range(7, 11))
    value = nummer + ['Bube', 'Dame', 'Koenig', 'As']
    farbe = ['Blau', 'Gruen', 'Gelb', 'Rot']

    for elem in value:
        for secondElem in farbe:
            deck.append((str(elem), secondElem))
    print("32 Skat Karten. Aufsteigend nach Zahl sortiert:")
    print(deck)
    random.shuffle(deck)
    print("\nGemischt:")
    print(deck)




anzahlSpieler = 0
actualKarte = []
stappel=[]
anzahlKarteProSpieler = 0

while True:
    try:
        anzahlSpieler = int(input('Es dürfen 2-4 Spieler mitspielen. Bitte Geben Sie die Anzahl der Teilnehmer an: '))
        if 1 < anzahlSpieler < 5:
            break
        else:
                print("Anzahl muss zwischen 2 und 4 liegen.")
    except ValueError:
            print("not a number")

spieler = []

for i in range(anzahlSpieler):
    i=i+1
    actualSpieler = input('Geben Sie für einen Namen für den ' + i.__str__() + '. Spieler ')
    if actualSpieler.strip():
        spieler.append(actualSpieler)
    else:
        spieler.append('Spieler*In '+i.__str__())
        print(spieler)

while True:
    try:
        anzahlKarteProSpieler = int(input('Anzahl Karten pro Spieler? Anzahl ist zwischen 3 und 5 möglich: '))
        if 2 < anzahlKarteProSpieler < 6:
            break
        else:
            print("Anzahl Karten pro Spieler muss zwischen 3 und 5 liegen.")
    except ValueError:
        print("not a number")


[b]deck = []
verteilung = []
print(deck)
for x in spieler:
    print('Spieler: '+x+' erhält nun die Karten.')
    for y in range(anzahlKarteProSpieler):
        verteilung.append((str(x), deck[0]))
        deck.pop(0) #die Karten werden von der Liste gelöscht, da Sie einmalig verteilbar, nachdem Sie auf den Tisch gelegt werden, kommen Sie wieder auf die Stappel.[/b]
        
        
        
        print(verteilung)
        print(deck)

        print('\nDie Restlichen '+str(len(deck))+' werden auf dem Tisch gelegt. Nun wird die oberste Karte umgedreht.')

spielernamevergabe()

actualKarte=deck[0]
stappel=actualKarte
deck.pop(0)
print('\nUnd die Karte ist: Zahl:'+actualKarte[0]+' Farbe:'+actualKarte[1]+'\n')

n = 0

for x in verteilung:
    for i in spieler:
        if i in x:
            if n >=len(verteilung):
                n=0
                if actualKarte[0] in verteilung[n][1][0]:
                    print(str(verteilung[n][0]) + ' hat die Karte' + str(verteilung[n][1]) + ' hingelegt.\n')
                    actualKarte = verteilung[n][1]
                    stappel = actualKarte
                    print('\nDie neue Karte auf dem stappel ist ' + str(actualKarte) + '\n')
                    verteilung.pop(n)
                    n=n-1

                elif actualKarte[1] in verteilung[n][1][1] :
                    print(str(verteilung[n][0]) + ' hat die Karte' + str(verteilung[n][1]) + ' hingelegt.\n')
                    actualKarte = verteilung[n][1]
                    stappel = actualKarte
                    print('\nDie neue Karte auf dem stappel ist ' + str(actualKarte) + '\n')
                    verteilung.pop(n)
                    n=n-1

                else:
                    print(verteilung[n][0] + ' zieht eine neue Karte.\n')
                    verteilung.append((str(verteilung[n][0]), deck[0]))
                    deck.pop(0)

                n+=anzahlKarteProSpieler;

    print(verteilung)
    print(deck)


deck = []
verteilung = []
print(deck)
for x in spieler:
print('Spieler: '+x+' erhält nun die Karten.')
for y in range(anzahlKarteProSpieler):
verteilung.append((str(x), deck[0]))
deck.pop(0)

Hier kommt in der Konsole ein IndexError: list index out of range. ich weiß nicht wo mein Fehler hier sein soll..
könnt ihr mir dabei helfen bitte.

Und könnt ihr mir bitte sagen, ob mein MauMauspiel Code so richtig ist,
Damit keine Fehlermeldung in den nächsten Zeilen vorkommt bitte :)

Danke im vorraus.

Rejes.

Re: Mau Mau Spiel

Verfasst: Freitag 23. November 2018, 23:09
von darktrym

Code: Alles auswählen

deck = []
#verteilung = []
#print(deck)
for x in spieler:
    #print('Spieler: '+x+' erhaelt nun die Karten.')
    for y in range(anzahlKarteProSpieler):
        verteilung.append((str(x), deck[0]))
Im Ernst, erst leeren und dann auf das erste Element zugreifen?

Re: Mau Mau Spiel

Verfasst: Samstag 24. November 2018, 02:01
von __blackjack__
Erst auf ``deck[0]`` zugreifen und dann in der nächsten Zeile ``deck.pop(0)`` nur wegen des Nebeneffektes hinzuschreiben ist auch nicht gerade sinnvoll. Das wäre dann eher ``del deck[0]``. Aber besser wäre ``deck.pop(0)`` gleich im `append()` zu verwenden, denn der Aufruf liefert das entfernte Objekt ja als Rückgabewert. Noch besser wäre es nicht von vorne, sondern vom hinten zu ”poppen”, denn das wäre dann nicht so furchtbar ineffizient. Und *noch* besser wäre es sich die Schleife zu sparen die für jede einzelne Karte durchlaufen wird, und stattdessen gleich per slicing alle Karten für einen Spieler zuzuweisen und dann per ``del`` und slicing zu löschen. Oder erst am Ende alle übriggebliebenen Karten als `deck` zu selektieren.

`x` ist ein schlechter Name für einen Spieler. Besser wäre `spieler`. Aber so heisst ja schon die Liste mit allen Spielern. Schönes Beispiel warum deutsch für Bezeichner blöd ist. Englisch wäre es kein Problem ein lesbares ``for player in players:`` zu schreiben.