kann mir bitte jemand bei meinem spiel helfen?

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.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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.
Zuletzt geändert von Anonymous am Mittwoch 9. August 2017, 17:37, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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:

Code: Alles auswählen

>>> i = "papier"
>>> r = "schere"
>>> i < r
True
Statt die gleichen 25 Zeilen drei mal zu kopieren, solltest Du eine Schleife benutzen.
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:

Code: Alles auswählen

In [1]: 'papier' > 'stein'
Out[1]: False
`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.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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. :)
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

ich hatte auch vor die Syntax zu verstehen wollte nur gucken, wie weit ich mit meinem jetzigen wissen schon komme.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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:

Code: Alles auswählen

In [1]: 'papier' > 'stein'
Out[1]: False
`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?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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?
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
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

BlackJack hat geschrieben:@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
THX
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

[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:

Code: Alles auswählen

In [1]: 'papier' > 'stein'
Out[1]: False
>>> In [1] 'papier' > 'stein'
SyntaxError: invalid syntax
das hat bei mir nur eine Fehlermeldung hervorgerufen
BlackJack

@jan.b: Das ``In [1]:`` ist der Eingabeprompt, nicht Teil der Eingabe.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

BlackJack hat geschrieben:@jan.b: Das ``In [1]:`` ist der Eingabeprompt, nicht Teil der Eingabe.
hatte mich schon gewundert :)
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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?
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@jan.b: wie Du die Vergleiche machen kannst, hab ich doch schon geschrieben.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

Sirius3 hat geschrieben:@jan.b: wie Du die Vergleiche machen kannst, hab ich doch schon geschrieben.
sry bin durcheinander gekommen.
jan.b
User
Beiträge: 195
Registriert: Mittwoch 9. August 2017, 17:12

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.
Zuletzt geändert von Anonymous am Donnerstag 10. August 2017, 05:31, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
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.
Antworten