RPG Spiel(2D) - Level ups, Skills, jobs, Kaepfe und mehr!

Du hast eine Idee für ein Projekt?
Antworten
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Lionhard hat geschrieben://Sorry ich weiss nicht wie ich das 'Euer können' mit einem Wort ausdrucken kann, ich bin aus Tschechien, ich spreche nur Deutsch
Du sucht "Fähigkeiten".

Ansonsten willst du vielleicht noch einen Link angeben, wo man das bereits geschaffene einsehen kann?
Krabman318
User
Beiträge: 21
Registriert: Sonntag 14. August 2011, 14:36

Könntest du uns den Teil vom Quelltext zeigen, in dem der Error auftritt?
BlackJack

@Lionhard: Wenn irgend wo in einer Funktion oder in einer Methode einem Namen ein Wert zugewiesen wird, dann ist es für Python ein lokaler Name. Du hast da ein ``coins -= 80`` stehen, aber dem Namen `coins` wird davor im Programmfluss nirgends ein Wert zugewiesen. Von etwas Unbekanntem kann man nicht 80 abziehen.

`coins` scheint auf Modulebene zu existieren also könnte man das theoretisch mit ``global`` lösen. Nur sollte man ``global`` vermeiden, da dass zu unübersichtlichen und fehleranfälligen Programmen führt bei denen man schlecht bis gar nicht einzelne Funktionen isoliert testen oder zur Fehlersuche ausprobieren kann. Auf Modulebene sollten in der Regel nur Definitionen von Konstanten stehen. Also importierte Namen, Definitionen von Funktionen und Klassen, und Werte die sich nicht ändern.

Der Quelltext sieht sehr unflexibel aus wenn da für jede Stadt, jedes Geschäft, jedes Produkt extra Code geschrieben werden muss. Das sind alles Sachen die man generischer über Datenstrukturen lösen sollte, statt die Daten in statischen Code zu verstecken. Und das auch noch extrem redundant. Preis, benötigte Stärke, und Schadenspunkte für das Schwert kommen da *viel* zu oft in Code und Daten vor.
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

BlackJack hat geschrieben:Der Quelltext sieht sehr unflexibel aus wenn da für jede Stadt, jedes Geschäft, jedes Produkt extra Code geschrieben werden muss. Das sind alles Sachen die man generischer über Datenstrukturen lösen sollte, statt die Daten in statischen Code zu verstecken. Und das auch noch extrem redundant. Preis, benötigte Stärke, und Schadenspunkte für das Schwert kommen da *viel* zu oft in Code und Daten vor.
Klingt so als müsste er Objektorientierung mit Python erlernen. Wobei, zugegebenerweise ist das schon allein dann Pflicht wenn man gut von mehreren Leuten verbesserbaren Code erstellen will.

@Lionhard: Überhaupt, mir fehlt noch ein konkretes Konzept, so sieht es mehr danach aus als wolltest du das ultimative RPG erschaffen ohne wirklich zu wissen was dir an den vorherigen nicht ausreicht. "[…] ein eigenes Spiel […] wo ich solche Sachen wie wenig Skills, kleines oder zu großes Inventory usw. vermeiden kann." ist schon sehr schwammig ausgedrückt, findest du nicht auch?
BlackJack

@Lionhard: „Hauptsache es klappt“ hat nichts mit Programmieren zu tun. Aufräumen kann man den Quelltext IMHO auch nicht — den muss man schon von Grund auf neu schreiben. Es sind ja keine kleinen Änderungen sondern das grunsätzliche Konzept.

Wo auch immer ``global coins`` steht, in `on_btnDaerion_mouseClick()` steht es jedenfalls nicht. Und dort wird dem lokalen Namen `coins` nichts zugewiesen bevor ``coins -= 80`` ausgeführt wird. Letztlich sollte *nirgends* ``global coins`` stehen. Wenn man das sauber lösen will, dann müsste man das objektorientiert angehen.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Deshalb spricht BlackJack von Objekt-Orientiert
the more they change the more they stay the same
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Erlerne Objektorientierung, dann gucken wir weiter. In der Form wird das nichts mit dem Spiel.
Krabman318
User
Beiträge: 21
Registriert: Sonntag 14. August 2011, 14:36

Lionhard hat geschrieben:omg koennt ihr mir einfach nicht den richtigen Code schicken? :roll: :lol:

Code: Alles auswählen

class item():
    def __init__(self, value = 0):
        self.value = value

class player():
    def __init__(self, coins = 0, inventory = []):
        self.coins = coins
        self.inventory = []
    def buy(self, item):
        if self.coins >= item.value:
            self.coins -= item.value
            self.inventory.append(item)
        else:
            print("Insufficient funds!")
Das hier ist doch schonmal ein Anfang.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

PEP-8 konform:

Code: Alles auswählen

class Item():
    def __init__(self, value=0):
        self.value = value

class Player():
    def __init__(self, coins=0, inventory=None):
        self.coins = coins
        if inventory is None:
            self.inventory = []
    def buy(self, item):
        if self.coins >= item.value:
            self.coins -= item.value
            self.inventory.append(item)
        else:
            print("Insufficient funds!")
PS: "def __init__(self, coins=0, inventory=[]):" ist keine so gute Idee:

Code: Alles auswählen

In [1]: def foo(a, x=[]):
   ...:     x.append(a)
   ...:     return x
   ...: 

In [2]: foo(1)
Out[2]: [1]

In [3]: foo(2)
Out[3]: [1, 2]

In [4]: foo(3)
Out[4]: [1, 2, 3]
the more they change the more they stay the same
webspider
User
Beiträge: 485
Registriert: Sonntag 19. Juni 2011, 13:41

Das löst dein Problem nicht wirklich. Erlerne wie gesagt Objektorientierung und überleg mal in welche Richtung es genau gehen soll, dann könntest du Mitstreiter finden.
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Lionhard hat geschrieben:Wieso sollte das nicht mein Problaem loesen? wen man die Variable ¨coins' 0 ist und man in einer der Definition global coins schreibt, dan geht alles und was genau heisst dieses Objekt orientierung... heisst das ich soll einfach nur so programmieren damit man sich im Code besser auskennt?
Die Verwendung von global führt zu großen und unpraktischen Abhängigkeiten im Code.
Benutzeravatar
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

Also ein Anfang wäre mal: http://www.google.de/

oder vllt. hier:
http://net.tutsplus.com/tutorials/pytho ... ogramming/

Zum besseren Verständnis der Objektorientierten Programmierung fällt mir noch das Stichwort "EOS" ein, mit Verweis auf den ersten Link :wink: Ein kleines nettes Programm...

Ich hoffe das hilft dir in irgend einer Weise

mfg

EDIT/:whooops, das "Topic" ist ja mal voll "out of date" :roll: Naja, kann ja nicht schaden...
Zuletzt geändert von HarteWare am Sonntag 24. Februar 2013, 13:26, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

HarteWare hat geschrieben: EDIT/:whooops, das "Topic" ist ja mal voll "out of date" :roll: Naja, kann ja nicht schaden...
Doch, kann es... dieser "python-kurs.eu"-Link ist dafür ein Beispiel. Dieser ist schlicht und ergreifend an vielen Stellen *falsch*. Zugriffsschutz gibt es in Python de facto nicht - es gibt sehr wohl Konventionen, aber aus dem Artikel wird das nicht deutlich; zumal, wenn dort von "private" gesprochen wird. Und das Elend mit den "Destruktoren" kennen wir ja schon hinlänglich aus dem Galileo Open Book :roll: Ich meine mich zu erinneren, dass es da noch einige andere "Hämmer" gab, habe jetzt aber keine Lust das wieder durchzugucken.

Fazit: Finger weg von diesem Tutorial!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hyperion hat geschrieben:Fazit: Finger weg von diesem Tutorial!
*unterschreib*
Benutzeravatar
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

Vielen dank für den Hinweis, ich werds sofort entfernen.

mfg
Benutzeravatar
bwbg
User
Beiträge: 407
Registriert: Mittwoch 23. Januar 2008, 13:35

Den verbliebenen Link (tutsplus.com) kann ich auch nicht empfehlen. Ich habe die Seite nur überflogen, bekomme aber von den Erklärungen zu Instanzen und deren Attributzugriff (dort properties genannt) einen Würgereiz:

Der Autor weist dem Klassenobjekt ein Attribut zu und vermittelt die Auffassung, dessen Instanzen besitzen nun dieses Attribut. Das ist schlichtweg falsch und bildet dabei den Kern des Artikels.

Grüße ... bwbg
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten