Zähler in while-Schleife funktioniert nicht

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
sinusjones
User
Beiträge: 4
Registriert: Dienstag 14. März 2017, 15:46

Guten Tag,


ich wollte zum Üben ein "Stadt, Land, Fluss"-Spiel programmieren und habe ein Problem mit dem Zähler für die Spieler.
Dieser wir nämlich aus irgendwelchen gründen nicht erhöht. Ich weiß es gibt bestimmt schöne Varianten und ich bin noch nicht fertig. :D
Ich arbeite mit Python 2.7.6

MfG

Code: Alles auswählen

import random

print "Willkommen zu Stadt, Land, Fluss!"

s = 0
r = 0

s = input("Wieviele Spieler gibt es?")		#Anzahl Spieler
r = input("Wieviele Runden?")			#Anzahl Runden
z = 0						#Zähler der Runden

Spieler1 = 0
Spieler2 = 0
Spieler3 = 0
Spieler4 = 0
Spieler5 = 0
Spieler6 = 0
Spieler7 = 0
Spieler8 = 0
Spieler9 = 0
Spieler10 = 0


    


while z <= r:                                      #Runden-Schleife
    n = 0                                           #Spieler-Zähler
    b = random.choice(["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","R","S","T","U","V","W","X","Z"])
    print ("Der Buchstabe lautet " + b)                                                                         

    while n < s:                                    #Spieler-Schleife
        n + 1


        w1 = raw_input("Stadt: ")
        w2 = raw_input("Land: ")
        w3 = raw_input("Fluss: ")

        if (w1 == w2 == w3):
            print "Schummeln gilt nicht!"
            break

        elif (w1 == w2 or w1 == w3 or w2 == w3):
            print "Schummeln gilt nicht!"
            break
        
        else:
            if w1[0] == b and w2[0] == b and w3[0] == b:
                if n == 10:
                    Spieler10 + 3
                    print "Sehr gut, 3 Punkte."
                    continue

                elif n == 9:
                    Spieler9 + 3
                    print "Sehr gut, 3 Punkte."
                    continue

                elif n == 8:
                    Spieler8 + 3
                    print "Sehr gut, 3 Punkte."
                    continue

                elif n == 7:
                    Spieler7 + 3
                    print "Sehr gut, 3 Punkte."
                    continue

                elif n == 6:
                    Spieler6 + 3
                    print "Sehr gut, 3 Punkte."
                    continue
                
                elif n == 5:
                    Spieler5 + 3
                    print "Sehr gut, 3 Punkte."
                    continue
                
                elif n == 4:
                    Spieler4 + 3
                    print "Sehr gut, 3 Punkte."
                    continue
                
                elif n == 3:
                    Spieler3 + 3
                    print "Sehr gut, 3 Punkte."
                    continue
                
                elif n == 2:
                    Spieler2 + 3
                    print "Sehr gut, 3 Punkte."
                    continue

            
                else:
                    Spieler1 + 3
                    print "Sehr gut, 3 Punkte."
                    continue
Zuletzt geändert von Anonymous am Donnerstag 16. März 2017, 11:14, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Du hast folgende Zeile

Code: Alles auswählen

n = 0
Wenn du jetzt n verwendest, dann hast du den Wert 0.
Später hast du folgende Zeile

Code: Alles auswählen

n + 1
Da nimmst du n (in dem Fall also 0). addierst 1 auf den Wert und ignorierst das Ergebnis dann. n selber ändert sich ja nicht, genauso wenig wie sich die Zahl 0 ändern würde wenn du explizit 0 + 1 geschrieben hättest.


Ansonsten: Wenn du anfängst Bezeichnernamen zu nummerieren (hier Spieler1 - Spieler10), dann machst du mit fast hundertprozentiger Sicherheit etwas falsch. Das schreit nach dem Einsatz einer geeigneten Datenstruktur wie z.B. einer Liste.


Edit: Ich wusste doch, dass BlackJack noch was Ausführliches schreibt ... :)
Zuletzt geändert von /me am Donnerstag 16. März 2017, 11:37, insgesamt 1-mal geändert.
BlackJack

@sinusjones: Wir sind hier IMHO jenseits von schön oder eben nicht schön, Du willst keine 10 nummerierten Namen haben, sondern bitte eine Datenstruktur verwenden. Eine Liste würde sich anbieten.

Das Zuweisen von `s` und `r` am Anfang ist sinnfrei weil die zugewiesenen Werte nie verwendet werden.

`input()` sollte man in Python 2 nicht verwenden. Da kann der Benutzer beliebige Python-Ausdrücke eingeben die dann ausgeführt werden. Nimm `raw_input()` und wandle die eingegebene Zeichenkette explizit in eine Zahl um.

Die Namen `s` und `r`, und `n` und `b`, sowie `w1` bis `w3` sind zu kurz und nichtssagend.

Wenn man etwas eine bestimmte, vor Schleifeneintritt feststehende Zahl von Wiederholungen machen möchte, nimmt man eine ``for``-Schleife und keine ``while``-Schleife.

Das Alphabet gibt es im `string`-Modul als Konstante. Das verringert die wahrscheinlichkeit, dass man sich vertippt.

Um Bedingungen bei ``if`` und ``while`` sollten keine unnötigen Klammern stehen.

Die erste ``if``-Bedingung nach der Eingabe von Stadt/Land/Fluss ist in der zweiten enthalten und damit überflüssig weil in beiden Zweigen das gleiche gemacht wird.

Wenn einer schummelt wird die Runde für alle Spieler nach ihm abgebrochen aber die dafür hatten die Chance Punkte zu machen? Klingt unfair.

Es wird nicht der Fall berücksichtigt, dass ein Spieler bei einer Eingabe nichts eingibt. Der Versuch bei nichts auf den ersten Buchstaben zuzugreifen wird fehlschlagen.

Die ``continue``-Anweisungen sind sinnfrei. Zudem sollte man diese Anweisung sowieso meiden. Man kann den Programmfluss fast immer genau so verständlich, wenn nicht gar leichter nachvollziehbar ohne ``continue`` strukturieren. ``continue`` ist ein ”versteckter” Sprung, den man nicht an der Einrückung erkennen kann, und macht in bestimmten Fällen das erweitern einer Schleife oder das herausziehen von Teilen in eine eigene Funktion schwierig bis unmöglich.

Die ganzen ``SpielerX + 3``-Zeilen haben keinen Effekt. Da wird eine Addition durchgeführt, mit dem Ergebnis dann aber nichts gemacht.
sinusjones
User
Beiträge: 4
Registriert: Dienstag 14. März 2017, 15:46

Hey,
vielen Dank für die schnelle Reaktion und die vielen Anmerkungen.

@/me Mit n wird die while-Schleife für die Spieler-Wahl gesteuert. Nur wird die Schleife nicht unterbrochen.
Ich verstehe nur einfach nicht warum :K :D


MfG
BlackJack

@sinusjones: Genau das hat /me doch erklärt: `n` ändert sich in der Schleife niemals, also ändert sich der Wert der Bedingung auch nicht.

Code: Alles auswählen

In [3]: n = 0

In [4]: n
Out[4]: 0

In [5]: n + 1
Out[5]: 1

In [6]: n
Out[6]: 0
Du addierst zwar 1 zu `n` und da kommt dann auch 1 bei heraus, mit dieser 1 machst Du dann aber nichts. Der Wert der an `n` gebunden ist, ändert sich nicht auf magische Weise. Das ginge bei Zahlen sowieso nicht, weil die in Python unveränderbar sind (und in jeder anderen Programmiersprache die ich kenne).
Antworten