Seite 1 von 1

Mehrere Charakter erstellen

Verfasst: Sonntag 6. Januar 2013, 14:40
von Pythoraner123
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.

Re: Mehrere Charakter erstellen

Verfasst: Sonntag 6. Januar 2013, 14:43
von derdon
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.

Re: Mehrere Charakter erstellen

Verfasst: Sonntag 6. Januar 2013, 15:07
von Pythoraner123
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

Re: Mehrere Charakter erstellen

Verfasst: Sonntag 6. Januar 2013, 15:19
von Sirius3
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

Re: Mehrere Charakter erstellen

Verfasst: Sonntag 6. Januar 2013, 16:58
von derdon
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')]

Re: Mehrere Charakter erstellen

Verfasst: Sonntag 6. Januar 2013, 20:34
von Pythoraner123
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()