Zahl erraten Bastelei

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.
heal.p
User
Beiträge: 30
Registriert: Freitag 3. Dezember 2010, 12:28

Ich hab hier im Foren nen Code aufgeschnappt und hab mit ihm ein bisschen rumgebastelt.

Code: Alles auswählen

import random
from time import sleep

antw = (random.randint(1,100))
vers = 0
i = 0

print "Es wird eine Zahl zwischen 1 und 100 generiert."

while vers != antw:
    try:
        vers = int(raw_input("Wieviel gedenkst du zu tippen ? "))
    except ValueError:
        print "Ungultige eingabe!"
        continue
    
    if (vers == antw + 5):
        print "nahedran aber zu gross"
    elif (vers > antw):
        print "kleiner"
        
    elif (vers == antw - 5):
        print "nahedran aber zu klein"

    elif (vers == antw - 1):
        print "ein bisschen zu klein"

    elif (vers == antw + 1):
        print "ein bisschen zu gross"

    elif (vers < antw):
        print "grosser"



    i = i + 1

print "Top, du hattest, ", i, " Versuche gebraucht!"
Am Besten erklär ich das anhand eines Beispiels.
Die zuerratende Zahl (antw) ist 45.
Nun möchte ich das wen ich 50, 49, 48, 40, 41, 42 die Ausgabe bekomme "nahe dran aber zu gross/klein".
Wenn ich nun 47, 46, 43, 44 tippe soll er mir "ein bisschen zu gross/klein" ausgeben.

Kann ich das lösen das ich ned für jede Zahl ein elif machen muss?
(vers == antw -3 bis -5) soetwas in dieser Art?

Gruss
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

(vers == antw -3 bis -5)
Mit and kannst du mehrere Bedingungen verknüpfen. Siehe hier.

Code: Alles auswählen

if antw-vers<5 and antw-vers>3:  
    print ...
Eine Alternative bei int-Eingaben wäre zu testen, ob sie innerhalb einer range sind.

Code: Alles auswählen

if antw-vers in range(3,6):
    print ...
Mit abs kannst du desweiteren den Betrag einer Zahl ermitteln. Wie du damit elif-Anweisungen sparst musst du dir aber selbst überlegen . :)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Rekrul hat geschrieben:

Code: Alles auswählen

if antw-vers<5 and antw-vers>3:

Code: Alles auswählen

if 3 < value < 5:
Rekrul
User
Beiträge: 78
Registriert: Dienstag 7. Dezember 2010, 16:23

oder so :oops:
MGS_Freak
User
Beiträge: 35
Registriert: Donnerstag 13. Januar 2011, 13:50
Wohnort: Schweiz

Hi heal.p

Gleich vorneweg: Ich bin ein blutiger Anfänger und stecke somit noch in Kinderschuhen was Python angeht.
Trotzdem möchte ich dir hier helfen - dem Zufall sei Dank, denn so ein "Zahlenraten" hab ich kürzlich auch geschrieben :).

Als kleiner Gedankenanstoss: sieh dir mal while und for schleifen genau an. Du wirst sicher etwas feststellen das dir hilft!
Ansonsten melde dich, gerne stelle ich dir meinen Code zur Verfügung.

Grüsse
MGS_Freak
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

MGS_Freak hat geschrieben: Als kleiner Gedankenanstoss: sieh dir mal while und for schleifen genau an. Du wirst sicher etwas feststellen das dir hilft
Wo genau liegt da der Denkanstoß? Ein Problem mit der Schleife hatte der Op doch gar nicht, sondern mit den Berechnungen des Abstands von der Lösung und den daraus resultierenden Hilfemeldungen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
MGS_Freak
User
Beiträge: 35
Registriert: Donnerstag 13. Januar 2011, 13:50
Wohnort: Schweiz

Hyperion hat geschrieben:
MGS_Freak hat geschrieben: Als kleiner Gedankenanstoss: sieh dir mal while und for schleifen genau an. Du wirst sicher etwas feststellen das dir hilft
Wo genau liegt da der Denkanstoß? Ein Problem mit der Schleife hatte der Op doch gar nicht, sondern mit den Berechnungen des Abstands von der Lösung und den daraus resultierenden Hilfemeldungen.
Der liegt bei der for Schleife - habe beide Varianten ausprobiert und festgestellt, das hier die for Schleife "besser" funktioniert. Wobei das vermutlich sehr subjektiv ist.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

MGS_Freak hat geschrieben: Der liegt bei der for Schleife - habe beide Varianten ausprobiert und festgestellt, das hier die for Schleife "besser" funktioniert. Wobei das vermutlich sehr subjektiv ist.
Wie willst Du eine for-Schleife (sinnvoll) nutzen, wenn Du die Anzahl der Durchläufe nicht kennst?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
MGS_Freak
User
Beiträge: 35
Registriert: Donnerstag 13. Januar 2011, 13:50
Wohnort: Schweiz

Hyperion hat geschrieben:
MGS_Freak hat geschrieben: Der liegt bei der for Schleife - habe beide Varianten ausprobiert und festgestellt, das hier die for Schleife "besser" funktioniert. Wobei das vermutlich sehr subjektiv ist.
Wie willst Du eine for-Schleife (sinnvoll) nutzen, wenn Du die Anzahl der Durchläufe nicht kennst?
Gute Frage - keine Antwort darauf! Ausser: da hast du vollkommen Recht (bei mir war ja definiert wie viele Versuche man hat - autsch) Grosses Sorry!
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Hyperion hat geschrieben:Wie willst Du eine for-Schleife (sinnvoll) nutzen, wenn Du die Anzahl der Durchläufe nicht kennst?
Mit iter. Allgemeines Beispiel:

Code: Alles auswählen

>>> import random
>>> from functools import partial
>>> for i in iter(partial(random.randint, 1, 6), 3):
...     print i
... 
1
6
4
5
2
5
2
5
6
>>> 
Edit: Meine Antwort ist wirklich nur allgemein zu verstehen. Hat nix mit dem Problem des TE zu tun.
heal.p
User
Beiträge: 30
Registriert: Freitag 3. Dezember 2010, 12:28

Wenn ich Anzahl begrenzt ist, kann man ja auch einfach eine if-Abfrage von i machen. Weiss nicht ob das mit der for-Schleife "schöner" oder besser wäre, ich hätte es aber mit ner If abfrage gelöst. :)
MGS_Freak
User
Beiträge: 35
Registriert: Donnerstag 13. Januar 2011, 13:50
Wohnort: Schweiz

heal.p hat geschrieben:Wenn ich Anzahl begrenzt ist, kann man ja auch einfach eine if-Abfrage von i machen. Weiss nicht ob das mit der for-Schleife "schöner" oder besser wäre, ich hätte es aber mit ner If abfrage gelöst. :)
Nun, schlussendlich hab ich in meiner for Schleife auch eine if Abfrage drin ;-).
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

derdon hat geschrieben: Mit iter. Allgemeines Beispiel:

Code: Alles auswählen

>>> import random
>>> from functools import partial
>>> for i in iter(partial(random.randint, 1, 6), 3):
Edit: Meine Antwort ist wirklich nur allgemein zu verstehen. Hat nix mit dem Problem des TE zu tun.
Ok, bei Iteratoren wäre das denkbar. Das dürfte es aber schon gewesen sein, oder?

@heal.p: Wenn man die Anzahl kennt, würde ich immer eine for-Schleife vorziehen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@heal.p
Lass dich nicht verwirren, du kennst ja die Anzahl der Durchläufe nicht, also ist deine Schleife völlig in Ordnung, nur die "if"s waren noch nicht sauber.
Und nenn auf jeden Fall "i" um (z.B. counter oder zaehler da du deutsche variablen namen nutzt), denn "i" sagt nun nicht gerade viel aus. Zudem könnte man noch aus dem "i = i + 1", "i += 1" machen.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
BlackJack

Also ich würde hier auch eine ``for``-Schleife verwenden, denn ``i += 1`` "von Hand" zu machen, finde ich unschön. ``for i in itertools.count():`` spart die Initialisierung vor und das Hochzählen in der Schleife.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

BlackJack hat geschrieben:Also ich würde hier auch eine ``for``-Schleife verwenden, denn ``i += 1`` "von Hand" zu machen, finde ich unschön. ``for i in itertools.count():`` spart die Initialisierung vor und das Hochzählen in der Schleife.
Naja, das Hochzählen könnte man natürlich direkt unter dem Schleifenkopf erledigen; zusammen mit einem aussagekräftigen Namen wäre der Zusammenhang dann auch klarer. Und so müßtest Du zumindest noch beim Erraten per break die Schleife abbrechen. Imho ist eine while Schleife schon keine schlechte Wahl, wenn man eine Abbruchbedingung im Kopf formulieren kann.

Würdest Du eine Endlosschleife auch mit for-Schleife erledigen?

Code: Alles auswählen

for i in itertools.repeat(True)
:mrgreen:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
heal.p
User
Beiträge: 30
Registriert: Freitag 3. Dezember 2010, 12:28

Ja das Skript wurde bereits wieder paar mal überarbeitet und geändert, jedoch hab ich es gerade nicht auf dem PC, zumindest nicht die aktuelle Version. Werde es später sonst nochmal Posten.
Mir erscheint das mit der ´while´-Schleife jedoch logischer als hier eine ´for´-Schleife zu verwenden, ich mag diese loops mit for nicht so ganz.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

heal.p hat geschrieben:ich mag diese loops mit for nicht so ganz.
Das ist hier aber nicht der Punkt, was du magst und was nicht :D
Es ging hier lediglich um die Zählvariable, da diese bei einer "for"-Schleife mit gezählt würde.

@BlackJack
Wie sieht das bei dir bei einer fehlerhaften Eingabe aus ?
So weit ich das sehe, wollte heal.p diese nicht als Versuch werten, aber in der "for"-Schleife würde diese doch als Versuch mit gewertet werden, oder ?
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
heal.p
User
Beiträge: 30
Registriert: Freitag 3. Dezember 2010, 12:28

Xynon1 hat geschrieben:
heal.p hat geschrieben:ich mag diese loops mit for nicht so ganz.
Das ist hier aber nicht der Punkt, was du magst und was nicht :D
Es ging hier lediglich um die Zählvariable, da diese bei einer "for"-Schleife mit gezählt würde.
Ja das habe ich verstanden. Nun würde mich deine Frage auch noch intressieren, bei meinem Skript werden die Fehlerhaften Eingaben abgefangen und nicht mitgezählt.
Nun stellt sich mir die Frage, ist das "von Hand raufzählen" mit i += 1 nicht einfacher als in einer for-Schleife Fehlereingaben nicht zu werten? (Hoffe man versteht was ich ausdrücken will :?)
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

@heal.p
Genau die Frage stelle ich an BlackJack im vorherigen Post.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten