Schere - Stein - Papier (in schlechtem Englisch x)

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
c.burkes
User
Beiträge: 58
Registriert: Montag 4. Februar 2019, 11:38

Hi @all

habe mich jetzt mal mit diesem einfachen Spielchen beschaeftigt und wollte ein paar Sachen drin haben, was jetzt endlich auch geklappt hat.

Erstmal der code ....

Code: Alles auswählen

### modules ###
import random
import time

### variables ###
stars = "*******************************************************"
figures = ("p", "r", "s")
game = True

### intro ###
print()
print(); time.sleep(0.5)
print(stars); time.sleep(0.5)
print(stars); time.sleep(0.5)
print("***** P A P E R **** R O C K **** S C I S S O R S *****"); time.sleep(0.5)
print(stars); time.sleep(0.5)
print(stars); time.sleep(0.5)
print(); time.sleep(0.5)

### the main game ###
### intro ###
while game:
    print("choose if u want to fight with paper, rock or scissors "); time.sleep(1)
    print("-type 'p' for paper, 'r' for rock or 's' for scissors- "); time.sleep(1)
    players_choice_one = input()
    print()
    for l in players_choice_one:
        players_figure = []
        ais_figure = []
        if l != "r" and l != "p" and l != "s":
            print(stars); time.sleep(0.5)
            print("             Seems u made a mistake, huh?!             "); time.sleep(1)
            print(stars); time.sleep(0.5)
            print(); time.sleep(0.5)
            print("         anyway ... wanna to have a second try?        "); time.sleep(1)
            break
        else:
            for l in players_choice_one:
                if l == "r":
                    players_figure.append("rock")
                elif l == "p":
                    players_figure.append("paper")
                else:
                    players_figure.append("scissors")

        ais_choice_one = random.choice(figures)
        for s in ais_choice_one:
            if s == "r":
                ais_figure.append("rock")
            elif s == "p":
                ais_figure.append("paper")
            else:
                ais_figure.append("scissors")
### comparison ###
    for i in players_figure:
        for n in ais_figure:
            if i == n :
                print(stars)
                print("    It's a tie, PC has also chosen " + n); time.sleep(0.5)
                print(stars)
                print(); time.sleep(0.5)
                break
            elif i == "rock" and n != "paper":
                print(stars)
                print("             U won against PC's " + n + " =  )"); time.sleep(0.5)
                print(stars)
                print(); time.sleep(0.5)
                break
            elif i == "paper" and n != "scissors":
                print(stars)
                print("             U won against PC's " + n + " =)  "); time.sleep(0.5)
                print(stars)              
                print(); time.sleep(0.5)
                break
            elif i == "scissors" and n != "rock":
                print(stars)
                print("             U won against PC's " + n + " =)  "); time.sleep(0.5)
                print(stars)
                print(); time.sleep(0.5)
                break
            else:
                print(stars)
                print("      Nah ... too sad ... better luck next time :)     ")
                print("                  PC has chosen        " + n); time.sleep(0.5)
                print(stars)
                print(); time.sleep(0.5)

### reapeater ###
    decision = ""
    while decision not in ("y", "n"):
        print("        type in 'y' if u want continue playing        "); time.sleep(1)
        print("                'n' if u want to leave                "); time.sleep(1)
        decision = input()
        print()
    if (decision != "y"):
        print(stars)
        print("              *** BYE BYE *** BYE BYE ***              "); time.sleep(1)
        print(stars)
        print()
        print()
        game = False

Meine Fragen waeren nun ...
1. an welchen Stellen koennte man die Zeilenzahl deutlich reduzieren (also, abgesehen von den "optischen" lines natuerlich), sprich welche deutlich effektiveren Ansaetze gaebe es?
2. warum sind Ausgabezeilen verrutscht (zumindest in der cmd), wenn man eine Verkettung einfuegt?
3. wo muss ich nachsehen, um Infos zur "Textbearbeitung" inPython zu bekommen?

mir faellt bestimmt noch was ein :sweat_smile: aber erstmal bis hierher, bevor es wieder unuebersichtlich wird. Hoffe einige Fehler der Vergangenheit diesesmal nicht gemacht zu haben

Vielen DANK Euch!! lG
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@c.burkes: Mir sind da die beiden Listen und die darauf bauenden Schleifen nicht klar und auch die Schleife über die Eingabe nicht. Diese Listen enthalten doch immer nur genau einen Wert, womit das semantisch keine Listen sind, sondern eben immer nur genau ein Wert sinnfrei in einer Liste verpackt.

Und was das Zeilen einsparen angeht, würde ich da erst einmal *mehr* draus machen, nämlich die ganzen Semikolons durch Zeilenumbrüche ersetzen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Einbuchstabige Variablennamen sind schlecht, weil sie nicht aussagen, was sie für eine Bedeutung haben, l ist besonder schlecht, weil man es leicht mit 1 verwechseln kann. Wenn man eine while-Schleife hat, die nur deshalb starten kann, weil man einer Variable einen Dummywert zuweist, dann hat man in Wirklichkeit eine while-True-Schleife mit Abbruchbedingung am Ende.
Erster Schritt wäre, die 100 Zeilen Schleife in mehrere Funktionen aufzuteilen. Vielleicht kommt dann auch heraus, dass man den selben Code an mehreren Stellen hat und diesen durch Funktionsaufrufe kürzen könnte.
c.burkes
User
Beiträge: 58
Registriert: Montag 4. Februar 2019, 11:38

Sirius3 hat geschrieben: Mittwoch 24. April 2019, 13:34 Einbuchstabige Variablennamen sind schlecht, weil sie nicht aussagen, was sie für eine Bedeutung haben,
das hat blackjack auch schonmal angesprochen, stimmt .... ich wusste nur nicht, wie dem hier zu umgehen. Jetzt meine ich, sitzt es. Danke Euch beiden.
l ist besonder schlecht, weil man es leicht mit 1 verwechseln kann
gibt es favouriten bei elemente einer Liste benennt? 'i' und 'n' sind wohl beliebt. Danach? Oder kommt man in der Regel bei einem gutem code gar nicht in die Verlegenheit nach weiteren suchen zu muessen?
Erster Schritt wäre, die 100 Zeilen Schleife in mehrere Funktionen aufzuteilen. Vielleicht kommt dann auch heraus, dass man den selben Code an mehreren Stellen hat und diesen durch Funktionsaufrufe kürzen könnte.
War mein erster Ansatz, was ich aber nicht umgesetzt bekommen habe. Der Vorschlag von eben mach mir aber Mut, dass ich die jetzt eingepflegt bekomme :thumb_up:
c.burkes
User
Beiträge: 58
Registriert: Montag 4. Februar 2019, 11:38

__blackjack__ hat geschrieben: Mittwoch 24. April 2019, 13:28 die ganzen Semikolons durch Zeilenumbrüche ersetzen
du meinst die time.sleep(1) mittels \n absetzen??? Oder einfach mittels Enter in die naechste Zeile?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

c.burkes hat geschrieben: Mittwoch 24. April 2019, 14:03 du meinst die time.sleep(1) mittels /n absetzen??? Oder einfach mittels Enter in die naechste Zeile?
Gemeint war die nächste Zeile.

Grundsätzlich wäre aber ein anderer Ansatz noch besser. Wenn du schon ein sleep nach der Ausgabe haben willst (mir als User geht das ja auf den Senkel), dann verpack das zusammen mit dem print in eine Funktion.

Schlichte Version:

Code: Alles auswählen

def print_delay(text='', seconds=1.0):
    print(text)
    if seconds:
        time.sleep(seconds)

print_delay('Wir warten den Defaultwert von einer Sekunde')
print_delay('Wir warten eine halbe Sekunde', 0.5)
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@c.burkes: Für die Namen von Elementen einer Liste gilt das gleiche wie für alle Namen: Der Name soll dem Leser vermitteln was der Wert bedeutet. Das ist selten ein einzelner Buchstabe. Wenn Du Dir vernünftige Namen für die Schleifenvariablen überlegt hättest, wäre Dir vielleicht selbst aufgefallen wie unsinnig die meisen der Schleifen in Deinem Programm sind.

`i` ist ein guter Name für eine ganze Zahl die als Index oder als Laufvariable in einer Schleife verwendet wird. Weil der Name `i` genau das aussagt. Der nächste ist `j`, und dann vielleicht noch `k`, aber da ist in der Regel auch schon die Verschachtelungstiefe erreicht an der man anfangen sollte das auf Funktionen aufzuteilen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

c.burkes hat geschrieben: Mittwoch 24. April 2019, 14:01 gibt es favouriten bei elemente einer Liste benennt? 'i' und 'n' sind wohl beliebt. Danach? Oder kommt man in der Regel bei einem gutem code gar nicht in die Verlegenheit nach weiteren suchen zu muessen?
Der Favourit ist, die Variablen so zu benennen was sie bedeuten, also player_choice, computer_choice. Bei Dir sind aber, wie __blackjack__ schon geschrieben hatte, die for-Schleifen sowieso Quatsch, weil Du über Listen gehst, die immer exakt ein Element enthalten.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Sirius3 hat geschrieben: Mittwoch 24. April 2019, 15:08 Bei Dir sind aber, wie __blackjack__ schon geschrieben hatte, die for-Schleifen sowieso Quatsch, weil Du über Listen gehst, die immer exakt ein Element enthalten.
Theoretisch könnte man, wenn ich das Programm richtig gelesen habe, als User auch so etwas wie rpsssr eingeben. Das Programm würde das erst einmal akzeptieren, aber der folgende Programmablauf würde zu interessanten Ergebnissen führen.

Wie auch immer, der Ersteller des Codes sollte am besten einfach mal erklären, was er sich bei der Verwendung der Listen gedacht hat.
c.burkes
User
Beiträge: 58
Registriert: Montag 4. Februar 2019, 11:38

@/me:
Sirius3 hat geschrieben: Mittwoch 24. April 2019, 13:34 Wenn man eine while-Schleife hat, die nur deshalb starten kann, weil man einer Variable einen Dummywert zuweist, dann hat man in Wirklichkeit eine while-True-Schleife
"das hat blackjack auch schonmal angesprochen, stimmt .... ich wusste nur nicht, wie dem hier zu umgehen. Jetzt meine ich, sitzt es. Danke Euch beiden."

Hab mich jetzt gerade wieder drangesetzt ;D ....

lG
Antworten