Wie werden Rollenspiele programmiert

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
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Nabend,

Ich moechte bald ein kleines größeres Projekt starten und ein kleines Rollenspiel auf die Beine stellen, das erstmal nur aus Text besteht. (Um die 100 Kilo Byte groß) Und ich wollte euch Fragen ob jemand "Wissensquellen" kennt, die sich speziell auf Rollenspiel-artige Programme konzentrieren, denn jedes Spielgengre ist eine Kunst für sich, die man nicht unterschätzen sollte. Kennt ihr da ein paar empfehlenswerte Anleitungen zum Programmieren von Rollenspielen? (Muss nicht mit Python verbunden sein, ich will mir nur allgemeines logisches Verständnis dafür aneignen.)

Ideal wäre ein (kleines) Rollenspiel das in Basic oder Python oder sonstigen (am besten einfachen) Sprachen geschrieben wurde, wo ich den Code genau angucken und studieren könnte.

Danke für Antworten!
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Am besten fängst du einfach an und probierst aus. Die ersten Ansätze werden eh nicht funktionieren. Egal ob du vorher etwas darüber liest oder nicht. Hilfreich könnte es auch sein, wenn du deinen Code hier postest. In der Regel wird der dann zwar vollkommen zerpflückt, aber mehr Hinweise kannst du wohl kaum bekommen.
Das Leben ist wie ein Tennisball.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Bin grad dabei und habe ein problem. (achso, mein spiel soll Textkonsole sein)
das inventar.
Ich muss eine möglichkeit finden, das er nur die items anzeigt, die ich wirklich habe. man könnte das mit if und else machen, aber ich hab das im blut das es da eine bessere variante gibt. vielleicht listen oder sowas
Benutzeravatar
pixewakb
User
Beiträge: 1409
Registriert: Sonntag 24. April 2011, 19:43

Sicher Listen :D, noch besser objektorientiert :D

Inventar_Item_reinlegen

Inventar_anzeigen

Inventar_Item_entfernen

Ach ja, kennst du pygame??? Dort gibt es auf der Projektwebsite auch eine Rubrik rpg...
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Die Rubrik habe ich auch schon gesehen, ja:D aber erst nach genauem hinschauen, schön versteckt...
das doofe ist auch das es ziemlich kompliziert ist das pygame modul zu importieren:(
und mit objekten habe ich derzeit so meine verständnisproblemchen, und bin deswegen zu faul mich ranzusetzen und das nochmal zu lernen...
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Dexter,

gerade bei Rollenspielen gibt es ja eine Unmenge an Objekten. Und wenn das Spiel mal größer wird,
kommt irgendwann der Punkt, wo Du bereust, nicht von anfang an objektorientiert Programmiert zu
haben.
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Die Frage wäre halt, was du unter einem Rollenspiel verstehst; man kann da ja verschiedene Typen unterscheiden (abgesehen davon, dass der Begriff inzwischen ganz schön verwässert ist und zumindest "Rollenspielelemente" ja zum guten Ton gehören ;) ). Ein klassisches Subgenre wären z.B. roguelikes, zu denen es auch einiges an Material gibt, als Startpunkt wäre evtl. zu nennen: http://roguebasin.roguelikedevelopment. ... =Main_Page bzw. http://roguebasin.roguelikedevelopment. ... e=Articles
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Die Website sieht sehr interessant aus!
Die Rollenspielart die ich meine, ist von der Sielmechanik ungefähr so wie "World of Warcraft" und "Nostale".
Ich hab schonmal ein Übungsskript geschrieben, um ein Gefühl für die Rollenspielprogrammierung zu bekommen:
(Entstanden mit Python 2.6)

Code: Alles auswählen

# -*- coding: cp1252 -*-
import random, time

# Variablen fuer Characktereigenschaften
Leben = 100
Max_Leben = 100
Aktionspunkte = 10
Ruestung = 0
Stufe = 1
Waffenwert1 = 2
Waffenwert2 = 5

# Variablen fuer Inventar
Goldmuenzen = 500
Monsterfell = 0
Heiltrank = 0
Heilpflanze = 0
Starker_Heiltrank = 0

# Preise fuer Verbesserungen des Charackters
Ruestung_Preis = 200
Waffe_Preis = 200
Leben_Preis = 200

# Monster Werte
F_Schadenswert1 = 1
F_Schadenswert2 = 4
F_Ruestung = 0
F_Max_Leben = 60
F_Leben = F_Max_Leben
Monster_Gold = 2000

# Variablen für Level und Faehigkeiten
Levelanforderung = 3
Erfahrungspunkte = 0
Level = 1
Pflanzenkunde = 0
Pflanzenkunde_Preis = 50000

# Variablen fuer Quests
Quest_Belohnung = 100000

print "Die Anleitung kriegst du, wenn du die Ziffer [7] in der Auswahl tippst." 
print

while Leben > 0 and Aktionspunkte > 0:
    
    Schaden = random.randint (Waffenwert1, Waffenwert2)
    
    print "[1] Charackter anschauen" 
    print "[2] In die Stadt"
    print "[3] In den Wald gehen"
    print "[4] Inventar oeffnen"
    print "[5] Quests suchen"
    print
    print "Du hast " + str(Aktionspunkte) + " Aktionspunkte, " + str(Goldmuenzen) + " Goldmuenzen und " + str(Leben) + " Lebenspunkte."
    print
    eingabe = int (raw_input ("Zahl eingeben um etwas zu tun:") )
    print

    if eingabe == 1:
        
        print "Level: " + str (Level)
        print "Waffe:  " + str(Waffenwert1) + "-" + str(Waffenwert2) + " Schaden"
        print "Ruestungsstufe: " + str(Stufe)
        print "Lebenspunkte: " + str(Leben) + "/" + str(Max_Leben)
        print "Alchemiestufe: " + str(Pflanzenkunde)
        print

    while eingabe == 2:
        
        print "[1] Zum Haendler"
        print "[2] Zum Skillmeister"
        print "[3] Sachen herstellen"
        print "[4] Zurueck zur Auswahl"
        print
        eingabe2 = int (raw_input ("Wo willst du hin?") )
        print
        
        while eingabe2 == 1:
            print "Du hast " + str(Goldmuenzen) + " Goldmuenzen"
            print
            print "[1] Heiltrank kaufen (100 Gold)"
            print "[2] Aktionspunkte kaufen (50 Gold)"
            print "[3] Zurueck zu Stadtuebersicht"
            print
            eingabe3 = int(raw_input ("Was willst du kaufen?"))
            
            if eingabe3 == 1:
                eingabe4 = int (raw_input ("Wieviele Heiltraenke willst du kaufen?"))
                Preis_Heiltrank = 100 * eingabe4
                if Goldmuenzen >= Preis_Heiltrank:
                    Goldmuenzen = Goldmuenzen - Preis_Heiltrank
                    Heiltrank = eingabe4
                    print "Handel erfolgreich abgeschlossen."
                    print
                else:
                    print "Du hast nicht genug Gold!"
                    print
                    
            if eingabe3 == 2:
                anzahl_Aktionspunkte = int (raw_input ("Wieviele Aktionspunkte willst du kaufen?") )
                preis = 50 * anzahl_Aktionspunkte
                if preis <= Goldmuenzen:
                    Goldmuenzen = Goldmuenzen - preis
                    Aktionspunkte = Aktionspunkte + anzahl_Aktionspunkte
                    print "Du hast " + str(anzahl_Aktionspunkte) + " Aktionspunkte fuer " + str(preis) + " Goldmuenzen gekauft."
                    print
                elif preis > Goldmuenzen:
                    print "Du hast nicht genug Geld."
                    print
                    
            if eingabe3 == 3:
                eingabe2 = 0
                print
            time.sleep(1)

        while eingabe2 == 2:
            print "Goldmuenzen: " + str(Goldmuenzen)
            print
            print "[1] Alchemie Stufe " + str((Pflanzenkunde + 1)) + " erlernen (" + str(Pflanzenkunde_Preis) + "Gold)"
            print "[2] Waffe verbessern " + "(" + str(Waffe_Preis) + " Gold)"
            print "[3] Ruestung verbessern " + "(" + str(Ruestung_Preis) + " Gold)"
            print "[4] Lebenspunkte erhoehen " + "(" + str(Leben_Preis) + " Gold)"
            print "[5] Abbrechen"
            print
            eingabe3 = int(raw_input("Was willst du lernen?"))
            
            if eingabe3 == 1:
                print "Das kostet dich " + str(Pflanzenkunde_Preis) + " Goldmuenzen."
                time.sleep(1)
                if Goldmuenzen >= Pflanzenkunde_Preis:
                    Pflanzenkunde = Pflanzenkunde + 1
                    print "Herzlichen Glueckwunsch! Du kannst nun bessere Traenke herstellen!"
                    print
                    Goldmuenzen = Goldmuenzen - Pflanzenkunde_Preis
                    Pflanzenkunde_Preis = Pflanzenkunde_Preis + 50000
                else:
                    print "Du hast nicht genug Geld!"
                    print

            if eingabe3 == 2:
                if Goldmuenzen >= Waffe_Preis:
                    Waffenwert1 = Waffenwert1 + 1
                    Waffenwert2 = Waffenwert2 + 2
                    Goldmuenzen = Goldmuenzen - Waffe_Preis
                    F_Schadenswert1 = F_Schadenswert1 + 1
                    F_Schadenswert2 = F_Schadenswert2 + 2
                    Monster_Gold += 500
                    print "Schaden erfolgreich erweitert."
                    print
                    Waffe_Preis = Waffe_Preis + 300
                elif Goldmuenzen < Waffe_Preis:
                    print "Du hast nicht genug Geld!"
                    print
                    
            if eingabe3 == 3 and Stufe < 9:
                if Goldmuenzen >= Ruestung_Preis:
                    Ruestung = Ruestung + 0.1
                    Stufe = Stufe + 1
                    F_Ruestung = F_Ruestung + 0.1
                    Goldmuenzen = Goldmuenzen - Ruestung_Preis
                    Ruestung_Preis = Ruestung_Preis + 300
                    Monster_Gold += 500
                    print "Ruestung erfolgreich verbessert!"
                    print
                if Goldmuenzen < Ruestung_Preis:
                    print "Du hast nicht genug Geld!"
                    print
                if Stufe == 9:
                    print "Deine Ruestung kann man nicht mehr verbessern."
                    print
                    
                if eingabe3 == 4:
                    if Goldmuenzen >= Leben_Preis:
                        Goldmuenzen = Goldmuenzen - Leben_Preis
                        Max_Leben = Max_Leben + 20
                        Leben = Leben + 20
                        F_Max_Leben = F_Max_Leben + 20
                        F_Leben = F_Max_Leben
                        Leben_Preis = Leben_Preis + 300
                        Monster_Gold += 500
                        print "Leben erfolgreich erweitert:"
                        print
                    elif Goldmuenzen < Leben_Preis:
                        print "Du hast nicht genug Geld!"
                        print
        
            time.sleep(1)
            
            if eingabe3 == 5:
                eingabe2 = 0

        if eingabe2 == 3:
            print "[1] Starke Heiltraenke herstellen"
            print "[2] Zurueck zur Auswahl"
            print
            eingabe3 = int(raw_input("Was willst du herstellen?"))
            print
            
            if eingabe3 == 1:
                print "Fuer einen Starken Heiltrank brauchst du 3 Heilpflanzen. (Du hast " + str(Heilpflanze) + " Heilpflanzen)"
                eingabe4 = int(raw_input("Wie viele Heiltraenke moechtest du herstellen?"))
                print
                if eingabe4 <= (Heilpflanze * 3) and Pflanzenkunde >= 1:
                    Heilpflanze = Heilpflanze - (eingabe3 * 3)
                    Starker_Heiltrank = Starker_Heiltrank + eingabe3
                    print "Du hast jetzt " + str(Starker_Heiltrank) + " Starke Heiltraenke!"
                    print
                else:
                    print "Dir fehlen die benötigten Zutaten, oder du bist nicht bewandert genug um einen Heiltrank herzustellen."
                    print
                time.sleep(1)
                
            if eingabe3 == 2:
                eingabe2 = 0
                   
        if eingabe2 == 4:
            eingabe = 0
                       
    while eingabe == 3:
        print "[1] Kaempfe gegen Monster!"
        print "[2] Sammle Pflanzen!"
        print "[3] Zurueck zur Auswahl"
        print
        eingabe2 = int (raw_input ("Moechtest du gegen Monster kämpfen?") )
        print
        
        if eingabe2 == 1:
            Aktionspunkte = Aktionspunkte - 1
            print "Du begegnest einem Monster!!!"
            time.sleep(1)
            print "Ihr schlagt euch!"
            time.sleep(1)
            print "Auf in den Kampf!"
            time.sleep(1)
            print
            
            while Leben > 0 and F_Leben > 0:
                Wert = random.randint (1, 40)
                if Wert == 10:
                    print " BBBBBB    A    A    A          M     M          QQ"
                    print " B     B       A A             M M   M M         QQ"                                                               
                    print " B     B      A   A           M   M M   M        QQ"
                    print " BBBBBB      A     A         M     M     M       QQ"                                                  
                    print " B     B    AAAAAAAAA       M      M      M      QQ"                                                        
                    print " B     B   A         A     M               M       "    
                    print " BBBBBB   A           A   M                 M    QQ"                                                                 
                    print
                    time.sleep(2)
                    print "Ach du scheisse, Du hast maechtig zugeschlagen!"
                    time.sleep(1)
                    F_Leben = 0
                else:
                    Leben = Leben - random.randint (F_Schadenswert1, F_Schadenswert2) * (1 - F_Ruestung)
                    F_Leben = F_Leben - random.randint (Waffenwert1, Waffenwert2) * (1 - Ruestung)
                    print "Dein Leben: --->  " + str(Leben) + "/" + str(Max_Leben) + "   " + str(F_Leben) + "/" + str(F_Max_Leben) + "  <--- Leben vom Monster"
                    print
                time.sleep(1)
            if Leben > 0 and F_Leben <= 0:
                print "Du hast den Kampf gewonnen und dir Gold dazuverdient"
                print
                Goldmuenzen = Goldmuenzen + Monster_Gold
                eingabe = 0
                Monsterfell = Monsterfell + random.randint (5, 15)
                F_Leben = F_Max_Leben
                Erfahrungspunkte = Erfahrungspunkte + 1
            else:
                print "Du hast den Kampf verloren."
                print
                eingabe = 0
                
        if eingabe2 == 2:
            print "Du begibst dich auf Pflanzensuche"
            time.sleep(1)
            for i in range (5):
                Wert_1 = random.randint (1, 2)
                if Wert_1 == 1:
                    Heilpflanze = Heilpflanze + 1
                    print "Du hast eine Heilpflanze gefunden!"
                else:
                    print "Du hast nichts gefunden!"
                time.sleep(2)
            print     
        time.sleep(1)
                         
        if eingabe2 == 3:
            eingabe = 0
             
    while eingabe == 4:
        print "########################################################"
        print "## [1] Heiltrank:         " + str(Heiltrank) + "         Monsterfell: " + str(Monsterfell) + "    ##"
        print "## [2] Starker Heiltrank: " + str(Starker_Heiltrank) + "         Heilpflanze: " + str(Heilpflanze) + "    ##"
        print "########################################################"
        print
        print "[3] Zurueck zur Auswahl"
        eingabe2 = int (raw_input ("Was willst du tun?") )
        if eingabe2 == 1 and Heiltrank > 0:
            Heiltrank = Heiltrank - 1
            Leben = Leben + 50
        elif Heiltrank <= 0 and eingabe2 == 1:
            print "Du hast keine Heiltraenke."
            print
            time.sleep(1)
        if Starker_Heiltrank > 0 and eingabe2 == 2:
            Leben = Leben + 500
            Starker_Heiltrank = Starker_Heiltrank - 1
        elif Starker_Heiltrank == 0 and eingabe2 == 2:
            print "Du hast keine starken Heilstraenke!"
            print
            time.sleep(1)
        if Leben > Max_Leben:
            differenz = Leben - Max_Leben
            Leben = Leben - differenz
        if eingabe2 == 3:
            eingabe = 0
            print

    while eingabe == 5:
        
        Erforderte_Monsterfelle = random.randint (60, 100)
        print "Ein Meister verlangt Felle von dir und will dich dafür Entlohnen."
        print "Er will " + str(Erforderte_Monsterfelle) + " Monsterfelle und bietet " + str(Quest_Belohnung) + " Goldmuenzen dafür."
        print "Angebot annehmen [1]"
        print "Zurueck zu Auswahl [2]"
        print
        eingabe2 = int(raw_input("Was willst du tun?"))
        print
        
        if eingabe2 == 1:
            if Monsterfell >= Erforderte_Monsterfelle:
                Goldmuenzen = Goldmuenzen + Quest_Belohnung
                Monsterfell = Monsterfell - Erforderte_Monsterfelle
                Erfahrungspunkte = Erfahrungspunkte + 10
                print "Der Deal wurde erfolgreich abgeschlossen! Du hast " + str(Quest_Belohnung) + " erhalten."
                print
                Quest_Belohnung = Quest_Belohnung + 50000
                time.sleep (2)
                eingabe = 0
            else:
                print "Du hast nicht genug Monsterfelle!"
                print
                
        if eingabe2 == 2:
            eingabe = 0
        time.sleep(1)
        
    if eingabe == 7:
        print "Du hast 10 Aktionspunkte und 500 Goldmuenzen als Startkapital."
        print "Deine Lebenspunkte und Aktionspunkte dürfen nicht unter 0 sinken, sonst hast du das Spiel verloren."
        print "Toete Monster, kaufe Gegenstaende, steige Stufen auf und entdecke das Spiel!"
        print "Das Ziel des Spiels ist simpel: Immer stärker werden, mehr Schaden austeilen, mehr einstecken können, und so weiter!"
        print
    
    if Erfahrungspunkte >= Levelanforderung:
        Level = Level + 1
        Levelanforderung = Levelanforderung + 10
        Erfahrungspunkte = Erfahrungspunkte - Erfahrungspunkte
        print "DEIN LEVEL WURDE ERHOEHT! DU BIST JETZT LEVEL " + str(Level) + " !"
        print

    time.sleep(1) 
        
if Leben <= 0:
    print "Du bist gestorben, weil du keine Lebenspunkte mehr hast!"

elif Aktionspunkte <= 0:
    print "Du bist vor lauter Erschoepfung gestorben, weil du keine Aktionspunkte mehr hast!"
 
raw_input ()
Falls es eine Möglichkeit gibt, Code in Spoiler hier unterzubringen, last es mich wissen, der Code ist eig. etwas zu lang für ein Forum
Benutzeravatar
pixewakb
User
Beiträge: 1409
Registriert: Sonntag 24. April 2011, 19:43

Der Quellcode ist nicht so schön, sehr verworren, wenn ich das sagen darf. Die while-Schleifen

Das Rollenspiel ist sehr schön gelungen, mir hat es gerade Spaß gemacht, es zu spielen.

Ach ja, implementiere einen Exit-Befehl :!: Du kannst das Spiel momentan nicht direkt beenden.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Danke für das Kompliment!:)
Ja, meine Lehrer sagen aber alle, ich bin ein ziemlicher Träumer und sehr schusslich, ich denke sowas spiegelt sich in meinen Codes wieder:D
Ein Exit Befehl, höre ich zum ersten mal von. Vielen Dank für den Hinweis, hatte schon immer irgendwie gehofft das es sowas gibt!
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Code: Alles auswählen

import sys
print "Guten Tag"
sys.exit("Und gute Nacht")
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dexter1997 hat geschrieben:Ich hab schonmal ein Übungsskript geschrieben, um ein Gefühl für die Rollenspielprogrammierung zu bekommen
Dein Problem ist, dass du überhaupt erst mal ein Gefühl für die Programmierung an sich bekommen musst.

Ich weiß nicht, wie du selber deinen Code empfindest, aber ich gebe dir sicherheitshalber mal eine Einschätzung die auf 30 Jahren Programmiererfahrung beruht: Der Code ist völlig unübersichtlich und für eine Weiterentwicklung absolut nicht zu gebrauchen. Das tut jetzt vielleicht weh, aber es bringt nichts wenn du dich jetzt schon für einen kompetenten Entwickler hältst und mit diesem völlig verkorksten Ansatz weitermachst.

Trenne das alles mal in sinnvolle Funktionen auf. Trenne Verarbeitungslogik und Ein-/Ausgabe. Verwende sprechende Namen (nicht so etwas wie eingabe2). Orientiere dich bitte bei der Namensvergabe am Python Style Guide PEP-8.
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

Das tut jetzt vielleicht weh, aber es bringt nichts wenn du dich jetzt schon für einen kompetenten Entwickler hältst und mit diesem völlig verkorksten Ansatz weitermachst.

Trenne das alles mal in sinnvolle Funktionen auf. Trenne Verarbeitungslogik und Ein-/Ausgabe. Verwende sprechende Namen (nicht so etwas wie eingabe2). Orientiere dich bitte bei der Namensvergabe am Python Style Guide PEP-8.
Das tut nicht weh, das der Code verkorkst ist, glaube ich auch, und ich gebe dir vollkommen recht.Ich bin umso froher das er überhaupt funktioniert xD (Bugs, die man im obrigen Code noch finden kann wurden behoben) Ich bin eh grade dabei den Code in Funktionen zu zerlegen, und ich wollte gleich mal fragen ob es moeglich ist mehrere Variablen an den Aufrufer einer Funktion zurueckzugeben. (mit return)
BlackJack

@Dexter1997: Jain. Man kann nur einen Wert zurück geben. Aber dieser eine Wert kann natürlich auch ein Containerobjekt wie eine Liste oder ein Tupel sein, in dem mehrere Werte zusammengefasst sind.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Ergänzend zu der Antwort von BlackJack hier ein Code-Beispiel (Die Funktion f gibt Tupel der Länge 2 zurück, die mit ``x, y = f(n)`` wieder "ausgepackt" werden können):

Code: Alles auswählen

>>> def f(n):
...     return n, 2**n
... 
>>> x, y = f(5)
>>> x
5
>>> y
32
Dexter1997
User
Beiträge: 92
Registriert: Sonntag 2. Dezember 2012, 21:13

und wo hast du x definiert? bzw. wie geht das, dass er x kennt?
BlackJack

Hier werden `x` und `y` an Werte gebunden die von `f()` in einem iterierbaren Objekt mit zwei Elementen zurück gegeben werden:

Code: Alles auswählen

x, y = f(5)
Antworten