Objekten mit gleichem Namen verschiedene Werte übergeben

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
Isen
User
Beiträge: 3
Registriert: Dienstag 29. Oktober 2019, 18:50

Hallo zusammen, ich versuche mir gerade Python beizubringen und hab mir als Übung ein kleines Spiel ausgedacht. Es soll ein Brettspiel werden, also brauche ich für die Züge Kollisionsabfragen für die Felder (glaube ich^^)

Nun habe ich mir ein paar Schleifen geschrieben um ein Objekt für jedes Feld zu erstellen. Das Problem ist, das ich jedem Feld eine ID geben möchte, aber nicht für jedes einzelne Feld einen neuen Namen bestimmen möchte. Ist es möglich die ID einem bestimmten Objekt zu übergeben?

Ich benutze TigerJython, welches mit gamegrid und einigen(wie ich gelesen habe nicht standart) Funktionen vorgefertigt installiert wird.

Hier noch das ganze in der Praxis zum besseren Verständnis. Ich möchte keine rundum Aufbesserung meiner Fehler.
aber ein Lösungsansatz falls es geht wäre wirklich Hilfreich. Vielen Dank im Voraus.


v = 1 #Variable für ID(Vertikal) der Felder
x = 150 #Variable für xPosition(Pixel) der Felder
repeat 6: #Schleife für die ersten 6 Reihen
y = -245 #Variable für yPosition(Pixel) der Felder
h = 1 #Variable für ID(Horizontal) der Felder
repeat 7: #Schleife für die 7 Felder der Reihen 1, 3, 5
feld.addActor(objBox, y,x)
objBox.IDVerti = v
objBox.IDHori = h
y += 105 #Abstand zwischen Mitte zweier Felder
h += 1
x += 50 #Abstand zwischen zwei Reihen
v += 1
y = -199
h = 1
repeat 6: #Schleife für die 6 Felder der Reihen 2, 4, 6
feld.addActor(objBox, y,x)
objBox.IDVerti = v
objBox.IDHori = h
y += 105
x += 50
v += 1
repeat 7: #Schleife für die 7 Felder der letzten Reihe
feld.addActor(objBox, y,x)
objBox.IDVerti = v
objBox.IDHori = h
y += 105
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Isen: Du versuchst da gerade TigerJython zu lernen. Python hat weder ein ``repeat``-Schlüsselwort, noch irgendwie magisch existierende `feld`- und `objBox`-Objekte.

Die Namensschreibweisen weichen auch von den Python-Konventionen ab. Das scheint mehr in Richtung Java zu gehen.

Ansonsten solltest Du bei Namen keine Abkürzungen verwenden. `x` und `y` für Koordinaten ist okay, aber ansonsten sind Einbuchstabige Namen in der Regel keine guten Namen. `v` und `h` sollten sinnvolle, ausgeschriebene Bezeichner sein. Und auch `IDVerti` und `IDHori` sind nicht gut. Wenn man `vertical_id` und `horizontal_id` meint, sollte man das auch genau so schreiben. Gegebenfalls in der Schreibweise wie bei Java, wenn man auf Python nicht so viel Wert legt, aber nicht so komisch abkürzen.

`objBox` ist auch komisch. Was soll das `obj` dem Leser sagen? Das es ein Objekt ist? In Python ist *alles* ein Objekt was man an einen Namen binden kann. Nach der Logik könnte/müsste man, wenn man konsequent ist, auch `objX`, `objY`, `objV`, `objFeld`, und so weiter schreiben. Nur dass das dem Leser keinen Mehrwert bringt — bei *keinem* Namen.

Der Code ist auch voller ”magischer” Zahlen, die man an einen sinnvollen Namen binden sollte. Zum Beispiel die Schrittweiten 50 und 105. Wenn man dafür sprechende Bezeichner verwendet, muss man diese Zahlen nicht mit einem Kommentar erklären.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Isen
User
Beiträge: 3
Registriert: Dienstag 29. Oktober 2019, 18:50

Das "repeat" und "feld" ist wie ich erwähnt habe eine der Funktionen welche in TigerJython benutzt werden können aber nicht zum Standart gehören.
das obj- vor den Namen benutze ich für mein eigenes Verständnis, es weicht zugegebenermaßen von der Konvention ab, aber hilft mir bei der Orientierung.

Ich erkenne die gute Intention und danke für die Hilfe, aber das beantwortet meine Frage nicht. Die Fehler die ich hier drinnen habe (ich bin sicher es sind einige) möchte ich selbst erkennen und verbessern um zu lernen.
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Isen hat geschrieben: Mittwoch 30. Oktober 2019, 15:25das obj- vor den Namen benutze ich für mein eigenes Verständnis, es weicht zugegebenermaßen von der Konvention ab, aber hilft mir bei der Orientierung.
Da hast du völlig recht. Wenn ich mich irgendwo verfahren habe und mich nicht mehr auskenne, denke ich auch: "Ich bin doch an diesem Ding-Haus schonmal vorbeigekommen und an diesem Ding-Baum. Ist das wirklich die Ding-Straße, auf der ich mit meinem Ding-Auto vorhin gefahren bin? Oder war es eine andere Ding-Straße?" Klar, vor jedes Nomen ein "Ding-" anzuhängen, analog zu deinem "obj", ist tatsächlich eine supersuper Hilfe. Wenn das jeder machen würde, wäre Programmieren auf einmal ganzganz einfach. Aber freilich.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Isen: `feld` kommt ja eher nicht von TigerJython und bis auf ganz wenige Namen kommt da auch nichts auf magische in den Modulnamensraum sondern braucht ein ``import``. Du hast da also etwas gezeigt was so auch in TigerJython nicht lauffähig ist.

Bei `feld` kann man ja noch raten das es sich um ein Objekt des Typs `GameGrid` handelt, aber was `objBox` ist — das dürfte eine selbst geschriebene Klasse sein‽

Der Leser hier, also zumindest ich, hat damit nicht wirklich viel an der Hand um zu verstehen was der Code da überhaupt machen soll, und wo sich das was passiert, von dem unterscheidet was eigentlich passieren soll.

Ohne TigerJython kann man das auch nicht wirklich nachvollziehen. Da müsste man sich dann mit einer Sprache beschäftigen die von Python 2.7 abgeleitet wurde, in einer sehr eingeschränkten IDE, und in einer extrem javaesquen Umgebung. Das ist kein Python. Durch mindestens ein neues Schlüsselwort syntaktisch nicht, von der ganzen Schreibweise der Namen her nicht, und idiomatisches Python scheint das Leerbuch dazu auch nicht zu verwenden.

Ich vermute mal das `addActor()` das übergebene Objekt nicht klont, Du da also immer wieder den *selben* `Actor` hinzufügst, was sehr wahrscheinlich falsch ist, denn mindestens die Zuweisungen an die beiden Attribute auf diesem Objekt haben letztendlich ja nur den Effekt das die *letzten* Werte am Ende gesetzt sind. Sofern das keine Properties sind, die irgendetwas überraschendes machen. Dann sollte man *das* dringend ändern.

``repeat`` ist hier das falsche Mittel, denn mit ``for``-Schleifen und `range()`/`xrange()` kann man sich eine Menge an manuell verwalteten Variablenwerten sparen, was den Code kürzer und leichter verständlich macht, weil man an der ``for``-Zeile bereits sieht nach welchem Muster die Laufvariable Werte annimmt.

Wie schon gesagt sind da schreckliche Namen und magische Zahlen die jeweils gute Namen verpasst bekommen sollten. Dann braucht man auch weniger Kommentare — da sind nämlich auch überflüssige dabei. Kommentare die Namen erklären braucht man nämlich nicht wenn der Name selbsterklärend wäre.

Ich hätte ja vermutet das man die Schleifen über die IDs (`h`, `v`) laufen lassen kann und die Positionen (`x`, `y`) dann daraus berechnen lassen kann, aber die IDs werden sehr unregelmässig aktualisiert — soll das so sein das die ID in den Schleifen zum Ende hin immer weniger variieren, bis hin zu *gar nicht* in der letzten Schleife?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Isen
User
Beiträge: 3
Registriert: Dienstag 29. Oktober 2019, 18:50

ja, ich habe in den Schleifen einen Fehler in den IDs gefunden. Das andere soll so sein. Ich habe die Beschreibung ein bisschen kurz gehalten weil ich dachte besser nicht zu sehr darauf einzugehen, würde das was ich wirklich wissen will eingrenzen und ich würde die Antwort eher bekommen. Ich denke wenn man das Feld mit der Schleife sieht denkt man erst an ein Schachbrett. Ich will aber Hexagonal angeordnete Felder erstellen, daher die scheinbare Unregelmäßigkeit.

Vielen dank für die Aufklärung bezüglich der diversen Verbesserungsmöglichkeiten. Ich denke ich werde damit das Problem gelöst bekommen

----------------------------------------------------------------------------------------------------closed.---------------------------------------------------------------------------------------------------------
Antworten