randint wiederholungen vermeiden

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
Lucas
User
Beiträge: 6
Registriert: Samstag 5. Juli 2014, 14:59
Kontaktdaten:

Hallo,

Ich habe ein kleines Quiz in Python Programmiert und habe nun das Problem, dass sich dank dem "randint" Befehl Fragen wiederholen

Der Code sieht in etwa so aus:

Code: Alles auswählen

       for i in range(0,Fragen):
            Counter=Counter+1
            Frage=randint(1,50)
            print()
            print('Du hast noch',Leben,'Leben')
            print()
            print()
            print()
            print('Frage',Counter,':')
            print('--------')
            if Frage==1:
                print()
                print(Q1)
                A=str(input('Was Antwortest du: '))
                print()
                if A==A1:
                    print('Deine Antwort war Richtig')
                    R=R+1
                else:
                    print('Deine Antwort war Falsch, die richtige wäre',A1,'gewesen.')
                    F=F+1
                    Leben=Leben-1
Das ab "if Frage=1" wiederholt sich dann 50 mal


Vielen Dank für eine Antwort im Voraus
BlackJack

@Lucas: Diese Wiederholungen solltest Du dann als erstes mal beseitigen. Lege die Fragen und Antworten als Datenstruktur im Programm ab. Zum Beispiel eine Liste mit Tupeln, wobei jedes Tupel eine Frage und die dazugehörige Antwort enthält. Dann kannst Du diese Liste mit `random.shuffle()` mischen, und kannst sie dann einfach in einer Schleife der Reihe nach durchgehen.

Ansonsten sind die Namen teilweise sehr schlecht. Verwende keine einbuchstabigen Abkürzungen sondern Namen bei denen der Leser nicht erst raten muss was sie vielleicht bedeuten mögen.

Kann es sein das `i` und `Counter` den gleichen Wert enthalten, oder zumindest immer die gleiche Differenz bilden würden? Dann ist `Counter` überflüssig.

Ähnlich redundant sind `R` und `F`. Wenn man eines von beidem kennt, kann man das andere aus mit Hilfe der Anzahl von `Counter` ausrechnen.
Lucas
User
Beiträge: 6
Registriert: Samstag 5. Juli 2014, 14:59
Kontaktdaten:

BlackJack hat geschrieben:@Lucas: Diese Wiederholungen solltest Du dann als erstes mal beseitigen.
Genau das ist das, was Ich will.
BlackJack hat geschrieben:Kann es sein das `i` und `Counter` den gleichen Wert enthalten, oder zumindest immer die gleiche Differenz bilden würden? Dann ist `Counter` überflüssig.
Ich bin Anfänger und wusste das daher nicht, werde es aber ändern.
BlackJack hat geschrieben:Lege die Fragen und Antworten als Datenstruktur im Programm ab. Zum Beispiel eine Liste mit Tupeln, wobei jedes Tupel eine Frage und die dazugehörige Antwort enthält. Dann kannst Du diese Liste mit `random.shuffle()` mischen, und kannst sie dann einfach in einer Schleife der Reihe nach durchgehen.
Wie funktioniert das mit den Tupeln, Eine Liste mir Fragen und Antworten habe Ich bereits und das mit dem "random.shuffle()" hätte Ich auch gerne näher erklärt.
BlackJack

@Lucas: Zu den Tupeln gibt's eigentlich nichts zu erklären. Schreib Dir einfach eine Liste mit Tupeln als einzelne Elemente. Zu `schuffle()` braucht man auch nicht viel sagen. Die Funktion ”mischt” halt die Elemente in einer Sequenz, also zum Beispiel in einer Liste. Probier's einfach mal in einer Python-Shell aus.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Lucas hat geschrieben:Wie funktioniert das mit den Tupeln, Eine Liste mir Fragen und Antworten habe Ich bereits und das mit dem "random.shuffle()" hätte Ich auch gerne näher erklärt.
Bist du schon auf das offizielle Python-Tutorial gestoßen? Da kommen diese Datenstrukturen in Kapitel 5 vor.

Hier mal ganz kurz etwas dazu:

Code: Alles auswählen

>>> quizfrage = 'Aus welchem Land stammt der Erfinder von Python?', 'Niederlande'
>>> type(quizfrage)
<class 'tuple'>
>>> quizfrage[0]
'Aus welchem Land stammt der Erfinder von Python?'
>>> quizfrage[1]
'Niederlande'
>>> frage, antwort = quizfrage
>>> antwort
'Niederlande'
Lucas
User
Beiträge: 6
Registriert: Samstag 5. Juli 2014, 14:59
Kontaktdaten:

@/me So sieht der erste Datensatz aus, aber wie sieht dann der zweite aus? Wie gesagt Ich bin Anfänger, also sorry falls die Frage blöd
Benutzeravatar
snafu
User
Beiträge: 6731
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

@Lucas: Es ist folgendes Schema gemeint:

Code: Alles auswählen

fragen = [(frage, antwort), (frage, antwort), (frage, antwort), ...]
Wird es dir jetzt klar?

EDIT: Und man muss bei Python (wie auch in anderen Programmiersprachen) nicht zwingend alles in einer Zeile schreiben. Zwecks Übersichtlichkeit könnte man also in etwa so vorgehen:

Code: Alles auswählen

fragen = [
    ('Eine etwas längere Frage', 'Eine Antwort'),
    ('Eine noch etwas längere Frage', 'Noch eine Antwort'),
    ...
]
Zuletzt geändert von snafu am Samstag 5. Juli 2014, 16:35, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Lucas hat geschrieben:@/me So sieht der erste Datensatz aus, aber wie sieht dann der zweite aus? Wie gesagt Ich bin Anfänger, also sorry falls die Frage blöd
Wenn man mehrere dieser Tupel hat, dann kann man die in eine Liste stecken.

Code: Alles auswählen

>>> quizfragen = [('Hier ist Frage A', 'Antwort A'),
	      ('Frage B', 'Antwort B'),
	      ('Frage C', 'Antwort C'),
	      ('Frage D', 'Antwort D'),
	      ('Frage E', 'Antwort E'),]
Jetzt mischen wir die Fragen und Antworten in der Liste. Da jedes einzelne Listenelement ein Tupel aus Frage und Antwort ist bleiben die zusammengehörigen Daten natürlich zusammen.

Code: Alles auswählen

>>> import random
>>> random.shuffle(quizfragen)
>>> print(quizfragen)
[('Hier ist Frage A', 'Antwort A'), ('Frage C', 'Antwort C'), ('Frage D', 'Antwort D'), ('Frage E', 'Antwort E'), ('Frage B', 'Antwort B')]
Jetzt durchlaufen wir mal alles und geben die Fragen aus:

Code: Alles auswählen

>>> for entry in quizfragen:
	print(entry[0])

Hier ist Frage A
Frage C
Frage D
Frage E
Frage B
Man kann das Tupel auch direkt auspacken:

Code: Alles auswählen

>>> for question, answer in quizfragen:
	print(answer)

Antwort A
Antwort C
Antwort D
Antwort E
Antwort B
Lucas
User
Beiträge: 6
Registriert: Samstag 5. Juli 2014, 14:59
Kontaktdaten:

Vielen Vielen Dank, Ihr habt mir echt geholfen. :D
Lucas
User
Beiträge: 6
Registriert: Samstag 5. Juli 2014, 14:59
Kontaktdaten:

Und wie mache Ich jetzt, dass nur eine Frage ausgegeben wird?
BlackJack

@Lucas: Du willst doch nicht nur eine Frage ausgeben sondern alle. Und bei jeder Frage dann den Benutzer nach einer Antwort fragen. Das muss halt alles mit in die Schleife. Genau wie bei Deinem bisherigen Programm.
Lucas
User
Beiträge: 6
Registriert: Samstag 5. Juli 2014, 14:59
Kontaktdaten:

Achso stimmt ja, hab ich grad nicht dran gedacht
Antworten