Seite 1 von 2
Zahl erraten Bastelei
Verfasst: Freitag 17. Dezember 2010, 16:32
von heal.p
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
Re: Zahl erraten Bastelei
Verfasst: Freitag 17. Dezember 2010, 17:20
von Rekrul
(vers == antw -3 bis -5)
Mit
and kannst du mehrere Bedingungen verknüpfen. Siehe
hier.
Eine Alternative bei int-Eingaben wäre zu testen, ob sie innerhalb einer
range sind.
Mit
abs kannst du desweiteren den Betrag einer Zahl ermitteln. Wie du damit
elif-Anweisungen sparst musst du dir aber selbst überlegen .

Re: Zahl erraten Bastelei
Verfasst: Freitag 17. Dezember 2010, 17:23
von /me
Re: Zahl erraten Bastelei
Verfasst: Freitag 17. Dezember 2010, 17:26
von Rekrul
oder so

Re: Zahl erraten Bastelei
Verfasst: Donnerstag 13. Januar 2011, 13:56
von MGS_Freak
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
Re: Zahl erraten Bastelei
Verfasst: Donnerstag 13. Januar 2011, 14:08
von Hyperion
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.
Re: Zahl erraten Bastelei
Verfasst: Donnerstag 13. Januar 2011, 15:24
von MGS_Freak
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.
Re: Zahl erraten Bastelei
Verfasst: Donnerstag 13. Januar 2011, 15:40
von Hyperion
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?
Re: Zahl erraten Bastelei
Verfasst: Donnerstag 13. Januar 2011, 16:18
von MGS_Freak
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!
Re: Zahl erraten Bastelei
Verfasst: Donnerstag 13. Januar 2011, 16:29
von derdon
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.
Re: Zahl erraten Bastelei
Verfasst: Donnerstag 13. Januar 2011, 16:58
von heal.p
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.

Re: Zahl erraten Bastelei
Verfasst: Donnerstag 13. Januar 2011, 17:12
von MGS_Freak
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

.
Re: Zahl erraten Bastelei
Verfasst: Donnerstag 13. Januar 2011, 17:49
von Hyperion
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.
Re: Zahl erraten Bastelei
Verfasst: Donnerstag 13. Januar 2011, 18:05
von Xynon1
@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.
Re: Zahl erraten Bastelei
Verfasst: Donnerstag 13. Januar 2011, 20:52
von 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.
Re: Zahl erraten Bastelei
Verfasst: Donnerstag 13. Januar 2011, 21:08
von Hyperion
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?

Re: Zahl erraten Bastelei
Verfasst: Freitag 14. Januar 2011, 09:52
von heal.p
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.
Re: Zahl erraten Bastelei
Verfasst: Freitag 14. Januar 2011, 10:02
von Xynon1
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
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 ?
Re: Zahl erraten Bastelei
Verfasst: Freitag 14. Januar 2011, 11:14
von heal.p
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
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

)
Re: Zahl erraten Bastelei
Verfasst: Freitag 14. Januar 2011, 11:21
von Xynon1
@heal.p
Genau die Frage stelle ich an BlackJack im vorherigen Post.