Python Hilfe, Fehlermeldung ausgeben

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
Humbhree
User
Beiträge: 1
Registriert: Sonntag 8. März 2015, 15:11

Hallo zusammen.

Ja ich bin Student und ja meine Aufgabe ist ein Miniprojekt, aber nein, ich möchte nicht, dass mir jemand diese Aufgabe fertig löst. Ich studiere nicht Informatik, trotzdem haben wir als Pflichtfach Python. Nur so vorweg :D

Aufgabe: Schreibe ein Python Programm Schere Stein Papier Echse Spock. Ich denke, das ist den meisten hier bekannt.

Das Spiel an sich, habe ich auch schon fertig. Und es funktioniert :D *freude*
Jetzt möchte ich nur noch, dass wenn ich nicht Rock, Paper uws. eingebe, eine Meldung kommt:

Bitte geben Sie nur rock, paper, spock, lizard oder scissors ein.

Wo muss ich das reinschreiben und kann ich das auch mit if else machen?

Wie gesagt, ich möchte das schon selber meistern, aber ein Denkanstoß wäre echt toll

Vielen Dank

Code:

Code: Alles auswählen

import random

E = u'Bitte wählen Sie rock, spock, paper, lizard oder scissors'

def name_to_number(name):
    if name == 'rock':
        return 0
    elif name == 'spock':
        return 1
    elif name == 'paper':
        return 2
    elif name == 'lizard':
        return 3
    else: 
        return 4
    
    
    
def number_to_name(number):
    if number == 0:
        return 'rock'
    elif number == 1:
        return 'spock'
    elif number == 2:
        return 'paper'
    elif number == 3:
        return 'lizard'
    else:
        return 'scissors'
    
def rpsls(choose):
    player_choose = name_to_number(choose)
    
    cpu_choose = random.randrange(0,4)
    
    cpu = number_to_name(cpu_choose)
    
    result = (player_choose - cpu_choose) % 5
    
    if result == 1 or result == 2:
        winner = 'Spieler gewinnt!'
    elif result == 3 or result == 4:
        winner = 'Computer gewinnt!'
    else:
        winner = 'Unentschieden!'
        
    print
    print u'Spieler wählt', choose
    print u'Cpu wählt', cpu
    print winner
    
rpsls(raw_input(u'Wähle'))
Zuletzt geändert von Anonymous am Sonntag 8. März 2015, 15:39, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Üpsilon
User
Beiträge: 222
Registriert: Samstag 15. September 2012, 19:23

Hi und Willkommen im Forum.

Ich würde mir erstmal ne Liste der erlaubten Eingaben machen. Dann eine While-Schleife: while eingabe not in erlaubte_eingaben. eingabe muss man dann allerdings vorbelegen zB mit "" oder None.

Wenn du das nächste Mal hier Code postest, darfst du den übrigens gerne in {code} {/code} -Tags einschließen (Aber eckige statt geschwungener Klammern).
PS: Die angebotene Summe ist beachtlich.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Du machst das zu umständlich. Was wäre denn, wenn du 100000 Werte hättest? Schreibst du dann 100000 Bedingungen hin? Das lässt sich leicht zusammenfassen, indem du die möglichen Namen auflistest:

Code: Alles auswählen

NAMES = "rock", "spock", "paper", "lizard", "scissors"
Aus dem Index einen Namen machen wird dann zu:

Code: Alles auswählen

NAMES[index]
Den Namen zu einem Index umwandeln ist dann einfach nur noch

Code: Alles auswählen

NAMES.index(name)
Das könnte man auch mit einem Dictionary lösen, ist bei so wenigen Einträgen aber nicht relevant.

Das Abfragen der Spielereingabe ist dann auch ganz einfach. Du machst einfach eine while-True-Schleife, welche so lange Werte abfragt, bis die Eingabe in NAMES liegt. Dann verlässt du die Schleife einfach.
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das Mapping auf die Integerwerte würde ich als Tutor zumindest negativ bewerten. Das kann man über eine Datenstruktur viel einfacher lösen. Und wozu sollte man einen zweiten Weg einzubauen? Das ist doch komplett unnötig - die KI kann doch auch aus einer Liste von Namen oder der Benutzer aus einer Liste von Nummern (wenn man das denn in eine Struktur packte, wie schon erwähnt ;-) ) Entscheide Dich einfach für einen Weg!

Man muss aus dem simplen ``raw_input`` dann eben eine Funktion bauen, die nach der Eingabe testet, ob diese im erlaubten Bereich liegt. Dafür würde man bei Integerwerten zunächst in ein ``int`` wandeln und ein ``try... catch ValueError`` drum herum bauen, falls der Benutzer etwas anderes als eine Ziffer eingibt. Zusätzlich prüft man dann noch auf Eingabe >= 1 und <= Größe der Datenstruktur.

Ich würde die Funktion ``rpsls`` übrigens flexibler machen und dieser zwei Funktionen übergeben, die als Rückgabewert die gewählte Gestik (bzw. den korrespondierenden Integerwert) liefert. Damit kann man entscheiden, ob man Mensch gegen Mensch, Mensch gegen Computer oder gar Computer gegen Computer spielen lässt! :-)

Die Perüffunktion ist übrigens ziemlich genial - wo hast Du den Trick her? :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

@Humbhree: Die Umwandlungsfunktion von Name nach Zahl kann (und sollte) sich mit einer Ausnahme beschweren wenn man einen Wert übergibt den es in dem Spiel nicht gibt. Momentan gibt sie dann immer den Wert für Schere zurück. Ähnliches gilt für die Funktion für die Gegenrichtig: die gibt für *jede* Zahl ausserhalb von 0 bis 3 'scissors' zurück obwohl das nur für 4 richtig ist. So etwas ist eine Einladung an Fehler die unnötig schwer zu finden sind.

@Hyperion: Die Prüfung ist wahrscheinlich dort abgeschrieben wo der Rest auch her ist. Das ist wohl eine Standardaufgabe bei mehr als einem Python-Kurs und *sehr* ähnliche Lösungen findet man zuhauf im Netz. Und zwar immer mit dieser ``if``/``elif``-Kaskade und keiner Prüfung ob das Argument überhaupt im Wertebereich liegt. Vielleicht waren Listen bis zu dem Zeitpunkt noch kein Thema im Kurs. Anders kann ich mir den Code nicht erklären.
Antworten