Craps - If Verschachtelung

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
heni63
User
Beiträge: 3
Registriert: Mittwoch 21. November 2012, 18:50

Hallo Leute,

ich bin zu diesem Forum gestoßen weil ich einfach ein Brett vor dem Kopf habe! Ich sitze
nun schon Stunden an diesem Problem, aber ich finde einfach die Quelle nicht. Ich bin ein Neuling zum Thema programmieren (Schulunterricht,Python) und
ich dachte eigentlich, dass ich es verstanden hätte, bis wir nun die Aufgabe bekommen haben Craps zu programmieren.

Aber jetzt zum Problem:

Code: Alles auswählen

[b]# Import Module[/b]
import random
random.seed()

[b]# Bewertung Roll Out[/b]
Natural = 7 or 11
Crap = 2 or 3 or 12
Point = 4 or 5 or 6 or 8 or 9 or 10

[b]# Wuerfel initalisieren[/b]
Wuerfel1 = random.randint(1,6)
Wuerfel2 = random.randint(1,6)
Wuerfelaugen = Wuerfel1 + Wuerfel2
Wuerfelaugen = 4                            [i]# Hier habe ich zum gezielten durchlaufen einfach mal die 4 genommen[/i]

[b]# Der Roll Out[/b]
print "Roll Out"
print Wuerfelaugen
RollOut = Wuerfelaugen

if(RollOut == 7 or 11 or 3 or 12):    [i]# Was bei Natural oder Craps passiert[/i]
    if(RollOut == 7 or 11):
        print "Natural: Sie haben gewonnen"
    if(RollOut == 2 or 3 or 12):
        print "Crap: Sie haben verloren"


Nun das Problem:

1. Wenn man dieses programm mit der 4 durchlaufen lässt, dürfte normalerweise doch garkein Ergebnis in der Programmausgabe kommen oder?
Die erste if anweisung bekommt doch den wert False und dadurch werden die darauffolgenden anweisungen doch garnicht ausgeführt oder?

2. Könnte es vielleicht an den Variablen liegen? (Abschnitt: Bewertung Roll Out)
Dort habe ich ja den Variablen die verschiedenen Werte zugewiesen. Mein Problem ist nur, dass ich es einfach nicht schaffe diese richtig abzufragen:
Hier habe ich mal ein beispiel reinkopiert, wie ich es versuche:

Code: Alles auswählen

a = 7 and 8
b = 7
if(b == a):
    print 2
Ich scheine auch hier ein Brett vor dem Kopf zu haben. Ich habe es auch mit "or" und "," versucht, aber ich bekomme es einfach nicht hin!
Ich habe es letzten endes damit versucht zu lösen, indem ich einfach die Zahlen eingetragen habe, anstatt der Variablen.
Wie müsste es richtig aussehen?


Ich hoffe, dass ich das Problem gut genug geschildert habe! Bei Fragen oder anderes einfach drauf los schreiben :D


Ich werde wahrscheinlich noch mehr Probleme bekommen, aber ich frage euch wirklich erst, NACHDEM ich am Ende bin :D
2 Bücher über Python habe ich auch schon aus der Bibleothek ausgeliehen, aber hier habe eich keine wirkliche Hilfe finden können :/

LG
heni63
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Willkommen zu Python und im Forum!

Code: Alles auswählen

Natural = 7 or 11
Crap = 2 or 3 or 12
Point = 4 or 5 or 6 or 8 or 9 or 10
Der Abschnitt zeigt, dass du `or` nicht verstanden hast und das ist auch spaeter das Problem:

Code: Alles auswählen

In [1]: 7 or 11
Out[1]: 7

In [2]: 2 or 3 or 12
Out[2]: 2

In [3]: 4 or 5 or 6 or 8 or 9 or 10
Out[3]: 4
Konkret hast du momentan das hier:

Code: Alles auswählen

In [1]: 4 == 7 or 11 or 3 or 12
Out[1]: 11

In [2]: bool(4 == 7 or 11 or 3 or 12)
Out[2]: True
Wenn du testen willst, ob eine Zahl in einer anderen Menge von Zahlen enthalten ist, dann macht man das so:

Code: Alles auswählen

In [4]: natural = set((7, 11))

In [5]: craps = set((2, 3, 12))

In [6]: points = set((4, 5, 6, 8, 9, 10))

In [8]: 4 in natural
Out[8]: False
Stichworte sind Mengen (`set`) und natuerlich der `in` Operator.

Das naechste Problem ist die fehlerhafte Einrueckung beim 2. `if`.
BlackJack

@heni63: ``and`` und ``or`` machen nicht das was Du denkst. Das sind binäre Operatoren ähnlich wie ``+``, ``-``, ``*``, und so weiter. Da steht links und rechts ein Wert und alles drei zusammen wird zu einem Ergebnis ausgewertet. Und zwar entweder zum linken oder rechten Operanden, je nach Operator und Wahrheitswert der Operanden. Du kannst ``and`` und ``or`` nicht einfach so verwenden wie man das in natürlicher Sprache mit `und` und `oder` macht und hoffen dass die Programmiersprache schon richtig rät was dann zu tun ist.

Was auch nicht geht ist ``a == b or c or d``. Das wird implizit so geklammert: ``((((a == b) or b) or c) or d)``. Du musst entweder mehrere Vergleiche mit ``or`` verknüpfen, also ``a == b or a == c or a == d`` oder den ``in``-Operator und eine Sequenz verwenden: ``a in [b, c, d]``. Die Liste mit den Möglichkeiten kannst Du dann auch an einen aussagekräftigen Namen binden, wie Du das am Anfang mit den Zahlen und den ``or``\s versucht hast.

``if`` ist keine Funktion, also sollte man es auch nicht so schreiben als wäre es eine. Die Klammern um die Bedingung sind überflüssig.

`random.seed()` ist ebenfalls überflüssig. Das kann unter Umständen die Zufallsfolge soger *weniger* zufällig machen.

Die Zuweisung an `RollOut` ist auch sinnfrei. Warum nicht weiterhin `Wuerfelaugen`?

Zur konventionellen Namensschreibweise könntest Du mal einen Blick in Style Guide for Python Code werfen.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Erstmal willkommen im Forum ;)
heni63 hat geschrieben:

Code: Alles auswählen

# Import Module
import random
random.seed()

# Bewertung Roll Out
Natural = 7 or 11
Crap = 2 or 3 or 12
Point = 4 or 5 or 6 or 8 or 9 or 10

# Wuerfel initalisieren
Wuerfel1 = random.randint(1,6)
Wuerfel2 = random.randint(1,6)
Wuerfelaugen = Wuerfel1 + Wuerfel2
Wuerfelaugen = 4                            [i]# Hier habe ich zum gezielten durchlaufen einfach mal die 4 genommen[/i]

# Der Roll Out
print "Roll Out"
print Wuerfelaugen
RollOut = Wuerfelaugen

if(RollOut == 7 or 11 or 3 or 12):    [i]# Was bei Natural oder Craps passiert[/i]
    if(RollOut == 7 or 11):
        print "Natural: Sie haben gewonnen"
    if(RollOut == 2 or 3 or 12):
        print "Crap: Sie haben verloren"

- PEP8 mal anschauen in bezug auf deine Namensgebung
- random.seed kannst du weglassen
- zu "# Bewertung Roll Out" hat cofi schon was gesagt
- In "# Wuerfel initalisieren" vielleicht randint einmal von 1-12 und nicht zweimal von 1-6 ;D
- Wieso bindest du Wuerfelaugen an einen neuen Namen?
- Wieso prüfst du im prinzip zweimal das gleiche in den nachfolgenden if-abfragen?

Edit Ich bin langsam :D
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

JonasR hat geschrieben:- In "# Wuerfel initalisieren" vielleicht randint einmal von 1-12 und nicht zweimal von 1-6 ;D
Dir ist schon klar, dass die Verteilung der Werte bei 2W6 völlig anders aussieht als bei 1W12?
heni63
User
Beiträge: 3
Registriert: Mittwoch 21. November 2012, 18:50

WOW, das ging ja VERDAMMT schnell :O :D

Ein großes Dankeschön für die bisherigen Antworten an: JonasR, BlackJack, Cofi und /me! Ihr seid WIRKLICH super! :)

Ich muss jetzt aber leider erst noch mal etwas für den haushalt machen und essen und dann kann ich erst los tippen :))

@JonasR:
Zitat: "Edit Ich bin langsam :D"
Das war höchstens Schallgeschwindigkeit anstatt Mopsgeschwindigkeit...aber wenn Schallgeschwindigkeit für dich langsam ist, scheinst du ja große Ziele zu haben? :P
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

@/me Hmmm ich sehe höchstens ein, dass man von 2-12 machen sollte und nicht von eins an. Ansonsten erkenne ich keinen unterschied. ;)
@heni63 Naja bezog sich da drauf das BlackJack schneller war als ich und sein Inhalt ähnlich ist :D
BlackJack

Und *mein* Inhalt war ja schon so ähnlich wie der von cofi. :-)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

JonasR hat geschrieben:@/me Hmmm ich sehe höchstens ein, dass man von 2-12 machen sollte und nicht von eins an. Ansonsten erkenne ich keinen unterschied. ;)
Wenn du 2 sechsseitige Würfel wirfst ist die Chance auf eine 7 als Gesamtwert 1/6. Die Chance auf eine 12 ist 1/36. Bei einem zwölfseitigen Würfel ist jede Zahl mit 1/12 gleich wahrscheinlich.

Dieses Verständnisproblem hast du aber nicht alleine. Beim Brettspiel "Siedler von Catan", bei dem man mit zwei sechsseitigen Würfeln wirft, hat der Verlag extra die wahrscheinlicheren Zahlen fetter bzw. farbig gedruckt.
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

JonasR hat geschrieben:@/me Hmmm ich sehe höchstens ein, dass man von 2-12 machen sollte und nicht von eins an. Ansonsten erkenne ich keinen unterschied. ;)
Bei genügend Würfen erhältst Du eine schöne Gauss-Verteilung:

Code: Alles auswählen

from random import randint

wuerfe = 100000
counter = [0 for x in xrange(13)]
for wurf in xrange(wuerfe):
    augen = randint(1, 6) + randint(1, 6)
    counter[augen] += 1
print counter[2:13]
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Okay Danke ihr beiden :) Ich muss das nochmal für mich logisch nachvollziehen aber ich denke ich habe es grob verstanden ;)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

JonasR hat geschrieben:Okay Danke ihr beiden :) Ich muss das nochmal für mich logisch nachvollziehen aber ich denke ich habe es grob verstanden ;)
Ganz simpel: Bei zwei sechsseitigen Würfeln bekommst du eine 12 nur wenn beide Würfel auf eine 6 fallen. Für eine 7 gibt es folgende sechs Möglichkeiten: [(1, 6), (2, 5), (3, 4), (4, 3), (5, 2), (6, 1)].
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Oha... simpel... Danke, jetzt kann ich es komplett nachvollziehen :)
heni63
User
Beiträge: 3
Registriert: Mittwoch 21. November 2012, 18:50

Hey Leute,

ich bin jetzt schon echt weit gekommen...durch euch! Noch einmal herzlichen Dank! :)

Jetzt habe ich aber beim programmieren bemerkt, dass ich gerne eine Möglichkeit hätte, Kommentare besser zu Verwalten oder insgesamt mehr Ordnung zu schaffen.

Edit: Ich benutze Notepad++

Zu den Kommentaren:
- eine extra Spalte (bzw. ein bestimmter Springtpunkt, sowas wie ein Tab)
- andere Farbe, wenn ich mehrere Rauten setze

Anderes:
- Text Färben

Kennt ihr vielleicht noch andere Plug ins die Ordnung bringen (oder gute Plug ins zum Thema Kommentare bzw Anderes)?
Nicht, dass ich jetzt keine Ordnung hätte, aber mr fehlt dann doch manchmal der Überblick, vor allem als Anfänger.

Wäre super, wenn ihr mir hier ein weiteres Mal helfen könntet!

mfg

heni63
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Generell was den Programming-Style angeht - und damit auch Kommentare: halte Dich an PEP 8:
http://www.python.org/dev/peps/pep-0008/

Es ist erwiesen, dass Sourcecode für andere deutlich besser lesbar und verständlich ist, wenn sich alle an die gleichen Konventionen halten. Und davon profitierst auch Du. Wenn Du Dich eine Weile an PEP 8 gehalten (und gewöhnt) hast, willst Du es ohnehin nicht mehr anders.
BlackJack

@heni63: Bei Kommentaren wird eigentlich das „inline” kommentieren bevorzugt, also Kommentare zwischen den Zeilen und nicht am Ende von Zeilen. Kommentare beziehen sich normalerweise auf den ihn folgenden Quelltext. Dementsprechend ist der Wunsch nach einer extra Spalte ungewöhnlich. Die Zeilenlänge sollte 80 Zeichen nicht überschreiten, da sind zwei getrennte Spalten for Code und Kommentar nicht wirklich gut umsetzbar.

Das klingt auch irgendwie danach als hättest Du zu viele Kommentare. Die sind dazu da um dem Leser Sachverhalte zu erklären, die aus dem Quelltext selbst nicht ersichtlich sind. Deshalb kann man ganz grob sagen, dass der Quelltext wahrscheinlich schlecht oder zumindest sehr/zu kompliziert ist, je mehr Kommentare man dazu schreiben muss. Es gibt zwar seltene Fälle in denen Algorithmen etwas kniffelig und trickreich sind, dass man mal etwas mehr erklären muss, aber das ist eher selten.

Wenn man es *wirklich* übertreiben will, dann gibt es das sogenannte „literate programming” wo man eher Quelltext in eine Fliesstextdokumentation einbaut statt Kommentare in Quelltext. Ein Beispiel kannst Du Dir hier anschauen: http://marc.rintsch.de/simpledb/

Die *.txt und die *.py.txt sind gleichwertig, dass heisst sie enthalten die selbe Information nur etwas unterschiedlich formatiert. Mit dem Werkzeug `pylit` kann man zwischen den beiden Repräsentationen in beide Richtungen konvertieren. Das *.html und *.pdf sind aus der *.txt erzeugt worden. Beim PDF kommt man so immerhin auf 17 DIN A4 Seiten Text. :-)
Antworten