Variable Mischen

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
Rayano
User
Beiträge: 22
Registriert: Freitag 7. Juli 2023, 09:21

Hallo,

ich habe ein kleines Problem und suche nach einer Lösung.

ich möchte ein Quiz programmieren. Aber ich brauche eine Info um zu wissen ob es auch so funktioniert wie ich mir das Vorstelle.
Kann man Variablen Mischen?

Der Grund warum ich das benötige ist, die richtigen Antworten sind immer A. Das habe ich der Übersichthalber so in einem Dokument erstellt.
Ich weis das es die Bilblothek Random gibt.

An dieser Stelle kurz als Info ich brauche keinen Fertigen code mir würde der anstoß reichen ob es geht und welche systax ich dafür nutzen muss.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Du suchst random.shuffle. In der zu mischenden Liste sollten sich die Antworten befinden und die korrekte Antwort sollte markiert sein.

Ganz simpel ohne Fehlerprüfungen:

import random

Code: Alles auswählen

answers = [('Python', True), ('Phyton', False), ('Pyhton', False)]
random.shuffle(answers)
for number, answer in enumerate(answers, start=1):
    print(f'{number}. {answer[0]}')
user_answer = int(input('Welches ist die korrekte Antwort: '))
if answers[user_answer - 1][1]:
    print('richtig')
else:
    print('falsch')
Prinzipiell würdest du die Antworten gemeinsam mit der Frage noch ein mal in einer weiteren Liste verpacken.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Wobei das markieren überflüssig ist wenn die korrekte Antwort immer die erste (A) ist. Man muss sich das vor dem mischen halt nur merken was an erster Stelle stand.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@/me: dieser Boolean macht die Sache nur unnötig kompliziert, weil Du Dir die richtige Antwort einfach man Anfang merken könntest:

Code: Alles auswählen

answers = ['Python', 'Phyton', 'Pyhton']
correct_answer = answers[0]
random.shuffle(answers)

for char, answer in zip(string.ascii_uppercase, answers):
    print(f"{char}: {answer}")

user_answer = input('Welches ist die korrekte Antwort: ')
index = string.ascii_uppercase.index(user_answer)
if answer[index] == correct_answer:
    print('richtig')
else:
    print('falsch')
Rayano
User
Beiträge: 22
Registriert: Freitag 7. Juli 2023, 09:21

Sirius3 hat geschrieben: Samstag 29. Juli 2023, 14:26 @/me: dieser Boolean macht die Sache nur unnötig kompliziert, weil Du Dir die richtige Antwort einfach man Anfang merken könntest:

Code: Alles auswählen

answers = ['Python', 'Phyton', 'Pyhton']
correct_answer = answers[0]
random.shuffle(answers)

for char, answer in zip(string.ascii_uppercase, answers):
    print(f"{char}: {answer}")

user_answer = input('Welches ist die korrekte Antwort: ')
index = string.ascii_uppercase.index(user_answer)
if answer[index] == correct_answer:
    print('richtig')
else:
    print('falsch')
Naja der Gedanke ist schon richtig da das Programm ja im falle das die Antwort richtig ist zu nächste Frage gehen soll. Aber mir helfen beide antworten, Das war der richtige denkantoß den ich brauchte
Rayano
User
Beiträge: 22
Registriert: Freitag 7. Juli 2023, 09:21

answers = [('Python', True), ('Phyton', False), ('Pyhton', False)]
kann ich das echt so in einer Liste definieren?
das bedeutet wenn ich folgendes schreibe

Code: Alles auswählen

print("Wer ist der Schutzgott von Ul´dah?"
Liste_schutzgeist = [('antwort_schutzgeist_a', True,('antwort_schutzgeist_b', False,),('antwort_schutzgeist_c', False)
dann könnte ich eine If abfrage verwenden die If True nutzt richtig?
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Rayano: Da fehlen einige Klammern. Und Variablennamen schreibt man in Python klein. Grunddatentypen wie `Liste` haben auch nichts in Namen zu suchen. Eigentlich sollte es auch nicht für jeden Antwortsatz einen Namen geben, das würde ja bedeuten, dass man für jede Frage Code wiederholt. Die Frage wäre auch Teil einer Datenstruktur und man hätte dann eine Schleife über Frage und Antworten und nur einmal den Code der die aktuelle Frage ausgibt und die Antwortmöglichkeiten, und die Antwort vom Benutzer auswertet.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Rayano
User
Beiträge: 22
Registriert: Freitag 7. Juli 2023, 09:21

__blackjack__ hat geschrieben: Samstag 29. Juli 2023, 16:03 @Rayano: Da fehlen einige Klammern. Und Variablennamen schreibt man in Python klein. Eigentlich sollte es auch nicht für jeden Antwortsatz einen Namen geben, das würde ja bedeuten, dass man für jede Frage Code wiederholt. Die Frage wäre auch Teil einer Datenstruktur und man hätte dann eine Schleife über Frage und Antworten und nur einmal den Code der die aktuelle Frage ausgibt und die Antwortmöglichkeiten, und die Antwort vom Benutzer auswertet.

Danke für die Hinweise. Die schleife werde ich wohl viel verwenden in dem Quiz. Denn immer wenn jemand ein Frage richtig hat soll die nächste Fragen kommen. Im allgemeinen möchte ich mich mit dem Projekt mit der Objekt basieren Programmierung vertraut machen und werde daher alle Fragen und Antworten in einer Seperaten Datei auslagern.
Grunddatentypen wie `Liste` haben auch nichts in Namen zu suchen
warum genau nicht? kann das zu fehler führen? ich weis das ich normalerweise auch english variable nutzen soll, da ich das programm aber allein schreibe finde ich name mit denen ich schnell etwas anfangen kann
hilfreicher. oder sehe ich das falsch?
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Rayano: Während der Entwicklung ändert man nicht selten mal den Datentyp von einem etwas spezifischerem was besser passt, und dann hat man entweder falsche, irreführende Namen, oder muss immer durch das gesamte Programm gehen und die betroffenen Namen anpassen. Das macht nur unnötig Arbeit.

Englisch ist IMHO besser weil alles andere in Englisch ist — die Sprache selbst, die Namen aus der Standardbibliothek, und auch die externen Bibliotheken die man sich installieren kann. Und ganz praktisch: Für die Namen von Containerdatentypen verwendet man in der Regel als Bezeichnung die Mehrzahl von dem was man als Namen für ein einzelnes Element nehmen würde. Also wenn eine Liste Antworten enthält, ein einzelnes Element eine `antwort` ist, dann nennt man die Liste `antworten`. Bei dem Beispiel geht das, aber im Deutschen gibt es leider immer wieder Fälle wo Einzahl und Mehrzahl *gleich* sind. Schüler beispielsweise. Das führt dann zu Problemen bei Schleifen ``for schueler in schueler:``, wo man sich dann irgendwie überlegen muss wie man mit solchen Fällen umgeht. Im Englischen ist das wesentlich einfacher mit dem Mehrzahl-"s" und es gibt nur ganz wenige Fälle wo man in dieses Problem läuft.

Die Fragen/Antworten auslagern ist eine gute Idee, hat aber grundsätzlich erst einmal nichts mit objektorientierter Programmierung zu tun. Die zusätzliche(n) Dateie(n) sollten auch keine Python-Dateien sein, sondern Datendateien. JSON würde sich da als Format anbieten. Da gibt es in der Standardbibliothek das `json`-Modul für.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Rayano
User
Beiträge: 22
Registriert: Freitag 7. Juli 2023, 09:21

ok danke für die ausführliche erklärung. Mein problem wenn ich zusätzliche Biblotheke nutze könnte ich mich überfordert fühlen deswegen möchte ich das schritt für schritt angehen. Ich weis was grundsätzlich die Objekt basierte programmierung ist. Ein bestandteil davon wäre das man sachen auslagert um den code übersichtlicher zu machen. Mein english ist leider nicht so gut, deswegen würde ich speziell in meinen Fall bei deutschen Variablen bleiben. Dient in meinen Fall der Übersicht.

Mein Idee mit dem Auslagern werde ich aber erstmal so weiterverfolgen da den Programmcode auch kommpakt halten kann, hoffe ich zu mindest. Das Modul json werde ich mir aber sicher noch anschauen. Aber aktuell bin ich noch dabei meinen eigenen weg beim progarmmieren zu finden.

Ich programmiere erst seit wenigen wochen, habe vor 5 wochen wärend einer REHA massnahme erst damit angefangen und bin doch erstaunt wieviel spaß ich dabei habe
Rayano
User
Beiträge: 22
Registriert: Freitag 7. Juli 2023, 09:21

ich habe jetzt etwas code geschrieben aber mit dem Mischen leider noch ein problem

hier erstmal der Code:

Code: Alles auswählen

import random

print("Willkommen bei meinem kleinen Quiz")
print("Das Spiel heißt 'Wer wird Gilionär'")
print("Die Regeln sind einfach:")
print("Beantworte Fragen rund um Final Fantasy 14 und verdiene bis zu 1.000.000 Gil")
name = input("Wie darf ich dich ansprechen? ")

while True:
    print("Ist " + name + " korrekt? Nutze Ja/ Nein")
    antwort = input().lower()
    if antwort == "ja":
        print("Hallo " + name + "!")
        break
    elif antwort == "nein":
        name = input("Wie darf ich dich ansprechen? ")
    else:
        print("Ungültige Eingabe. Bitte antworte mit 'Ja' oder 'Nein'")

print("Willkommen " + name + " .")

fragen = [
    ("Wer ist der Schutzgott von Ul´dah?", [
        ('A', 'Nald\'thal', True),  # Antwort A - Die richtige Antwort
        ('B', 'Thaliak', False),    # Antwort B
        ('C', 'Halone', False)      # Antwort C
    ]),
    # Hier kannst du weitere Fragen hinzufügen
]

# Funktion, um eine Frage zu stellen und die Antwort des Benutzers zu überprüfen
def frage_stellen(frage, antworten):
    print(frage)
    # Die Antwortmöglichkeiten werden vor dem Stellen der Frage gemischt
    random.shuffle(antworten)
    for buchstabe, antwort, ist_richtig in antworten:
        print(f"{buchstabe}: {antwort}")

    benutzer_antwort = input("Bitte geben Sie den Buchstaben Ihrer Antwort ein (A, B oder C): ").upper()

    for buchstabe, antwort, ist_richtig in antworten:
        if benutzer_antwort == buchstabe:
            if ist_richtig:
                print("Richtig! Das ist die richtige Antwort.")
            else:
                print(f"Falsch! Die richtige Antwort ist {next(buchstabe for b, a, i in antworten if i):}: {next(a for b, a, i in antworten if i)}.")
            break
    else:
        print("Ungültige Eingabe. Bitte geben Sie A, B oder C ein.")

# Spielende Nachricht
print("Danke, dass du an meinem Quiz teilgenommen hast, " + name + "!")
dieser Funktioniert auch soweit, aber die richtige antwort wird immer A zugeordnet. wenn jemand das Quiz mach soll diese person aber nicht nur a eingeben müssen als antwort
Das Programm Mischt zwar die Antworten, gibt aber immer A = Nald\'thal

was kann ich machen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst die A/B/C loswerden, und stattdessen eben auf die Nummer 1, 2, 3 abzielen, die dann entsprechend geprueft wird anhand der gemischten Fragen.
Rayano
User
Beiträge: 22
Registriert: Freitag 7. Juli 2023, 09:21

hm... und dann die ausgabe numerisch ordnen?
danke das werde ich mal versuchen
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Rayano: Ich bin mir nicht so sicher was Du mit „Objekt basierter programmierung“ meinst. In Python ist alles was man an einen Namen binden kann ein Objekt, also sind in Python „Wert“ und „Objekt“ Synonyme. Es ist nicht möglich etwas sinnvolles zu Programmieren ohne Objekte zu benutzen. Aufteilen von Code auf Module hat nichts speziell mit Objekten zu tun. Das macht man um Ordnung in zu viele Elemente zu bringen. Eine Datenstruktur mit Fragen/Antworten und eine Handvoll funktionen, die so ein Quiz abarbeiten sind sicher nicht zu viel für ein Modul. Zumal man die Fragen/Antworten ja nur im ersten Schritt im Quelltext haben möchte. Datendateien sind viel flexibler. Da kann man dann mehrere von erstellen, oder auch andere Leute, zu verschiedenen Themen. Der Code um so ein Quiz abzuarbeiten bleibt ja gleich.

Auslagern kann Code auch unübersichtlicher machen, weil man dann erst in anderen Dateien nachschauen muss, statt alles in einer Datei auf einen Blick zu haben. Ich würde mit mehreren Modulen nicht einfach aus Selbstzweck anfangen, sondern erst wenn es da tatsächlich einen guten Grund dafür gibt. Wenn man mehrere Module hat, kommt im Grunde auch gleich Packages als Thema dazu, weil man sonst mehr als einen Namen auf ”oberster Ebene” hat, der mit all den anderen Modulen und Packages aus der Standardbibliothek und externen Packages in Konflikt stehen kann.

Zum Quelltext: Das Hauptprogramm sollte auch in einer Funktion stecken, die üblicherweise `main()` heisst. Auf Modulebene sollte nur Code stehen, der Konstanten, Funktionen, und Klassen definiert.

Du kennst doch schon f-Zeichenkettenliterale, dann solltest Du keine Zeichenketten und Werte mehr mit ``+`` zusammenstückeln.

``name = input("Wie darf ich dich ansprechen? ")`` kommt zweimal im Code vor, das macht man nicht. Das kann man so umsortieren, dass es nur einmal am Anfang der Schleife steht.

Man kann Zeichenketten in ' oder in " einfassen, oder """ oder ''', darum ist es eigentlich so gut wie nie nötig Anführungszeichen mit \ zu schützen. Einfach eine der anderen Varianten als Begrenzer der gesamten Zeichenkette verwenden.

Bei Funktionen sollten keine überraschenden Änderungen an den Argumenten vorgenommen werden. Das eine Funktion die `frage_stellen()` heisst, die Reihenfolge der übergebenen Antworten ändert, ist sehr überraschend. Ich würde sagen selbst das Dokumentieren von diesem Umstand ist immer noch “falsch“. Die Funktion sollte die Reihenfolge einfach nicht ändern. Also vor dem mischen eine Kopie der Antworten erstellen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Funktionen stehen nicht mitten im Code und auch das Hauptprogramm wird in eine Funktion gepackt, die man üblicherweise `main` nennt.
Strings stückelt man nicht mit + zusammen, sondern benutzt format-Strings.

Wie ich schon schrieb, sollte man nur die Antworten in einer Liste speichern, und einfach die erste Antwort als die Richtige annehmen. Erst bei der Ausgabe wird dann der Buchstabe erzeugt.
Es gibt vier verschiedene Arten, um Literale Strings im Code anzugeben, ein Anführungszeichen per \ zu escapen, ist daher eigentlich nie nötig.

Code: Alles auswählen

import random
import string

# Funktion, um eine Frage zu stellen und die Antwort des Benutzers zu überprüfen
def frage_stellen(frage, antworten):
    print(frage)
    # Die Antwortmöglichkeiten werden vor dem Stellen der Frage gemischt
    richtige_antwort = antworten[0]
    antworten = antworten[:]
    random.shuffle(antworten)
    for buchstabe, antwort in zip(string.ascii_uppercase, antworten):
        print(f"{buchstabe}: {antwort}")

    benutzer_antwort = input("Bitte geben Sie den Buchstaben Ihrer Antwort ein (A, B oder C): ").upper()
    try:
        index = string.ascii_uppercase.index(benutzer_antwort)
        gegebene_antwort = antworten[index]
    except (ValueError, IndexError):
        print("Ungültige Eingabe. Bitte geben Sie A, B oder C ein.")
    else:
        if gegebene_antwort == richtige_antwort:
            print("Richtig! Das ist die richtige Antwort.")
        else:
            index = antworten.index(richtige_antwort)
            buchstabe = string.ascii_uppercase[index]
            print(f"Falsch! Die richtige Antwort ist {buchstabe}.")


def main():
    print("Willkommen bei meinem kleinen Quiz")
    print("Das Spiel heißt 'Wer wird Gilionär'")
    print("Die Regeln sind einfach:")
    print("Beantworte Fragen rund um Final Fantasy 14 und verdiene bis zu 1.000.000 Gil")
    name = input("Wie darf ich dich ansprechen? ")

    while True:
        print(f"Ist {name} korrekt? Nutze Ja/ Nein")
        antwort = input().lower()
        if antwort == "ja":
            print(f"Hallo {name}!")
            break
        elif antwort == "nein":
            name = input("Wie darf ich dich ansprechen? ")
        else:
            print("Ungültige Eingabe. Bitte antworte mit 'Ja' oder 'Nein'")

    print("Willkommen {name}.")

    fragen = [
        ("Wer ist der Schutzgott von Ul´dah?", [
            "Nald'thal",  # Antwort A - Die richtige Antwort
            'Thaliak',     # Antwort B
            'Halone',      # Antwort C
        ]),
        # Hier kannst du weitere Fragen hinzufügen
    ]
    for frage, antworten in fragen:
        frage_stellen(frage, antworten)
    # Spielende Nachricht
    print(f"Danke, dass du an meinem Quiz teilgenommen hast, {name}!")

if __name__ == "__main__":
    main()
Rayano
User
Beiträge: 22
Registriert: Freitag 7. Juli 2023, 09:21

ja dein code sieht seihr übersichtlich aus.....
ich hoffe das ich in meiner umschulung dann lerne wie ich meinen code übersichtlicher machen kann. Aber erstmal geht es mir nur darum code zu erstellen und dafür zu sorgen das dieser auch funktioniert. Deswegen habe ich mich auch hier angemeldet um z.b. code von anderen zu sehen. Auch wenn ich nicht umbediengt helfen kann so kann ich hier doch ein menge lernen.

python ist aktuell nur ein hobby, das programm schreibe ich für meine Gilde da ich aktuell leider keine zeit habe das spiel zu spielen aber ich so zumindest einen anteil an den events die wir dort machen :D

also an der stelle nochmal danke ich werde deine tipps annehmen und mich weiter verbessern
Antworten