17+4 (Black Jack)

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
Leo_mag_Phyton
User
Beiträge: 1
Registriert: Sonntag 16. März 2014, 15:32

Hi, wir haben im Informatik Unterricht die Aufgabe bekommen, ein Spiel zu konstruieren, und zwar 17+ bzw Black Jack. Ich komme so weit, dass die Karten gemischt werden und mir ausgespuckt werde, auch der Zahlenwert ist mit angegeben, nur bekomme ich es nicht hin dass ich nochmal ziehen kann :(

Hier der Code zum reinschauen:

Code: Alles auswählen

import random

def Wert(s_Karte):
    if 'Ass' in s_Karte:
        return 11
    if 'King' in s_Karte:
        return 10
    if 'Queen' in s_Karte:
        
        return 10
    if 'Bube' in s_Karte:
        return 10
    if '10' in s_Karte:
        return 10
    if '9' in s_Karte:
        return 9
    if '8' in s_Karte:
        return 8
    if '7' in s_Karte:
        return 7
    if '6' in s_Karte:
        return 6
    if '5' in s_Karte:
        return 5
    if '4' in s_Karte:
        return 4
    if '3' in s_Karte:
        return 3
    if '2' in s_Karte:
        return 2

Karten=[]
meine_Karten=[]
Gegner_Karten=[]
Farben=["Karo","Herz","Pik","Kreuz"]
Symbole=["Ass","King","Queen","Bube","10","9","8","7","6","5","4","3","2"]

for f in Farben:
    for s in Symbole:
        Karten.append(f+"_"+s)

random.shuffle(Karten)


meine_Karten.append(Karten.pop())
meine_Karten.append(Karten.pop())
Gegner_Karten.append(Karten.pop())
Gegner_Karten.append(Karten.pop())

print "Meine Karten",meine_Karten
print "Gegner Karten",Gegner_Karten

zahl_Wert_m=0
for m_K in meine_Karten:
   zahl_Wert_m+=Wert(m_K)

zahl_Wert_G=0
for G_K in Gegner_Karten:
   zahl_Wert_G+=Wert(G_K)
   
print "Wert (meine Karten):",zahl_Wert_m
print "Wert (Karten des Gegners):",zahl_Wert_G



Schonmal vielen Dank schonmal im Voraus :D :mrgreen: :!:
Zuletzt geändert von Anonymous am Sonntag 16. März 2014, 15:46, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Helfen und geholfen werden

Phyton anfänger

BlackJack

@Leo_mag_Phyton: Um etwas zu wiederholen gibt es Schleifen als Sprachkonstrukt.

Am vorhandenen Code kann man noch einiges verbessern. Zum Beispiel sollte kein Code der nicht Konstanten, Funktionen, oder Klassen definiert direkt auf Modulebene stehen. Das Hauptprogramm steckt man üblicherweise in eine Funktion die `main()` genannt und durch folgendes Idiom aufgerufen wird:

Code: Alles auswählen

if __name__ == '__main__':
    main()
Die Namen sind teilweise auch nicht gut. Typ-Prä- oder Postfixe wie `s_` oder `zahl_` sollte man nicht verwenden, und auch keine Abkürzungen die nicht allgemein bekannt sind.

Eine Karte sollte auch nicht mit einer Zeichenkette beschrieben werden. Denn da werden *zwei* Werte in eine Zeichenkette gesteckt, wovon man dann jedes mal wenn man sich für einen davon interessiert, den aus der Zeichenkette wieder irgendwie isolieren muss. Es wäre sinnvoller die einzelnen Werte auch getrennt in einer Datenstruktur zu speichern. Zum Beispiel in einem Tupel aus Farbe und Symbol. Dann liesse sich der Wert einer Karte auch einfacher bestimmen in dem man sich ein Wörterbuch anlegt welches das Kartensymbol auf den Wert abbildet. Oder man steckt den Wert zusätzlich mit in das Tupel welches eine Karte repräsentiert. An der Stelle fängt dann vielleicht auch `collections.namedtuple` an Sinn zu machen, damit man den Elementen Namen geben kann und nicht mit „magischen” Indizes operieren muss.

Funktionsnamen sollten in der Regel Tätigkeiten beschreiben, denn Funktionen tun etwas. Also zum Beispiel `bestimme_kartenwert()` statt `Wert()`. Bei Schreibweise und Leerzeichensetzung kannst Du mal einen Blick in den Style Guide for Python Code werfen.

Der vorhandene Quelltext könnte auch besser auf Funktionen aufgeteilt werden. Zum Beispiel das erstellen eines Kartendecks kann man in eine Funktion kapseln. Und das berechnen des Wertes von mehreren Karten auch. Du hast dafür den gleichen Code nur mit unterschiedlichen Namen zweimal geschrieben. Und der wird komplizierter, denn mit einfachem aufaddieren der Einzelwerte ist es nicht getan, denn für das Ass gelten besondere Regeln, das kann je nach Situation als 1 oder 11 zählen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Es bietet sich auch eine konsistente Sprachwahl an. "King", "Queen" und "Ass" in einer Folge sehen schon irgendwie lustig aus.

Es heißt übrigens Python und nicht Phyton. Sowohl dein Nick als auch deine Signatur leiden unter diesem Fehler ;-)

Edit: Phython in Phyton "korrigiert" :mrgreen:
Zuletzt geändert von EyDu am Sonntag 16. März 2014, 16:39, insgesamt 1-mal geändert.
Das Leben ist wie ein Tennisball.
BlackJack

Farben und Symbole sind Konstanten und die übliche Konvention ist, die Namen von Konstanten komplett in Grossbuchstaben zu schreiben.

Wenn man Namen am Anfang einer Funktion oder Methode definiert, aber erst später verwendet, macht man den Quelltext unnötig unübersichtlich. Und es wird auch umständlicher Code der zu lang wird auf Funktionen aufzuteilen wenn die Sachen die zusammengehören über die gesamte alte Funktion verteilt sind.

Code: Alles auswählen

#!/usr/bin/env python
import random

FARBEN = ['Karo', 'Herz', 'Pik', 'Kreuz']
SYMBOLE = [
    'Ass', 'Koenig', 'Dame', 'Bube', '10',
    '9', '8', '7', '6', '5', '4', '3', '2'
]


def erstelle_kartenspiel():
    karten = list()
    for farbe in FARBEN:
        for symbol in SYMBOLE:
            if symbol == 'Ass':
                wert = 11
            elif symbol.isdigit():
                wert = int(symbol)
            else:
                wert = 10
            karten.append((farbe, symbol, wert))
    return karten


def karte_als_zeichenkette(karte):
    farbe, symbol, _wert = karte
    return '{0} {1}'.format(farbe, symbol)


def karten_als_zeichenkette(karten):
    return ', '.join(karte_als_zeichenkette(karte) for karte in karten)


def ermittle_kartenwert(karte):
    _farbe, _symbol, wert = karte
    return wert


def ermittle_handwert(karten):
    kartenwert = 0
    for karte in karten:
        kartenwert += ermittle_kartenwert(karte)
    return kartenwert


def main():
    kartenspiel = erstelle_kartenspiel()
    random.shuffle(kartenspiel)

    meine_karten = list()
    gegner_karten = list()
    for karten in [meine_karten, gegner_karten]:
        for _ in xrange(2):
            karten.append(kartenspiel.pop())

    print 'Meine Karten:', karten_als_zeichenkette(meine_karten)
    print 'Gegner Karten:', karten_als_zeichenkette(gegner_karten)

    for karten, text in [
        (meine_karten, 'meine Karten'), (gegner_karten, 'Karten des Gegners')
    ]:
        print 'Wert ({0}): {1}'.format(text, ermittle_handwert(karten))


if __name__ == '__main__':
    main()
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

EyDu hat geschrieben:Es bietet sich auch eine konsistente Sprachwahl an. "King", "Queen" und "Ass" in einer Folge sehen schon irgendwie lustig aus.
Solange man es nicht ungünstig kombiniert... "Ass-Queen" :twisted:

@BlackJack: Das wurde aber auch mal Zeit, daß Du mal ein Black Jack Spiel implementierst :mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Fehlt noch die BJ KI.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Antworten