Mehrere Charakter erstellen

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
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

Hallo,
ich versuche ein Rollenspiel zu programmieren.
Leider hab ich ein Problem, wenn ich mehrere Charakter erstellen möchte.

Code: Alles auswählen

def neuercharacter():
    global charaktername, ctyp
    charaktername=input("Wie soll der Charakter     heißen")
    ctyp=input("1 für Schwertkämpfer, 2 für Ork")
Jetzt hab ich keine andere Möglichkeit gefunden als im Hauptprogramm zu schreiben:

Code: Alles auswählen

if ctyp="1":
    c1=Schwertkämpfer(charaktername)
So ist es aber nur möglich einen Charakter herzustellen.
Wie schafft man mehrere?
Danke schon mal im Voraus.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

1. Vergiss, das global existiert. Benutze Funktionen und Rückgabewerte.

2. Erstelle Listen von Objekten, wenn du mehr als eine Instanz einer Klasse erstellen möchtest. Das geht mit der eingebauten Funktion map, mit einer List-Comprehension oder "per hand" indem du zuerst eine leere Liste erstellst und sie dann in einer for-Schleife mit der Methode append mit Werten füllst.
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

Könntest du mir ein Besipiel machen?
Bin noch nicht so lange bei Phyton dabei.
Den Rest des Programms hab ich objektorientiert geschrieben, nur bei den Charaktern hab ich Probleme
Danke
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Pythoraner123,

das was Du schreibst ist kein Python (z.B. = statt == bei Vergleichen).
Ich würde Dir, bevor Du Dich an komplizierte Rollenspiele
heranwagst ein Einsteiger-Tutorial empfehlen.
Dort lernst Du dann auch was Listen sind.
Achte vor allen darauf, die Eingaben von der eigentlichen Programmlogik sauber zu trennen.

Hier nur mal ein kleiner Anfang:

Code: Alles auswählen

class AllgemeinerCharakter:
    def __init__(self, charaktername):
        self.charaktername = charaktername

    # noch mehr allgemeine Eigenschaften

class Ork(AllgemeinerCharakter):
    AnzeigeName = 'Ork'

class Schwertkaempfer(AllgemeinerCharakter):
    AnzeigeName = 'Schwertkämpfer'

class CharakterFabrik:
    def __init__(self, *prototypen):
        self.prototypen = list(prototypen)

    def neuer_charakter(self, charaktername, ctyp):
        return self.prototypen[int(ctyp)-1](charaktername)

    def get_inputfields(self):
        return ["Wie soll der Charakter heißen?",
            ', '.join('{} für {}'.format(nr+1, prototyp.AnzeigeName) for nr, prototyp in enumerate(self.prototypen))
        ]

charakter_fabrik = CharakterFabrik(Schwertkaempfer, Ork)

charaktere = []
print("Gib 3 Charaktere ein!")
for num in range(3):
    args = []
    for text in charakter_fabrik.get_inputfields():
        args.append(input(text))
    charaktere.append(charakter_fabrik.neuer_charakter(*args))
Grüße
Sirius
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Pythoraner123 hat geschrieben:Könntest du mir ein Besipiel machen?
Ja, kann ich (für Python3 geschrieben; weil du Umlaute in deinen Namen verwendest, habe ich angenommen, dass du Python3 benutzt):

Code: Alles auswählen

>>> class Schwertkämpfer:
...     def __init__(self, charaktername):
...         self.charaktername = charaktername
...     def __repr__(self):
...         return '{}({!r})'.format(self.__class__.__name__, self.charaktername)
... 
>>> # möglichkeit 1: mit der Funktion map
... 
>>> list(map(Schwertkämpfer, ["Grombor", "Jöörk", "Oxgär"]))
[Schwertkämpfer('Grombor'), Schwertkämpfer('Jöörk'), Schwertkämpfer('Oxgär')]
>>> # Möglichkeit 2: mit einer List-Comprehension
... 
>>> [Schwertkämpfer(name) for name in ["Grombor", "Jöörk", "Oxgär"]]
[Schwertkämpfer('Grombor'), Schwertkämpfer('Jöörk'), Schwertkämpfer('Oxgär')]
>>> # Möglichkeit 3: manuell mit einer for-Schleife und der Methode append
... 
>>> kämpfer = []
>>> for name in ["Grombor", "Jöörk", "Oxgär"]:
...     kämpfer.append(Schwertkämpfer(name))
... 
>>> kämpfer
[Schwertkämpfer('Grombor'), Schwertkämpfer('Jöörk'), Schwertkämpfer('Oxgär')]
Pythoraner123
User
Beiträge: 23
Registriert: Dienstag 25. Dezember 2012, 16:43

Entschuldigung erstmal wegen dem "=" statt dem "==" beim Vergleich.
Flüchtigkeitsfehler.

Code: Alles auswählen

#Rollenspiel

import random

#Charakter
class Charakter:  #Standard des Charakters
    def __init__(self, charaktername, level=1, erfahrung=0, erforderliche_xp=100, gold=500, heiltränke=1, heiltrankskosten=100):
        self.name=charaktername
        self.level=level
        self.erfahrung=erfahrung
        self.erforderliche_xp=erforderliche_xp
        self.gold=gold
        self.heiltränke=heiltränke
        self.heiltrankskosten=heiltrankskosten

    def anzeigen_Inventar(self):
        print ("Gold:", self.gold)
        print ("Heiltränke:", self.heiltränke)

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

    def kaufen_Inventar(self, anzahl_gekaufter_heiltränke):
        self.gold-=heiltrankskosten*anzahl_gekaufter_heiltränke
        
    def angreifen(self):
        return True

    def zeige_Charakterdaten(self):
        print (self.name, "ist auf Level", self.level)

    def neues_Level(self):
        if self.erfahrung>=self.erforderliche_anzahl_xp:
            self.level+=1
            self.erfahrung=0
            self.erforderliche_anzahl_xp=self.erforderliche_xp*1.5+self.level*100
        

class Schwertkämpfer(Charakter):
    def __init__(self, leben=10, rüstung=10, angriffskraft=2):
        Charakter.__init__(self, charaktername,level=1, erfahrung=0)
        self.leben=leben
        self.rüstung=rüstung
        self.angriffskraft=angriffskraft

    def angreifen(self):
        #Trefferwahrscheinlichkeit
        self.treffer=random.choice([True, True, True, True, True, True, True, True, True, False])
        return self.treffer

    def zeige_Charakterdaten(self):
        Charakter.zeige_Charakterdaten(self)
        print ("Angriffskraft:", self.angriffskraft)

class Ork(Charakter):
    def __init__(self, leben=10, rüstung=5,angriffskraft=3):
        Charakter.__init__(self, charaktername,level=1,erfahrung=0)
        self.leben=leben
        self.rüstung=rüstung
        self.angriffskraft=angriffskraft

    def angreifen(self):
        self.treffer=random.choice([True, True, True, True, False])
        return self.treffer

    def zeige_Charakterdaten(self):
        Charakter.zeige_Charakterdaten(self)
        print ("Angriffskraft:", self.angriffskraft)
Jetzt wollte ich eine Funktion programmieren, die den Benutzer am Anfang fragt wie der Charakter heißen soll und ob er den Typ Schwertkämpfer oder Ork wählen möchte.

Code: Alles auswählen

def neuer_charakter():
    charaktername=input()
    charakter_typ=input("1 für Ork, 2 für Schwertkämpfer")
Aber wie schaffe ich es dann diese Funktionen ins Programm einzubinden. Ja klar

Code: Alles auswählen

charakter1=Schwertkämpfer(charaktername)
Aber wie schaffe ich es dass der Benutzer einen weiteren Charakter zu erstellen auf den ich dann wie im ersten sozum Beispiel zugreifen kann.

Code: Alles auswählen

charakter1.angreifen()
Antworten