Rollenspiel

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

Code: Alles auswählen

#Rollenspiel

import random
import pickle
import time
import easygui


#Charakter
class Charakter:  #Standard des Charakters
    def __init__(self, charaktername, leben=10, erforderliche_xp=100, gold=300):
        self.name=charaktername
        self.leben=leben
        self.level=1
        self.erfahrung=0
        self.erforderliche_xp=erforderliche_xp
        self.gold=gold
        self.heiltränke=1
        self.standard_angriffskraft=2
        self.waffen_angriffskraft=0
        self.heiltrankskosten=100
        self.skillpunkte=0
        self.vorherige_angriffskraft=0
        self.waffe="Einfaches Schwert"


    def inventar_anzeigen(self):
        print ("Gold:", self.gold)
        print ("Heiltränke:", self.heiltränke)
        print ("Erfahrungspunkte:", self.erfahrung, "von", self.erforderliche_xp)

    def aufnehmen_Inventar(self, gold, heiltränke):
        self.gold+=gold
        self.heiltränke+=heiltränke

    def zeige_Charakterdaten(self):
        print (self.name, "ist auf Level", self.level)
        print ("Angriffskraft:", self.angriffskraft)
        print ("Leben:", self.leben)

    def neues_Level(self):
        if self.erfahrung>=self.erforderliche_xp:
            self.level+=1
            self.erfahrung=0
            self.erforderliche_xp=self.erforderliche_xp*1.5+self.level*50
            print ("Sie haben ein neues Level erreicht:", self.level,
                   "\nSie benötigen für das nächste Level", self.erforderliche_xp, "Erfahrungspunkte\n"
                   "Sie haben 2 Skillpunkte bekommen")
            Abstand()
            self.skillpunkte=self.skillpunkte+1

    def skillen(self):
        while True:
            if self.skillpunkte==0:
                break
            skill=easygui.buttonbox("Was soll geskillt werden? Sie haben:",
                                    choices=("Leben+1", "Angriffskraft+1"))
            self.skillpunkte=self.skillpunkte-1
            if skill=="Leben+1":
                self.leben+=1
            if skill=="Angriffskraft+1":
                self.standard_angriffskraft+=1

    def angreifen(self):
        self.vorherige_angriffskraft=self.angriffskraft
        self.angriffskraft=random.randint(self.angriffskraft-1, self.angriffskraft+1)

    def debuggen_angreifen(self):
        self.angriffskraft=self.vorherige_angriffskraft

    def heiltränke_kaufen(self):
        self.zahl=easygui.integerbox("Wie viele Heiltränke möchten sie kaufen")
        if self.heiltrankskosten*self.zahl<self.gold:
            self.gold-self.heiltrankskosten*self.zahl
            self.heiltränke+=self.zahl
        else:
            print("Nicht genug Geld")

    def aktualisiere_Charakter(self):
        self.angriffskraft=self.standard_angriffskraft+self.waffen_angriffskraft

class Schwertkämpfer(Charakter):
    def __init__(self, name, leben=11):
        Charakter.__init__(self, charaktername=name, leben=leben)

class Ork(Charakter):
    def __init__(self, name):
        Charakter.__init__(self, charaktername=name)
        self.standard_angriffskraft+=1



class Monster:
    def __init__(self, angriffskraft, name, beute,leben, erfahrung):
        self.angriffskraft=angriffskraft
        self.name=name
        self.beute=beute
        self.leben=leben
        self.erfahrung=erfahrung

class Quest:
    def __init__(self, monster, belohnung, erfahrung, monster_anzahl, text, charakter, bestätigung=False):
        self.monster=monster
        self.belohnung=belohnung
        self.monster_anzahl=monster_anzahl
        self.text=text
        self.bestätigung=bestätigung
        self.erfahrung=erfahrung

    def quest_durchführen(self, charakter):
        print (self.text)
        entscheidung=easygui.buttonbox("Willst du die Quest antreten???!",
                                       choices=["Ja", "Nein"])
        if entscheidung=="Ja":
            self.bestätigung=True
        else:
            self.bestätigung=False

        if self.bestätigung:
            for i in range(self.monster_anzahl):
                Kampf(charakter, self.monster)
                Abstand()
            charakter.gold+=self.belohnung
            charakter.erfahrung+=self.erfahrung


def Kampf(charakter, monster):
    alte_monster_leben=monster.leben
    alte_charakter_leben=charakter.leben
    print("Sie kämpfen gegen einen",monster.name)
    while True:
        kampf_auswahl=easygui.buttonbox("Was möchten sie tun?",
                                        choices=["Kämpfen", "Heiltrank einsetzen"])

        time.sleep(2)
        if kampf_auswahl=="Heiltrank einsetzen":
            if charakter.heiltränke>0:
                charakter.leben=alte_charakter_leben
                charakter.heiltränke-=1

            else:
                easygui.msgbox("Keine Heiltränke mehr")

        if kampf_auswahl=="Kämpfen":
            charakter.angreifen()
            monster.leben=monster.leben-charakter.angriffskraft
            charakter.leben=charakter.leben-monster.angriffskraft
            print ("Treffer, das Monster verlor", charakter.angriffskraft, "Leben")
            if monster.leben<=0:
                print ("Es hat alle Leben verloren")
                break
            else:
                print ("Es hat noch", monster.leben, "Leben")
            print ("Sie haben noch", charakter.leben, "Leben")
            charakter.debuggen_angreifen()

            if charakter.leben<=0:
                print("Du bist tot")
                wiederbelebung=easygui.buttonbox("Möchten sie wiederbelebt werden? Eine Wiederbelebung kostet 200 Gold.",
                                             choices=["Ja", "Nein"])
                if wiederbelebung=="Nein":
                    wiederbelebung_nein=esygui.buttonbox("Sind sie sicher? Sie verlieren all Spielstände!!!",
                                                     choices=["Sicher", "Wiederbelebung"])

                    if wiederbelebung_nein=="Sicher":
                        charakter.level=0
                        charakter.gold=0
                        charakter.erfahrung=0
                        charakter.angriffskraft=2
                        charakter.leben=10
                        charakter.skillpunkte=0

                    elif wiederbelebung_nein=="Wiederbelebung":
                        wiederbeleben(charakter)
                    
                elif wiederbelebung=="Ja":
                    wiederbeleben(charakter)
                    return

            
    if monster.leben<=0:
        print ("Der", monster.name, "ist tot. Sie erhielten", monster.beute, "Gold und", monster.erfahrung, "Erfahrungspunkte.")
        charakter.gold=charakter.gold+monster.beute
        charakter.erfahrung=charakter.erfahrung+monster.erfahrung
        monster.leben=alte_monster_leben
        charakter.leben=alte_charakter_leben
        return

def Waffenladen(charakter):
    x=easygui.choicebox("Was für eine Waffe wollen sie kaufen",
                        choices=["Dolch (Kosten:150)", "Kurzschwert (Kosten:350)", "Axt (Kosten:4700)"])
    if x=="Dolch (Kosten:150)":
        Waffenladenverkürzung(charakter, "Dolch", 1, 150)
    elif x=="Kurzschwert (Kosten:350)":
        Waffenladenverkürzung(charakter, "Kurzschwert", 2, 350)
    elif x=="Axt (Kosten:4700)":
        Waffenladenverkürzung(charakter, "Axt", 6, 4700)
    elif x=="Zweihandschwert (Kosten:2000)":
        Waffenladenverkürzung(charakter, "Zweihandschwert", 4, 2000)
        
                        

def Waffenladenverkürzung(charakter, name, angriffskraft, kosten):
    if charakter.gold>kosten:
        charakter.waffe=name
        charakter.waffen_angriffskraft=angriffskraft
        charakter.gold-=kosten
        easygui.msgbox("Kauf erfolgreich")
    else:
        easygui.msgbox("Zu wenig Geld")
        
    
def Abstand():
    for i in range(3):
        print ()

def Ablauf(charakter, q_liste):
    global cheaten
    c1.aktualisiere_Charakter()
    Abstand()
    eingabe=easygui.buttonbox("Was möchten sie tun???",
                              choices=["Charakterdaten", "Kampf", "Quests", "Shop", "Beenden", " "])
    if eingabe=="Charakterdaten":
        Abstand()
        charakter.zeige_Charakterdaten()
        charakter.inventar_anzeigen()
    elif eingabe=="Kampf":
        Abstand()

        if c1.level<=3:
            Kampf(charakter, random.choice(level_1_monster))
        if c1.level<=6:
            Kampf(charakter, random.choice(level_4_monster))
        elif c1.level<=10:
            Kampf(charakter, random.choice(level_10_monster))

    elif eingabe=="Quests":
        try:
            x=random.choice(q_liste)
            x.quest_durchführen(charakter)
            q_liste.remove(x)
        except:
            print ("Keine Quest verfügbar")
    elif eingabe=="Shop":
        geschäft=easygui.buttonbox("Möchten sie Heiltränke oder Waffen kaufen?",
                                   choices=["Heiltränke", "Waffen"])
        if geschäft=="Heiltränke":
            charakter.heiltränke_kaufen()
        elif geschäft=="Waffen":
            Waffenladen(charakter)
        

    elif eingabe=="Beenden":
        try:
            speicher_auswahl=easygui.buttonbox("Wollen sie abspeichern?",
                                                choices=["Ja", "Nein"])
            if speicher_auswahl=="Ja":
                speichern(c1)
                quit("Speichern erfolgreich")
            else:
                quit("Beendet ohne Abzuspeichern")
        except:
            pass

    charakter.neues_Level()
    charakter.skillen()

def speichern(charakter):
    with open("gespeicherte_charakterdaten.pkl", "wb") as datei:
        pickle.dump(charakter, datei)
        datei.close()

def wiederbeleben(charakter):
    charakter.gold-=200
    charakter.erfahrung-=50
   

#Laden
try:
    with open("gespeicherte_charakterdaten.pkl", "rb") as datei:
        c1=pickle.load(datei)

#Neuen Charakter erstellen
except:
    charaktername=easygui.enterbox("Wie soll dein Charakter heißen: ")
    charaktertyp=easygui.buttonbox("Soll dein Charakter ein Schwertkämpfer oder Ork sein",
                                    choices=("Ork", "Schwertkämpfer"))
    if charaktertyp=="Schwertkämpfer":
        c1=Schwertkämpfer(charaktername)
    elif charaktertyp=="Ork":
        c1=Ork(charaktername)

cheaten=False
#Monster
m1=Monster(angriffskraft=3, name="Wolf", beute=100, leben=6, erfahrung=15)
m2=Monster(angriffskraft=4, name="Rohrling", beute=150, leben=5, erfahrung=20)
m3=Monster(angriffskraft=4, name="Braunbär", beute=170, leben=9,erfahrung=30)
m4=Monster(angriffskraft=7, name="Werwolf", beute=200, leben=6, erfahrung=35)
m5=Monster(angriffskraft=3, name="Schildträger", beute=200, leben=20, erfahrung=35)
#Quests
q1=Quest(m1, 1000, 150, 5, "Die Stadt wird von Wölfen angegriffen! Töte 5 Wölfe", False)
q2=Quest(m2, 1000, 170, 3, "Drei Rohrlinge haben dich zum Kampf aufgefordert", False)
q3=Quest(m3, 1400, 180, 2, "Zwei Braunbären treiben ihr Unwesen in den Wäldern. Töte sie", False)


#Listen
quest_liste=[q1, q2]
level_1_monster=[m1, m2]
level_4_monster=[m2, m3, m4]
level_10_monster[m3, m4, m5]


while True:
    Ablauf(c1, quest_liste)
Das Programm ist noch nicht fertig.
Ich möchte noch mehr Quest einfügen.
Leben sollen sich nach einer gewissen Zeit regenerieren und nicht direkt nach dem Kampf wieder voll sein.
Bitte um Anmerkungen, Kritik was besser gemacht werden könnte und eventuell was ich hinzufügen sollte.
Grüße Pythoraner
Zuletzt geändert von Pythoraner123 am Montag 18. Februar 2013, 20:06, insgesamt 12-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Pythoraner123 hat geschrieben:

Code: Alles auswählen

class Ork(Charakter):
    def __init__(self, leben, angriffskraft=3):
        Charakter.__init__(self, charaktername, leben=10, level=1,erfahrung=0, erforderliche_xp=100, gold=500,
                           angriffskraft=2, heiltränke=1, heiltrankskosten=100, skillpunkte=0, ticks=0, v_a=0)

        self.angriffskraft+=1
Ich greife mal nur diese Passage heraus. 12 Parameterwerte einer Funktion sind mir persönlich zu viel und machen die Sache für meinen Geschmack zwar auf den ersten Blick schön flexibel, auf den ersten und alle folgenden Blicke aber auch schön unhandlich. Viele Werte (vielleicht alle, so genau habe ich nicht geschaut) sind übrigens identisch mit den Default-Werten der Basisklasse. Warum übergibst du diese dann überhaupt?

Etwas merkwürdig sind die Parameter von __init__. Du übergibst leben und angriffskraft, verwendest diese Werte aber überhaupt nicht. In der Methode selber setzt du dann den Wert des Instanzattributs angriffskraft auf 2 um ihn dann anschließend um 1 zu erhöhen. Warum setzt du den Wert nicht einfach direkt auf 3? Oder noch besser: warum verwendest du nicht direkt angriffskraft=angriffskraft beim Aufruf der abgeleiteten Methode? Dann würde auch die Übergabe als Parameter wieder sinnvoll sein.
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

Danke für den Tipp /me.
Habs oben verbessert.
gruß pythoraner
BlackJack

Der übliche Hinweis auf den Style Guide for Python Code.

Und

Code: Alles auswählen

class Schwertkämpfer(Charakter):
    def __init__(self, leben=10):
        Charakter.__init__(self, charaktername)
        self.leben+=1
War nicht die Lösung die /me gemeint hat. Das Argument `leben` von der `__init__()`-Methode wird doch hier überhaupt nicht verwendet. Ob da nun 10, oder -42, oder 'Gugelhupf' als Default steht oder ob der Aufrufer irgendetwas übergibt, macht doch genau gar keinen Unterschied.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Pythoraner123,

Du benutzt globale Variablen, was nicht gut ist. Z.B. in quest_durchführen c1.

If-Ketten

Code: Alles auswählen

if eingabe=="a":
    tu_dies()
if eingabe=="b":
    tu_das()
hängt man mit elif aneinander.

Du überschreibst in

Code: Alles auswählen

    with open("gespeicherte_charakterdaten.pkl", "rb") as datei:
        Charakter=pickle.load(datei)
        c1=Charakter
die Klasse Charakter, die danach weg ist. Warum nicht gleich c1=pickle.load(datei)?
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

BlackJack hat geschrieben: War nicht die Lösung die /me gemeint hat. Das Argument `leben` von der `__init__()`-Methode wird doch hier überhaupt nicht verwendet. Ob da nun 10, oder -42, oder 'Gugelhupf' als Default steht oder ob der Aufrufer irgendetwas übergibt, macht doch genau gar keinen Unterschied.
Meinst du das man sich das "=10" sparen soll oder generell "leben" weglassen sollte
Als ich nämlich leben weggelassen habe und nur "self" der __init__ Anweisung übergeben habe bekam ich eine Fehlermeldung

@sirius
Denkfehler
BlackJack

@Pythoraner123: Generell `leben` als Argument weglassen, oder es eben wie von /me vorgeschlagen tatsächlich verwenden. Grundsätzlich kann man das Argument weglassen, ohne das eine Fehlermeldung kommt. Warum sollte man das nicht können?
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

@Black Jack weiß ich auch nicht, aber wenn ich das Attributt weglasse und es so schreibe:

Code: Alles auswählen

class Schwertkämpfer(Charakter):
    def __init__(self):
        Charakter.__init__(self, charaktername)
        self.leben+=1

class Ork(Charakter):
    def __init__(self):
        Charakter.__init__(self, charaktername)

        self.angriffskraft+=1
oder so:

Code: Alles auswählen

class Schwertkämpfer(Charakter):
    def __init__(self):
        Charakter.__init__(self, charaktername, leben)
        self.leben+=1

class Ork(Charakter):
    def __init__(self):
        Charakter.__init__(self, charaktername, angriffskraft)

        self.angriffskraft+=1
kommt folgende Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Python32\Programme\Rollenspiel.py", line 190, in <module>
    c1=Ork(charaktername)
TypeError: __init__() takes exactly 1 positional argument (2 given)
Und wenn ich es so schreibe:

Code: Alles auswählen

class Schwertkämpfer(Charakter):
    def __init__(self, leben=11):
        Charakter.__init__(self, charaktername)
        self.leben=leben

class Ork(Charakter):
    def __init__(self, angriffskraft):
        Charakter.__init__(self, charaktername)
        self.angriffskraft=angriffskraft
Wird der Charaktername für die Angriffskraft bzw. leben übernommen.
Deswegen war dies die einzige Lösung die ich gefunden habe.

PS: Hab den Code so weit wie es geht nochmals verbessert.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Dann mach es doch so.

Code: Alles auswählen

class Ork(Charakter):
    def __init__(self, name, leben, angriffskraft=3):
        Charakter.__init__(self, charaktername=name, leben=leben, angriffskraft=angriffskraft)
So übernimmst du die übergebenen Werte dann auch. Zudem habe ich den zusätzlichen Parameter name eingeführt. Bisher hast du dich da auf die Existenz einer globalen Variable namens charaktername verlassen. Spätestens wenn du anfängst Darstellung, Ein-/Ausgabe und Logik voneinander zu trennen fliegt dir das um die Ohren.

Lass dich nicht durch vielleicht auf den ersten Blick für dich merkwürdige Dinge wie leben=leben verwirren. Das leben vor dem Gleichheitszeichen ist der Name des Keyword-Arguments den du selber in deiner Basisklasse vergeben hast. Das leben nach dem Gleichheitszeichen ist der Bezeichner für die Variable die du in der __init__-Methode verwendest. Bei charaktername=name kannst du die Unterschiede eindeutig sehen.
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

Da kommt bei mir trotzdem eine Fehlermeldung:

Code: Alles auswählen

Syntax Error
non-default argument follows default argument
Außerdem ist im Quelltext

Code: Alles auswählen

class Schwertkämpfer(Charakter):
    def __init__(self, name, leben=11, angriffskraft):
        Charakter.__init__(self, charaktername=name, leben=leben, angriffskraft=angriffskraft)
die Klammer nach der 1. __init__ Anweisung rot markiert

Code: Alles auswählen

def __init__(
Diese
BlackJack

@Pythoraner123: Du solltest Dir dringend mal anschauen wie man Funktionen und ihre Argumente definiert und aufruft. Im ersten Fall beim `Ork` sollte doch wohl klar sein, dass Python nicht weiss was es machen soll wenn kein Argument erwartet wird, Du aber eines übergibst. Vorher war das ja auch schon falsch. Die `Ork.__init__()` hatte ein Argument `angriffskraft`, Du hast da beim Aufruf stattdessen aber einen Charakternamen übergeben. Das ist nur deshalb nicht aufgefallen, weil `angriffskraft` überhaupt nicht verwendet wurde.

Die letzte Fehlermeldung ist auch ziemlich deutlich. In einer Funktionsdefinition dürfen nach Argumenten mit Default-Werten keine mehr kommen die keine Default-Werte mehr haben. Sonst kann man Situationen beim Aufruf bekommen, die nicht mehr eindeutig sind.
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

@Black Jack
Ich hab ja auf den Vorschlag von /me geantwortet, der mir das so vorgeschlagen hat.
Im Code ganz oben funktioniert ja alles. Nur die Antwort von /me hat den Traceback verursacht.
Deswegen habe ich ihn darauf angesprochen.
Oben im Code konnte ich das Problem ja lösen.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Pythoraner123 hat geschrieben:Ich hab ja auf den Vorschlag von /me geantwortet, der mir das so vorgeschlagen hat.
Wenn du noch mal genau schaust - und Softwareentwicklung verlangt Präzision - dann wirst du feststellen, dass mein Codefragment anders aussah.
BlackJack

@Pythoraner123: Das was bei Dir zum Fehler führt hat /me nicht vorgeschlagen. Und im Code ganz oben funktioniert eben nicht alles. Das sagen wir Dir doch die ganze Zeit. Da werden Argumente übergeben die nirgends genutzt werden. Teilweise waren das Werte die überhaupt nicht zum Namen und damit der Bedeutung des Parameters passen. Das „funktioniert” nur deshalb, weil diese Werte überhaupt nicht benutzt werden. Was ich für einen Fehler halte. Denn entweder sollten die benutzt werden, oder wenn sie nicht benutzt werden, dann sollte man sie auch nicht übergeben. Das wäre dann ja komplett sinnfrei. Auf jeden Fall zeigt das auf, dass Du das alles noch nicht verstanden hast.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ich versuche das mal mit einem handlichen Beispiel zu erklären.

Bitte nicht davon irritieren lassen, dass ich für den Aufruf der Basisfunktionen super() statt die von dir bisher verwendete Syntax verwendet habe. Zudem habe ich ein Instanzattribut extra energy und nicht hitpoints genannt um an manchen Stellen den Unterschied deutlicher herauszustellen.

Code: Alles auswählen

class Character(object):
    def __init__(self, name, hitpoints=10):
        self.name = name
        self.energy = hitpoints

class Adventurer(Character):
    def __init__(self, name):
        super(Adventurer, self).__init__(name)
        # Character.__init__(name)

class Warrior(Character):
    def __init__(self, name):
        super(Warrior, self).__init__(name, hitpoints=20)


person = Adventurer('Alrik')
print(person.name)
print(person.energy)

fighter = Warrior('Conan')
print(fighter.name)
print(fighter.energy)
Zuerst wird die Klasse Charakter definiert. Wenn man eine Instanz dieser Klasse erstellt muss man den Namen des Charakters angeben. Die hitpoints kann man angeben, muss es aber nicht. Lässt man sie weg, so werden sie automatisch mit dem Wert 10 angenommen. In der Instanz werden diese Werte in die Attribute name und energy übergeben.

Die Klasse Adventurer ist von Charakter abgeleitet. Hier kann man die hitpoints nicht mehr bei der Erstellung übergeben. Beim Aufruf der __init__-Methode der Basisklasse wird dann nur der Name übergeben, die hitpoints sind damit automatisch auf 10.

Auch der Warrior ist von Charakter abgeleitet. Auch hier kann man die hitpoints nicht mehr bei der Erstellung der Instanz angeben. Beim Aufruf der __init__-Methode der Basisklasse wird dann allerdings nicht nur der Name übergeben, sondern auch für die hitpoints ein Wert von 20.


Du hattest jetzt aber ein Konstrukt, das etwa dem folgenden Code entsprach.

Code: Alles auswählen

class Orc(Character):
    def __init__(self, name, hitpoints=20):
        super(Orc, self).__init__(name, hitpoints=10)
        self.energy += 10
Was passiert hier? Die hitpoints die du bei der Erstellung der Instanz angibst werden nirgendwo verwendet. Gibst du einen Wert von 30 an, so macht das keinen Unterschied im Ergebnis, da du fix einen Wert von 10 setzt und diesen dann um 10 erhöhst.


Wenn du flexible Hitpoints bei der Instanzerstellung möchtest, dann solltest du sie auch verwenden.

Code: Alles auswählen

class Shadow(Character):
    def __init__(self, name, hitpoints=15):
        super(Shadow, self).__init__(name, hitpoints=hitpoints)
Bei der Übergabe von Argumenten ist zwingend die Reihenfolge einzuhalten. Erst kommen Positionsargumente, dann Keywordargumente. Folgender Code geht daher nicht und wird dir beim Ausführen eine Fehlermeldung geben.

Code: Alles auswählen

class EvilSorcerer(Character):
    def __init__(self, name):
        super(EvilSorcerer, self).__init__(hitpoints=100, name)
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

Wenn das oben jetzt richtig ist, dann habe ich es verstanden.
Danke für die Hilfe
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

Hallo nochmal,
hab das Programm nochmal verbessert(Waffen, Shop, kleines Kampfupdate).
Freue mich auf Lob, Kritik usw.
Gruß Pythoraner
Benutzeravatar
kevind
User
Beiträge: 71
Registriert: Montag 22. Oktober 2012, 20:23
Wohnort: /dev/null

Hoi,

ich bin selber Anfänger und arbeite lustigerweise an einem ähnlichem Projekt :)

Habe mir gestern den PEP 8 Style Guide etwas angeschaut und mir ist aufgefallen: (Bitte korrigiert mich falls ich etwas falsches sage)

Deine Namensgebungen sind teilweise etwas ungenau. (m1, m2, m3, q1, q2, q3) So etwas soll man vermeiden.
Hier handelt es sich scheinbar um eine "Aufzählung", du könntest eine Liste verwenden.

Achte auf gross/kleinschreibung in Variablen/Funktionen usw.

Code: Alles auswählen

 def anzeigen_Inventar(self):
laut Style Guide wäre es:

Code: Alles auswählen

def anzeigen_inventar(self):
Achte auf ein Leerzeichen vor und nach den Operatoren:
zb.

Code: Alles auswählen

if monster.leben<=0:

Ich selbst finde das etwas viele Statische if/elif/else Anweisungen vorhanden sind. Stelle es mir etwas unhandlich vor wenn das Game mehr Inhalt bekommt das alles zu verwalten.


Greetz, Kev
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Pythoraner123 hat geschrieben:Hallo nochmal,
hab das Programm nochmal verbessert(Waffen, Shop, kleines Kampfupdate).
Es wäre sinnvoller, wenn Du das ganze in ein Pastebin auslagerst, wie etwa gist.github.com. Damit kann man auch Versionen verwalten, sprich ein gepostetes Gist nach und nach verändern.

Wenn Du immer den Code im Original-Posting änderst, dann wird es später schwer den Thread noch nachzuvollziehen, da sich viele Postings ja auf eben diesen ursprünglichen Code beziehen.

Generell ist das Forum hier auch nicht für lange Quelltexte ausgelegt. Als Faustregel würde ich sagen, dass man bei mehr als 30 Zeilen darüber nachdenken sollte, den Code auszulagern. Wir haben auch ein Forum eigenes Pastebin fällt mir gerade ein - das nutzen aber wenige würd ich aus dem Bauch heraus mal sagen.

@kevind: Also ich wäre ja für ``inventar_anzeigen()`` ;-) (Außer man spricht Deutsch wie Joda, dann wäre ``anzeigen_inventar_du_musst()`` schon die erste Wahl :mrgreen: )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
snafu
User
Beiträge: 6744
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich wäre eher für den Imperativ. Also etwas wie `zeige_inventar()` oder `gib_inventar()`.
Antworten