Seite 1 von 2
kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 17:17
von jan.b
Code: Alles auswählen
import time
import random
time.sleep(1)
print("1")
time.sleep(1)
print("2")
time.sleep(1)
print("3")
print("los!:")
time.sleep(0.5)
print("schere,")
time.sleep(0.5)
print("stein,")
time.sleep(0.5)
print("papier")
time.sleep(1.1)
print("________________________________________________________")
time.sleep(0.2)
schere = str()
stein = str()
papier = str()
schere == schere
stein == stein
papier == papier
schere < stein
schere > papier
papier > stein
ki = 0
spieler = 0
runde = 1
print("das ist runde %s" % (runde))
spieleroptionen = ["schere", "stein", "papier"]
i = input("Deine Eingabe: ")
time.sleep(0.5)
r = (random.choice(spieleroptionen))
print("die Eingabe von tom: %s" % (r))
time.sleep(0.5)
#i = spieler
#r = ki
if i == r:
print("unentschieden")
spieler = spieler + 0
ki = ki + 0
print("du hast %s punkte und tom hat %s punkte" % (spieler, ki))
elif i < r:
print("punkt für tom")
spieler = spieler + 0
ki = ki + 1
print("du hast %s punkte und tom hat %s punkte" % (spieler, ki))
elif i > r:
print("punkt für dich")
spieler = spieler + 1
ki = ki + 0
print("du hast %s punkte und tom hat %s punkte" % (spieler, ki))
"""else:
i = not "schere" or "stein" or "papier"
print("du must entweder schere, stein, oder papier nehmen")"""
runde = runde + 1
print("______________________________________________________________________")
time.sleep(0.5)
#2
print("das ist runde %s" % (runde))
spieleroptionen = ["schere", "stein", "papier"]
i = input("Deine Eingbe: ")
time.sleep(0.5)
r = (random.choice(spieleroptionen))
print("die Eingabe von tom: %s" % (r))
time.sleep(0.5)
#i = spieler
#r = ki
if i == r:
print("unentschieden")
spieler = spieler + 0
ki = ki + 0
print("du hast %s punkte und tom hat %s punkte" % (spieler, ki))
elif i < r:
print("punkt für tom")
spieler = spieler + 0
ki = ki + 1
print("du hast %s punkte und tom hat %s punkte" % (spieler, ki))
else:
i > r
print("punkt für dich")
spieler = spieler + 1
ki = ki + 0
print("du hast %s punkte und tom hat %s punkte" % (spieler, ki))
runde = runde + 1
print("______________________________________________________________________")
time.sleep(0.5)
#3
print("das ist runde %s" % (runde))
spieleroptionen = ["schere", "stein", "papier"]
i = input("Deine Eingbe: ")
time.sleep(0.5)
r = (random.choice(spieleroptionen))
print("die Eingabe von tom: %s" % (r))
time.sleep(0.5)
#i = spieler
#r = ki
if i == r:
print("unentschieden")
spieler = spieler + 0
ki = ki + 0
print("du hast %s punkte und tom hat %s punkte" % (spieler, ki))
elif i < r:
print("punkt für tom")
spieler = spieler + 0
ki = ki + 1
print("du hast %s punkte und tom hat %s punkte" % (spieler, ki))
else:
i > r
print("punkt für dich")
spieler = spieler + 1
ki = ki + 0
print("du hast %s punkte und tom hat %s punkte" % (spieler, ki))
runde = runde + 1
print("______________________________________________________________________")
time.sleep(0.5)
if spieler < ki:
print("du hast verloren")
else:
print("du hast gewonnen")
"""wenn ich papier habe und tom stein dann bekommt tom einen punkt
warum ist das so und wie kann ich das ändern?
ihr braucht mich auch nicht auf rechtschreibfehler, unnötige zeilen oder so
hinweisen das bessere ich noch aus"""
#danke im vorraus
#PS: Tom ist nur eine variable für den namen des Computer Gegners.
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 17:48
von Sirius3
@jan.b: auch wenn es unnötige Zeilen gibt, die Du vielleicht noch ausbesserst, warum postest Du sie dann? Was machen z.b. die Zeilen 21 - 33? Beim Schreiben hast Du Dir doch sicher etwas gedacht?
In Zeile 39 und 44 was sollen die Klammern um ›runde‹ bzw. ›r‹? Die lassen vermuten, dass Du ein falsches Verständnis um die Klammern hast.
›i‹ und ›r‹ sind schlechte Variablennamen, weil sie nichts aussagen, Du solltest versuchen bessere Namen zu finden. Bei Zeile 54 solltest Du mal schauen, was ›i‹ und ›r‹ für Werte annehmen können und was das Ergebnis des Vergleichs dann ist. Am besten machst Du das in einer interaktiven Shell:
Statt die gleichen 25 Zeilen drei mal zu kopieren, solltest Du eine Schleife benutzen.
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 17:50
von BlackJack
@jan.b: Wenn Du weisst das da unnötige Zeilen drin sind, warum sind die da dann überhaupt drin? Es wäre nett wenn man sich nicht unnötiges anschauen muss. Zumal ja auch in solchen Zeilen Fehler sein können.
Du vergleichst Zeichenketten alphabetisch. Das Ergebnis muss ja nicht den Regeln des Spiels entsprechen. Papier schlägt Stein, ist aber alphabetisch gesehen kleiner:
`i` und `r` sind hier sehr schlechte Namen weil sie dem Leser nicht verraten was der Wert dahinter bedeutet. `spieler` und `ki` sind besser, aber auch nicht gut, denn die stehen nicht für ein Objekt das den Spieler repräsentiert oder eine KI, sondern für den Punktestand von Spieler und KI.
Du solltest auch gar nicht erst anfangen Code zu kopieren und einzufügen — schon gar nicht in den Aussmassen wie das hier passiert. Dafür gibt es Schleifen. Und Funktionen. Mit letzteren solltest Du Dich auch dringend beschäftigen, denn damit kann man nicht nur sehr schön Teilprobleme lösen, sondern die auch einfach testen. Also Beispielsweise eine Funktion die Argumente für die Gegenstände und Spieler entgegen nimmt und den Gewinner zurück gibt, oder die Spieler in der Reihenfolge (Gewinner, Verlierer) oder `None` wenn es Unentschieden steht.
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 18:45
von jan.b
ich bin noch nicht sehr gut wie du bestimmt gemerkt hast aber in den zeilen 21-33 wollte ich für die späteren if Anweisungen fetlegen welchen wert die benutzten variabeln im Verhältnis zu den anderen variabeln haben. ich dachte mir, dass die namen der variabeln passend sind, weil sie kurz sind und i stand dabei für Input und r für random. das mit den klammern habe ich aus dem buch python kinderleicht ich war eigentlich nur froh, dass es funktioniert hat die schleife und andere Verbesserungen wollte ich machen, wenn ich das Problem gelöst hätte.
danke für deinen Kommentar.
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 18:50
von jan.b
das mit den zeilen tut mir leid ich hatte es geschrieben und wusste noch nicht, dass ich dazu eine frage haben würde.
danke für deine antwort.

Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 19:15
von Sirius3
@jan.b: das festlegen von Bedingungen funktioniert so nicht. Beim Programmieren muß man die Semantik der Sprache lernen und kann nicht hoffen, dass erfundene Semantik irgendwie richtig von der Programmiersprache erraten wird.
Dass ›i‹ für input steht, hast Du spätestens in einer Woche vergessen. Kurz ist eigentlich kein Kriterium für einen guten Variablennamen.
Um auf Deine Frage zurückzukommen: am Einfachsten programmierst Du die Bedingungen explizit aus, also wenn Spieler "papier" gewählt hat und der Computer "stein" dann hat Spieler gewonnen. Das sind maximal 9 Bedingungen, die Du gut in einer Funktion kapseln kannst. Später kannst Du Dir ja noch überlegen, wie Du die Bedingungen vereinfachen kannst.
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 19:20
von jan.b
ich hatte auch vor die Syntax zu verstehen wollte nur gucken, wie weit ich mit meinem jetzigen wissen schon komme.
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 20:00
von jan.b
BlackJack hat geschrieben:@jan.b: Wenn Du weisst das da unnötige Zeilen drin sind, warum sind die da dann überhaupt drin? Es wäre nett wenn man sich nicht unnötiges anschauen muss. Zumal ja auch in solchen Zeilen Fehler sein können.
Du vergleichst Zeichenketten alphabetisch. Das Ergebnis muss ja nicht den Regeln des Spiels entsprechen. Papier schlägt Stein, ist aber alphabetisch gesehen kleiner:
`i` und `r` sind hier sehr schlechte Namen weil sie dem Leser nicht verraten was der Wert dahinter bedeutet. `spieler` und `ki` sind besser, aber auch nicht gut, denn die stehen nicht für ein Objekt das den Spieler repräsentiert oder eine KI, sondern für den Punktestand von Spieler und KI.
Du solltest auch gar nicht erst anfangen Code zu kopieren und einzufügen — schon gar nicht in den Aussmassen wie das hier passiert. Dafür gibt es Schleifen. Und Funktionen. Mit letzteren solltest Du Dich auch dringend beschäftigen, denn damit kann man nicht nur sehr schön Teilprobleme lösen, sondern die auch einfach testen. Also Beispielsweise eine Funktion die Argumente für die Gegenstände und Spieler entgegen nimmt und den Gewinner zurück gibt, oder die Spieler in der Reihenfolge (Gewinner, Verlierer) oder `None` wenn es Unentschieden steht.
also wird die fröße in der if schleife allein über die länge der variabeln stein, schere und papier ausgelesen?
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 20:12
von Sirius3
@jan.b: es gibt keine if-Schleifen. Und wie Blackjack schon geschrieben hat, werden Strings alphabetisch verglichen, bzw. um genau zu sein, Zeichenweise wird der Codepoint verglichen, bis der Codepoint eines Zeichens des ersten Strings kleiner oder größer ist als der korrespondierende des zweiten Strings.
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 20:26
von jan.b
Sirius3 hat geschrieben:@jan.b: es gibt keine if-Schleifen. Und wie Blackjack schon geschrieben hat, werden Strings alphabetisch verglichen, bzw. um genau zu sein, Zeichenweise wird der Codepoint verglichen, bis der Codepoint eines Zeichens des ersten Strings kleiner oder größer ist als der korrespondierende des zweiten Strings.
ist der codepoint das ende eines strings?
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 20:53
von BlackJack
@jan.b: Nein. Dann würde der Satz von Sirius3 auch gar keinen Sinn ergeben. Schau doch selbst mal im Netz nach:
https://de.wikipedia.org/wiki/Codepoint
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 20:59
von jan.b
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 21:24
von jan.b
[quote="jan.b"][quote="BlackJack"]@jan.b: Wenn Du weisst das da unnötige Zeilen drin sind, warum sind die da dann überhaupt drin? Es wäre nett wenn man sich nicht unnötiges anschauen muss. Zumal ja auch in solchen Zeilen Fehler sein können.
Du vergleichst Zeichenketten alphabetisch. Das Ergebnis muss ja nicht den Regeln des Spiels entsprechen. Papier schlägt Stein, ist aber alphabetisch gesehen kleiner:
>>> In [1] 'papier' > 'stein'
SyntaxError: invalid syntax
das hat bei mir nur eine Fehlermeldung hervorgerufen
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 21:58
von BlackJack
@jan.b: Das ``In [1]:`` ist der Eingabeprompt, nicht Teil der Eingabe.
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 22:02
von jan.b
BlackJack hat geschrieben:@jan.b: Das ``In [1]:`` ist der Eingabeprompt, nicht Teil der Eingabe.
hatte mich schon gewundert

Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 22:55
von jan.b
BlackJack hat geschrieben:@jan.b: Das ``In [1]:`` ist der Eingabeprompt, nicht Teil der Eingabe.
Entschuldigung, wenn ich nerve, aber ich habe gedacht, dass es funktioniert, wenn ich die Elemente in ein Verhältnis zu einander setze (z.27-33) und dann die Elemente in einen string zu konvertiere(z. 21 - 25), um die werte dann in der abfrage abzufragen(z. 49- ende). wenn aber nur nach dem Alphabet verglichen wird wie kann ich die Elemente (schere, stein, papier)dann definieren bzw in ein Verhältnis zueinander setzen?
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 23:16
von Sirius3
@jan.b: wie Du die Vergleiche machen kannst, hab ich doch schon geschrieben.
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Mittwoch 9. August 2017, 23:29
von jan.b
Sirius3 hat geschrieben:@jan.b: wie Du die Vergleiche machen kannst, hab ich doch schon geschrieben.
sry bin durcheinander gekommen.
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Donnerstag 10. August 2017, 01:18
von jan.b
Sirius3 hat geschrieben:@jan.b: das festlegen von Bedingungen funktioniert so nicht. Beim Programmieren muß man die Semantik der Sprache lernen und kann nicht hoffen, dass erfundene Semantik irgendwie richtig von der Programmiersprache erraten wird.
Dass ›i‹ für input steht, hast Du spätestens in einer Woche vergessen. Kurz ist eigentlich kein Kriterium für einen guten Variablennamen.
Um auf Deine Frage zurückzukommen: am Einfachsten programmierst Du die Bedingungen explizit aus, also wenn Spieler "papier" gewählt hat und der Computer "stein" dann hat Spieler gewonnen. Das sind maximal 9 Bedingungen, die Du gut in einer Funktion kapseln kannst. Später kannst Du Dir ja noch überlegen, wie Du die Bedingungen vereinfachen kannst.
Code: Alles auswählen
runde = 1
print("das ist runde %s" % (runde))
spieleroptionen = ["schere", "stein", "papier"]
spieler = input("Deine Eingbe: ")
ki = (random.choice(spieleroptionen))
print("die Eingabe von der ki: %s" % (ki))
if spieler == ki:
print("unentschieden")
elif spieler == "papier":
if ki == "schere":
print("punkt für tom")
elif spieler == "schere":
if ki == "stein":
print("punkt für tom")
elif spieler == "stein":
if ki == "schere":
print("punkt für dich")
elif spieler == "stein":
if ki == "papier":
print("punkt für tom")
elif spieler == "schere":
if ki == "papier":
print("punkt für dich")
elif spieler == "papier":
if ki == "schere":
print("punkt für tom")
else:
spieler not in spieleroptionen
print("falsche eingabe")
if ki not in spieleroptionen:
print("falsche eingabe")
print("______________________________________________________________________")
time.sleep(0.5)
runde = runde + 1
wenn du das mal in deine Shell eingibst wird wenn du stein eingibst und ki papier eingibt kein Ergebnis angezeigt. und das war ja wohl so expliziet wie möglich.
Re: kann mir bitte jemand bei meinem spiel helfen?
Verfasst: Donnerstag 10. August 2017, 05:50
von BlackJack
@jan.b: Die ``elif``-Zweige schliessen sich aus. Wenn einer davon genommen wird, dann wird kein anderer mehr geprüft. Das heisst wenn der Spieler 'stein' eingegeben hat, dann wird der ``elif``-Zweig in Zeile 15 betreten, und danach kein anderer mehr.
Das Problem hätte man nicht wenn im ``elif`` nicht nur eine Teilbedingung, sondern die gesamte Bedingung stehen würde. Teilbedingungen kann man mit den Operatoren ``and`` und ``or`` verknüpfen.
Die Importe von `time` und `random` haben noch gefehlt.
Eingerückt wird per Konvention vier Leerzeichen pro Ebene. Siehe auch den
Style Guide for Python Code.
Zeile 28 hat keinen Effekt. Der Ausdruck wird zu einem Wahrheitswert ausgewertet, mit dem dann aber nichts gemacht wird. Sollte aber vielleicht, denn im Gegensatz zu der nachfolgenden Prüfung kann der Benutzer ja tatsächlich etwas total anderes eingeben.
Das sollte man vielleicht unterbinden in dem man eine Funktion schreibt, die den Benutzer solange nach einer Eingabe fragt, bis der eine gültige Eingabe gemacht hat. Das muss nicht einmal Absicht vom Benutzer sein — man vertippt sich ja auch mal.
In neuem Code würde ich die `format()`-Methode auf Zeichenketten dem ``%``-Operator vorziehen.