Problem in etwas größerem Skript

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
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

Hallo,

ich habe ein Problem in einem etwas größerem Skript.

Der Code ist hier zu Downloaden:

http://sourceforge.net/projects/midkasim

Das Problem:

Wenn man mit app.py das Skript startet, und zwei kämpfer hinzufügt, dann auf Starten klickt, erhalte ich folgenden Fehler:

***** Kampfrunde: 1 ***** Kaempfer: 2 *******
Moegliche Ziele fuer 2 sind asg
Moegliche Ziele fuer asg sind 2
: 2 attakiert 2
Traceback (most recent call last):
File "C:\Dokumente und Einstellungen\Bamba\Desktop\MidKaSim\wx_gui\midkasim.py", line 98, in Starten
kampf.start()
File "../lib\Kampf.py", line 37, in start
self.Angriff(a,v)
File "../lib\Kampf.py", line 76, in Angriff
angriff = a.Angriff+W(20)
TypeError: cannot concatenate 'str' and 'int' objects

Den Fehler finde ich leider nicht.

Kann mir da jemand von euch weiterhelfen?

Danke!

Bamba
Bamba
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi,

etwas größeres Skript? Das ist ja schon fast eine ausgewachsene Anwendung ;-).

Allerdings sieht der Code wie Kraut & Rüben aus, wie man bei mir zu Hause sagt, also ziemlich durcheinandern (* Importe, so daß man Schwierigkeiten hat zu finden, was jetzt wo definiert ist; manche Dinge selber implementiert anstatt die Pythonmodule zu benutzen (schau Dir z. B. für W() mal die randint-Funktion an); etc.).

Beim Initialisieren der Gegener generierst Du eine Meldung(in Kampf.zielfinder()):
"Moegliche Ziele fuer 2 sind asg
Moegliche Ziele fuer asg sind 2 "
D. h. hier wird schon deutlich einer ist ein String, der andere ein Integer. Den +-Operator hast Du dafür nicht definiert, ergo: Das funktionuckelt nicht.

Ich mag mich nicht weiter mit dem Chaos beschäftigen. Am besten Du räumst bei der Fehlersuche auch etwas auf - dann wird es einfacher weitere Bugs zu finden.

Tut mir leid, ich möchte nicht so grausam klingen wie ich es jetzt tue, aber trotzdem deutlich sein. Viel Erfolg.

Gruß,
Christian
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

Hmm,

gut, ich werde das mal ein bisschen aufräumen. Könntet mir nur jemand mal GENAU sagen, was genau ich alles ändern sollte? Ich habe mich an diesen Programmierstil gewöhnt und mir fällt es daher schwer etwas in diesem Code zu finden, was wie "Kraut und Rüben" sein soll;-)

Bei einer Sache muss ich CM allerdings nicht Recht geben. Die Namen der von mir definierten Kämpfer "2, und asg" sind willkürlich und nur schnell eingetippt (gehakkt). Würde ich beide zu strs oder ints machen, würde das nichts an der Fehlermeldung ändern.

Dieser Grund ist also falsch. Ich suche noch immer nach der Fehlerquelle. Bitte helft mir.

Bamba
Bamba
BlackJack

Ganz offensichtlich ist `a.Angriff` eine Zeichenkette. Jetzt musst Du nur noch zurückverfolgen warum das so ist. Wo wird das Attribut gesetzt? Nur mal so geraten: Kann es sein das der Wert über eine GUI in das Programm kommt und Du einfach nur vergessen hast aus der Zeichenkette eine Zahl zu machen?

Es scheint auch noch ein logisches Problem zu geben: Der Ausgabe nach, greift sich der Kämpfer selbst an. :-)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi Bamba,

PEP 8 wäre für Dich nicht nur etwas zum Aufhübschen des Codes, sondern würde Dein Augenmerk auch auf ein paar Schwachstellen lenken.

Weitere Kritikpunkte (zum Teil schon genannt):
- "import *" führt dazu, daß für Neueinsteiger in das Projekt - und auch für uns, die wir herausfinden sollen, wo ggf. ein Fehler liegt - es schwierig wird herauszufinden, welche Klasse woher kommt
- Zum Teil sind die Funktionen zu lang. Mancher Code ließe sich effizienter schreiben, insbesondere dadurch, daß Du Pythonmodule zur Problemlösung nutzen solltest. Diese sind in der Regel auch schneller als Nachbildungen in reinem Python.

Dies sind zumindest mal Punkte, wo Du anfangen könntest. Der Rest erschließt sich Dir schon nach und nach.

Gruß,
Christian
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

Ok, vielen Dank. Werde ich machen.

Zu W():

Diese Funktion ist NOTWENDIG! Sie wird nötig um die MAGUS XML nachher zu integrieren.

Das erste was ich jetzt mache ist auf jeden Fall die from x import * auszumerzen - grauenhaft (;-))

Bamba
Bamba
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Code: Alles auswählen

def W(i):
    return random.randint(1, i)
Ich habe nicht geschrieben, daß Du sie streichen sollst ;-)
Bamba
User
Beiträge: 62
Registriert: Dienstag 31. Oktober 2006, 08:48

Schon klar, aber du sagtest mir, dass ich mir die randint Funktion anschauen solle, da diese genau das gleiche wie W() erledigt ;-)

Bamba
Bamba
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Hoi Bamba,

habe ich nicht geschrieben, stattdessen:
CM hat geschrieben:(schau Dir z. B. für W() mal die randint-Funktion an)
Deine bisherige Funktion ist langsam, weil Du einen zusätzlichen Funtionsaufruf ( int() ) und eine Rechnung drin hast.
In Deinem Code ließen sich noch mehrere solcher Beispiele finden ;-).

Gruß,
Christian
Antworten