Seite 1 von 9

Gewinnspiel

Verfasst: Dienstag 26. März 2013, 13:15
von Gary123456
Hi,

ich hätte vor ein kleines Spiel zu programmieren. Das Spiel ist eine Art Gewinnspiel wie zum Beispiel "Wer wird Millionär". Um Fehler zu vermeiden und den Code so einfach zu gestalten wie es geht, würde ich zuvor einen Plan erstellen.

Ich hätte mir gedacht, alle Fragen in eine Listre zu packen. Dann per random Modul eine Frage raussuchen und die muss dann beantwortet werden. Dann müsste ich die Antworten in eine andere Liste packen und dann die Eingabe (Antwort des Users wird per input gemacht) mit der Liste verglichen. Wenn richtig, lösche Einträge aus der Liste und das gleiche Spiel von vorne.

Wie würde denn so ein Programmierplan denn genau aussehen? Sind meine Gedanken korrekt bzw. sinnvoll?

Re: Gewinnspiel

Verfasst: Dienstag 26. März 2013, 13:32
von /me
Gary123456 hat geschrieben:Ich hätte mir gedacht, alle Fragen in eine Listre zu packen. Dann per random Modul eine Frage raussuchen und die muss dann beantwortet werden. Dann müsste ich die Antworten in eine andere Liste packen und dann die Eingabe (Antwort des Users wird per input gemacht) mit der Liste verglichen.
Du solltest eine Datenstruktur wählen die das abbildet was du brauchst. Fragen und Antworten in komplett unterschiedlichen Listen zu halten klingt nicht wie eine gute Idee.

Du solltest ein Objekt haben das eine Frage zusammen mit den möglichen Antworten und einem Marker für die korrekte Antwort speichert. Das Objekt lässt sich dann auch bei Bedarf ohne größere Probleme um weitere Informationen wie z.B. den Schwierigkeitsgrad der Frage erweitern. Bei deinem vorgeschlagenen Ansatz müsstest du dafür noch eine Liste ergänzen und dann auch noch sicherstellen, dass du alles synchronisiert bekommst. Diese Objekte könnten dann direkt noch Methoden wie check_answer oder ähnliches mitbringen. Was dort hingegen nicht hineingehört sind Ein- und Ausgaben.

Mehrere dieser Objekte kannst du dann natürlich problemlos in EINER Liste halten.

Re: Gewinnspiel

Verfasst: Dienstag 26. März 2013, 15:21
von Gary123456
OK neuer Plan:

- ich gestalte ein Menü, indem man folgende Sachen auswählen kann: Missionen, Schwierigkeitsgrade, Andere Spiele, Über mich und Exit.
- Standardschwierigkeit ist Mittel. D.h. ich speicher das in einer Variable ab wie z.B. schwierigkeit = 0 #einfach ...
- Wenn im Menü Missionen ausgewählt wurde, dann zeige alle Missionen. Sprich: Ich darf nur von Level1 anfangen und nicht höheres Level!

Vorgehensweise:

- Menü gestalten
- Missionsanzahl festlegen
- Fragen finden
- Fragen einbauen
- Testen
- Fertig

Fragen an euch:

- Gibt es ein Modul mitdem man Sound abspielen kann?
- Passt das vom Plan her?

Re: Gewinnspiel

Verfasst: Dienstag 26. März 2013, 15:28
von BlackJack
@Gary123456: Die Missionsanzahl ergibt sich ja wohl aus der Datenstruktur in der die Missionen gespeichert sind. Da kann man ja abfragen wieviele Missionen enthalten sind.

Re: Gewinnspiel

Verfasst: Dienstag 26. März 2013, 15:53
von /me
Gary123456 hat geschrieben:- Passt das vom Plan her?
Ich gehe Projekte anders an. Zuerst kümmere ich mich um die Logik und erst ganz zum Schluss um Ein- und Ausgabe. "Menü gestalten" wäre also bei mir von der Priorität her weit hinten.

Re: Gewinnspiel

Verfasst: Dienstag 26. März 2013, 19:16
von lunar
@/me Gerade bei einem Spiel würde ich anders herum vorgehen, denn gerade bei einem Spiel ist die graphische Darstellung und die Bedienung von großer Wichtigkeit. Wenn man da keinen sinnvollen Prototypen hinbekommt, kann man das Projekt abbrechen.

Die Logik dagegen ist bei „Wer wird Millionär“ reichlich trivial, schnell implementiert und schnell an die GUI geklebt.

Re: Gewinnspiel

Verfasst: Dienstag 26. März 2013, 19:39
von Gary123456
Ich hätte mir das vom Design her so vorgestellt:

Menü:

[1] Missionen Schwierigkeit: [integer]
[2] Schwierigkeitsgrade
[3] Andere Spiele
[4] Über mich
[5] Exit

Missionen: (Menüpunkt [1])
Schwierigkeit: [integer]
[1] Fussball
[2] Schauspieler
[3] Musik
[4] Filme
[5] Technik
[6] Wirtschaft
[7] Internet
[8] Handy
[9] Spiele
[10] Schule

Dann:
Wenn z.B. [1] aufgerufen wurde, dann bekommt der Benutzer 10 Fragen, die er zu beantworten hat.

Schwierigkeitsgrade: (Menüpunkt [2])

[1] Leicht
[2] Mittel
[3] Schwierig

Andere Spiele: (Menüpunkt [3])

[1] Spiel1
[2] Spiel2
[3] ...

Über mich: (Menüpunkt [4])

Name:
Alter:
Ort:
...

Wichtige Variablen:

Mission = integer ; speichert, bei welcher Mission sich der User befindet. Ist sehr nützlich, da man damit festlegen kann, ob die anderen Missionen bereits freigeschaltet sind
Frage = integer ; speichert einen integer Wert, bei welcher Frage sich der User befindet. Ist nützlich, da man damit festlegen kann, ob die anderen Fragen bereits freigeschaltet sind
Schwierigkeit = integer ;speicher einen integer Wert, mit dem man die Schwierigkeit festlegen kann
Punkte = integer ; Bestimmt die Punkteanzahl

Sonstiges:

Spieler muss bei Mission 1 beginnen. Er kann somit nicht bei höheren Missionen mitmachen. Wenn Frage richtig beantwortet, erhöhe die Variable "Frage" um 1, wenn die Frage falsch beantwortet wurde, dann gehe zum Hauptmenü. Wenn Frage richtig beantwortet, gibt es immer 100 Punkte dazu.

Mein zurzeitiger Mini-Code:

Code: Alles auswählen

import sys

def schwierigkeitsgrade():

    print("[1] Leicht")
    print("[2] Mittel (Standard)")
    print("[3] Schwer")

    schwierigkeit = input("Geben Sie nun die gewünschte Schwierigkeit ein!")

    main()


    
def main():
#Menü
    print("[1] Missionen")
    print("[2] Schwierigkeitsgrade")
    print("[3] Andere Spiele")
    print("[4] Über mich")
    print("[5] Exit")

    schwierigkeit = "2"

    menue_query = input("Geben Sie die gewünschte Option ein!")

    if menue_query == "1":
        mission()
    elif menue_query == "2":
        schwierigkeitsgrade()
    elif menue_query == "3":
        andere_spiele()
    elif menue_query == "4":
        ueber_mich()
    elif menue_query == "5":
        sys.exit()

if __name__=="__main__":
    main()
Meine Fragen:

- Gibt es ein Modul mit dem man Sound abspielen kann?
- Von der Planung her alles richtig?
- Gibt es ein Modul mit dem man Videos sicher abspielen kann?

Sonstige Informationen:

Ich würde sehr gern auf Dauer auf dem Spiel aufbauen. Sprich eine Benutzeroberfläche bauen, nette Animationen einbauen, und vll auch noch einiges mehr. Daher ist mir dieses Projekt sehr wichtig!

Re: Gewinnspiel

Verfasst: Dienstag 26. März 2013, 20:20
von BlackJack
@lunar: Kommt das nicht sehr auf das Spiel(genre) an? Bei rundenbasierten Spielen oder bei dem Frage/Antwort-Spiel was Gary123456 vorhat würde ich mit der Spiellogik anfangen und nicht bei der Grafik/Oberfläche. Denn bei beiden kommt es nicht wirklich auf Grafik und Bedienung an — das geht bei den meisten Sachen in der Richtung auch erst einmal mit einer Text-Ein- und Ausgabe.

@Gary123456: Bei den wichtigen Variablen sind ganze Zahlen die man auch *direkt* durch die Datenstruktur repräsentieren kann. Warum eine Zahl die für die Mission steht, statt direkt die Mission verwenden? Wobei Mission hier ein komisches Wort ist. Deinen Beispielen nach würde ich das Thema nennen, oder so ähnlich.

Bei Deinem Mini-Code hast Du schon ein gravierendes Problem: Du verwendest Funktionsaufrufe wie unbedingte Sprünge zu Codeblöcken mit Namen. Zwischen `schwierigkeitsgrade()` und `main()` besteht eine Endlosrekursion. Das würde ich als Programmfehler werten, denn damit wird irgendwann das Rekursionslimit erreicht und das Programm bricht mit einem Fehler ab. Davon abgesehen, dass die lokalen Variablen der Funktionsaufrufe sich ohne Grund im Speicher ansammeln. Funktionen ruft man auf, damit sie irgendwann zum Aufrufer zurück kehren.

`schwierigkeitsgrade()` ist ja deshalb auch eine total sinnfreie Funktion weil mit dem eingebenen Wert überhaupt nichts gemacht wird. Den gibt der Benutzer ein und dann kann das Programm damit nichts mehr machen. Vielleicht möchtest Du das ja an den Aufrufer zurück geben, damit der sich das merken kann.

Eine Funktion die eine Liste mit Menüpunkten entgegen nimmt, diese ausgibt, und den Benutzer dann so lange nach Eingaben fragt, bis der eine Zahl im Bereich der Menüpunkte eingegeben hat, und diese Zahl dann an den Aufrufer zurück gibt, wäre vielleicht eine gute Idee. Und dann bitte auch als *Zahl* und nicht als Zeichenkette und angefangen bei 0 und nicht bei 1, damit man die Eingabe zum Beispiel als Index in eine Liste verwenden kann.

Die Menüpunkte 3 und 4 haben irgendwie nicht viel mit dem Spiel zu tun, die könnte man auch erst einmal weg lassen bis das eigentliche Spiel steht.

Das `sys.exit()` könnte man durch ein ``return`` ersetzen.

Sound und Videos sollte mit `pygame` möglich sein. Damit halst Du Dir aber eine zusätzliche, umfangreiche Bibliothek auf. Ich würde erst einmal das Spiel an sich schreiben.

Re: Gewinnspiel

Verfasst: Mittwoch 27. März 2013, 11:31
von Gary123456
Hi,

Zum Begriff Datenstruktur:

"Eine Datenstruktur ist ein mathematisches Objekt zur Speicherung von Daten"
Nun wäre meine Frage, wie kann ich mir das vorstellen? In Wikipedia nennen sie als Grundstruktur Arrays, verkettete Listen .... . Somit ist also eine Datenbstruktur eine Struktur, die Daten innerhalb einer Liste jeweils mit demselben Datentypen speichert?

Ja Mission ist ein recht blöder Begriff. Da passt wirklich Thema oder Genre besser.

Ich wollte mit den wichtigen Variablen die Fortschritte speichern. z.B. Wenn User Frage 1 richtig beantwortet hat und ins Hauptmenü zurückgeht, braucht er doch nicht wieder bei Frage 1 anfangen, stimmts? Es wäre doch auch klüger, Spielstände extern zu speichern. Ich meine damit z.B. Name, Punktezahl, Level .... in ein Textdokument zu speichern. Der User müsste am Anfang des Spieles nur sein eigenes Profil erschaffen.

Mini-Code - ja ich weiss - war schlecht. Mir sind die Fehler mehr als bewusst. Mir fehlt noch etwas Übung.

Sound und Video ist mir sehr wichtig. Das wird aber zum Schluss gemacht! Ich werde mal suchen, ob es andere Möglichkeiten auch noch gibt. :)

Re: Gewinnspiel

Verfasst: Mittwoch 27. März 2013, 16:01
von Gary123456
Hab jetzt noch das gefunden: http://wiki.python.org/moin/Audio

Was ist das sicherste und beste davon?

Re: Gewinnspiel

Verfasst: Mittwoch 27. März 2013, 16:21
von bwbg
Lass erst einmal die Sound-Ausgabe beiseite und kümmere Dich um die Konsolenausgabe Deines Spiels.

Deine Mission ist es, eine Funktion oder Klasse zu entwickeln, mit welcher sich alle Deine Menüs darstellen lassen, ohne dass es in if-elif- Kaskaden ausartet. ;)

Stichworte seinen hier: dict oder list mit enumerate. Im Forum gibt es genügend Beispiele.

In dem Fall von ich auch dafür, zunächst die Ein- und Ausgabe zu implementieren. Die Logik ist vergleichsweise einfach und es motiviert, wenn man was auf den Schirm bekommt.

Grüße ... bwbg

Re: Gewinnspiel

Verfasst: Mittwoch 27. März 2013, 16:26
von /me
bwbg hat geschrieben:Die Logik ist vergleichsweise einfach und es motiviert, wenn man was auf den Schirm bekommt.
Zweiteres stimmt. Ersteres stimmt nicht im Kontext des Wissensstandes des konkreten Programmierers.

Re: Gewinnspiel

Verfasst: Mittwoch 27. März 2013, 16:45
von bwbg
Deswegen auch "vergleichsweise".

Vergleichsweise noch einfacher ist das Entwickeln einer Datenstruktur für das Menü ...

Gruße ... bwbg

Re: Gewinnspiel

Verfasst: Mittwoch 27. März 2013, 16:57
von Gary123456
Ihr meint jetzt ich soll alle Menüpunkte in eine Liste packen und sie dann per for Schleife ausgeben?

Re: Gewinnspiel

Verfasst: Mittwoch 27. März 2013, 17:08
von Gary123456
Dann wäre der Code viel kürzer:

Code: Alles auswählen

def main():
    menü = ["[1] Themen", "[2] Schwierigkeiten", "[3] Exit"]

    for i in menü:
        print(i)

if __name__ == "__main__":
    main()


Re: Gewinnspiel

Verfasst: Mittwoch 27. März 2013, 17:18
von BlackJack
@Gary123456: Wobei hier die Zahlen in den Menüpunkten ja immer mit der Reihenfolge übereinstimmen. Also kann man die vom Programm bei der Anzeige erzeugen lassen und muss sie nicht von Hand in die Daten reintippen. Dann lässt sich auch viel einfacher ein Menüpunkt einfügen oder herausnehmen, ohne das man alle folgenden Menüpunkte von Hand an die geänderte Nummerierung anpassen muss.

Re: Gewinnspiel

Verfasst: Mittwoch 27. März 2013, 17:45
von anogayales
Sowas ist doch viel generischer:

Code: Alles auswählen

def main():
    menu = ["Themen", "Schwierigkeiten", "Exit"]

    for index, item in enumerate(menu, start=1):
        print("[%s] %s" % (index, item))

if __name__ == "__main__":
    main()
und so viel Code ist das auch nicht.

Re: Gewinnspiel

Verfasst: Mittwoch 27. März 2013, 18:07
von Gary123456
Ich empfinde meine Option als leichtestes Mittel. Habe aber was dazugelernt.

Re: Gewinnspiel

Verfasst: Mittwoch 27. März 2013, 18:21
von Gary123456
Hab jetzt was programmiert und aus meiner Sicht funktioniert alles:

Code: Alles auswählen



def schwierigkeiten():
    schwierig_list = ["[1] leicht", "[2] mittel", "[3] schwierig"]

    for i in schwierig_list:
        print(i)

    global schwierig_query
    schwierig_query = input("Geben Sie die gewünschte Schwierigkeit ein!")
    main()

def themen():
    themen_list = ["[1] Fussball", "[2] Schauspieler", "[3] Musik", "[4] Filme", "[5] Technik", "[6] Wirtschaft", "[7] Internet", "[8] Handy", "[9] Spiele","[10] Schule"]

    try:
        print("Ausgewählte Schwierigkeit:",schwierig_query)
    except:
        print("Keine Schwierigkeit ausgewählt!")
        return
    for i in themen_list:
        print(i)

    themen_query = input("Geben Sie die gewünschte Option ein!")

def main():
    menü = ["[1] Themen", "[2] Schwierigkeiten", "[3] Exit"]

    for i in menü:
        print(i)

    menü_query = input("Geben Sie nun die gewünschte Option ein!")

    if menü_query == "1":
        themen()
    elif menü_query == "2":
        schwierigkeiten()
    elif menü_query == "3":
        return
    else:
        print("Sie haben was falsches eingegeben!")


if __name__ == "__main__":
    main()
Von der Grundstruktur her richtig gedacht`?

Re: Gewinnspiel

Verfasst: Mittwoch 27. März 2013, 18:36
von /me
Gary123456 hat geschrieben:Von der Grundstruktur her richtig gedacht`?
Sobald du global verwendest machst du in der Regel etwas falsch.