Mau Mau Spiel

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
rejes
User
Beiträge: 4
Registriert: Samstag 10. November 2018, 14:02

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.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

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?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
__blackjack__
User
Beiträge: 13101
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten