Ich glaub die Distanz zwischen zwei Feldern kannst du nur entweder A: per Pythagoras ausrechnen oder B: Mit einem selbstgeschriebenen Pfadfindungsalgorithmus abfragen.
Ich glaub die Distanz zwischen zwei Feldern kannst du nur entweder A: per Pythagoras ausrechnen oder B: Mit einem selbstgeschriebenen Pfadfindungsalgorithmus abfragen.
Naja, die Dateien links sind doch die aus dem CvGameCoreDLL Ordner, folglich nötig für das erstellen der .dll. Es sind fast nur die mit Python interagierenden Dateien, folglich vermute ich mal, dass da die Befehle 'gespeichert' sind, oder bin ich da völlig auf dem Holzweg???
War mehr ein Witz. Nunja, nehmen wir mal das Beispiel von vorhin, ich möchte jetzt auf ein bestimmtes Geländefeld eine Einheit setzen, wo finde ich jetzt den entsprechenden Befehl dazu, und baue ich den dann ein.
Übrigens, vielen Dank für die Hilfe.
Wieso denn Pythogoras o_O?
Wenn es wirklich nur um den direkten Unterschied an Feldern geht, dann ist es max(UnterschiedXWert, UnterschiedYWert).
Edit: Das ging an VK.
Zum Download bereit: Civ4-Mod "Mars, jetzt!"
"Frei sein heißt wählen können, wessen Sklave man sein will." (Jeanne Moreau, 1928 - )
"Immer wenn man die Meinung der Mehrheit teilt, ist es Zeit, sich zu besinnen." (Mark Twain, 1835 - 1910)
Muss mal eine Frage vorne ran hängen: Kannst du eigentlich programmieren?
Uiuiui Verwirrung.
Mal ganz von vorne:
Mit den Python-Befehlen löst du Aktionen aus, die an die .dll gehen.
Wo diese Befehle dann ausgelöst werden, steht in den .cpp-Dateien.
Die .cpp-Dateien heißen so wie die Klassen, die in ihnen definiert sind.
Die Python-Klassen heißen genauso, dass ist, was du in der Anzeige links siehst.
Links gibt es eine Klasse CyPlayer. Die heißt in Python so. Die heißt auch in C++ so. Und so heißt dann auch die entspr. cpp-Datei.
Unter CyPlayer gibt es den Befehl initUnit, den dürftest du suchen.
Zum Download bereit: Civ4-Mod "Mars, jetzt!"
"Frei sein heißt wählen können, wessen Sklave man sein will." (Jeanne Moreau, 1928 - )
"Immer wenn man die Meinung der Mehrheit teilt, ist es Zeit, sich zu besinnen." (Mark Twain, 1835 - 1910)
Nun ja, ich bin auf dem Wege es zu lernen, habe die Woche ein Buch angeschafft, und bin noch bei den Variablen. Man sieht ja, wieweit ich bin. Den Groschen muss man förmlich noch in New York fallen gehört haben, bitte entschuldigt meine Naivität. Mit Klassen bin ich leider noch nicht so vertraut. Kommt noch, hoffentlich.
Die Karte ist ja ein Koordinatensystem. Du Hast 2 X und 2 Y Wert. Start und Ziel. Aus beiden kannst du ein Rechtwinkliges Dreieck konstruieren wenn du einen X Wert und den Y Wert vom Anderen nimmst. Über dieses Rechtwinklige Dreieck kannst du nun die Distanz über den Pythagoras errechnen. Es ist zwar eine falsche Entfernung dürfte wohl aber für 90% der Fälle reichen.
Kommt drauf an wo du ihn einbauen willst. Dürfte aber sowas wie CyMap.getShortestDistance(X , Y) sein
Dann geben wir mal einfach mal eine ultra-kurze Einführung:
Okay, du weißt, was Variablen sind, richtig? Eine Variable ist ein Platzhalter, der einen Wert hat, z.B. ich sage d = 5, dann ist meine Variable d, die hat den Wert 5, oder sName = [VK], dann hat die Variable sName den Wert [VK], und die Werte kann man jederzeit ändern, wenn ich jetzt sage sName = The_J, dann steht da nicht mehr [VK] drin.
Was aber, wenn ich schwierigere Sachen speichern will, z.B. die Daten einer Person, oder...ein Auto (Auto-Beispiele sind sehr beliebt ), und da auch mal größere Änderungen vornehmen will? Dann brauche ich eine Klasse.
Eine Klasse kann nicht wie eine Variable einen Wert haben, sondern die ist eine Ansammlung aus Variablen.
Ich kann z.B. sagen (achtung, weder C++ noch Python-Code, sondern sogenannter Pseudo-Code):
Damit habe ich alle Sachen an einen Ort, und nicht in 3 verschiedenen Variablen, sondern in einer "Super-Variablen" sozusagen.PHP-Code:
Klasse = Person
Person.Name = X
Person.Addresse = Y
Person.TelefonNummer = 0190-ABC
Klassen können dann auch noch Funktionen haben.
Funktionen sind Code-Teile, die man über einen Namen aufruft.
z.B. wenn ich oben jetzt Name, Addresse und TelefonNummer ändern will, kann ich das natürlich händig jedesmal abändern.
Muss ich aber nicht, ich kann mir eine Funktion schreiben, z.B.
Dann sage ich Person.ändereDetails(The_J, civforum.de,123456), und spare mir damit die 3 Zeilen, die ich oben hingeschrieben habe.PHP-Code:
Person.ändereDetails(neuerName,neueAddresse,neueTelefonnummer)
Person.Name = neuerName
Person.Addresse = neueAddresse
Person.TelefonnUmmer = neueTelefonnummer
Um das jetzt mal auf das Beispiel-Befehl, denn du eben gebracht hast, und ich nicht gesehen habe, umzubiegen:
CyMap ist die Klasse der Karte. Wenn du CyMap() in dem Python-Skript machst, hast du all die Details der aktuellen Karte zur Verfügung.PHP-Code:
CyMap
INT calculatePathDistance (CyPlot pSource, CyPlot pDest)
Die Klasse CyMap hat jetzt die Funktion calculatePathDistance. Diese Funktion wird dir einen Ganz-Zahl-Wert (integer, oder kurz INT) zurückgeben, wenn du ihr 2 Klassen des Types CyPlot (also die ganzen Felder) übergibst, wobei das erste das Start-Feld, das 2. das End-Feld wäre.
Das wäre dann z.B. in Python:
Ich hoffe mal, das war halbwegs verständlich (hab's nicht so mit dem erklären ).PHP-Code:
plot1 = CyMap().plot(1,1) ###also jetzt das Feld ganz links unten
plot2 = CyMap().plot(3,4) ###das Feld an der Position 3,4
dieDistanz = CyMap().calculatePathDistance(plot1, plot2)
Das wäre die Manhattan-Distanz, aber ich denke doch eher, dass wir vom direkten Weg wählen, und der geht ja auch Diagonal .
Zum Download bereit: Civ4-Mod "Mars, jetzt!"
"Frei sein heißt wählen können, wessen Sklave man sein will." (Jeanne Moreau, 1928 - )
"Immer wenn man die Meinung der Mehrheit teilt, ist es Zeit, sich zu besinnen." (Mark Twain, 1835 - 1910)
Das soll wohl ein Witz sein. Supi, vielen Dank, super Erklärung. Das bringt mich wieder einen Schritt weiter (mehrere(!)). Bisher hab ich mir halt irgendwie alles zusammengesucht, geklaut und ein bisschen mehr oder weniger planlos rumprobiert.
So langsam versteh ich des glaub ich auch mit der/die/das(?) API.
Dann mal nur weiter so .
Und "das" API, Application Programming Interface
Schande über dich, und das als Informatiker .
http://de.wikipedia.org/wiki/Manhattan-Metrik
ups, natürlich.
Geht trotzdem einfacher, da ja der diagonale Abstand nicht kürzer ist als der horizontale oder vertikale .
Zum Download bereit: Civ4-Mod "Mars, jetzt!"
"Frei sein heißt wählen können, wessen Sklave man sein will." (Jeanne Moreau, 1928 - )
"Immer wenn man die Meinung der Mehrheit teilt, ist es Zeit, sich zu besinnen." (Mark Twain, 1835 - 1910)
Großartige Hilfe, ich wüsste gar nicht, was ich ohne das Forum machen sollte...
Frage: Was bekommt man bei getNearestWaterPlot? Das müssten doch eigentlich zwei Variablen, eine für den X und eine für den Y-Wert sein, oder nicht. Dann müsste doch das so machbar sein:Ziel davon ist es auf dem nächsten Wasserfeld, solange es nicht weiter als eins entfernt ist ein Arbeitsboot zu setzen. Die letzte Zeile ist so natürlich noch nicht richtig. Wobei iX und iY halt schon gegeben sind.PHP-Code:
iX = [x]
iY = [y]
pPlot1 = CyMap().pPlot(iX, iY)
pPlot2.getNearestWaterPlot ()
if CyMap().calculatePathDistance(plot1, plot2) = 1:
set Unitirgendwas on Plot pPlot2
Der Vorteil von Klassen im Gegensatz zu Algorithmischen Proggen ist halt das es einfach ist eine dieser Klassen wiederzuverwenden.
Um mal bei Autobeispiel zu bleiben
Nehmen wir mal an du hast eine Klasse geschrieben
Dann ist das im Grunde nur ein Bauplan für einen BMW. Du kannst also leichter verschiedene BMWs erstellen. Einer mit zbw 20PS und der andere mit 180PS.PHP-Code:
BMW:
int PS;
int Preis;
Nun kannst du ganz einfach auf den Dreier zugreifen oder auf den Fünfer.PHP-Code:
M3 = new BMW(PS = 20, Preis = 5000€);
M5 = new BMW(PS = 180, Preis = 5000€);
Nehmen wir mal an du willst jetzt auch noch einen Audi machen, dann kannst du im Grunde die BMW Klasse genau gleich übernehmen, deshalb nennt man seine Klassen normalerweise möglichst Allgemein , Auto wäre deshalb besser. Du siehst jetzt das du die BMW(Auto Klasse) auch für Audi benutzen kannst.
Klassen haben noch andere interessante Effekte.
Nehmen wir mal an wir haben ein Rennspiel programmiert und wollen jetzt auch noch Motorräder reinbringen. In wie fern unterscheiden sich Motorräder von Autos? Klar sie haben nur 2Räder. Jetzt könnte man natürlich der Autoklasse noch eine Variable "Räder" geben. Aber ist ein Motorrad ein Auto? Nein, also wäre es wohl sinnvoller eine Motorradklasse zu schreiben. Aber wenn wir eine MR Klasse schreiben müssen wir ja wieder alles kopieren, den so stark unterscheidet sich ja das Auto vom Motorrad nicht. Die Lösung nennt sich Vererbung:
Wir schreiben uns also eine Fahrzeugklasse, die alles enthält was MR und Auto gemeinsam haben(PS, Preis, Farbe) und nennen sie Fahrzeug. Motorrad und Auto können jetzt von dieser Klasse erben und zählen beide als Fahrzeug, dh sie können alles was Fahrzeug kann. In der Auto klasse führen wir jetzt eine Variabel Räder = 4 ein, gleiches machen wir bei MR. Der Große Vorteil von Vererbung ist jetzt das MR und Auto als Fahrzeug gelten. Wir müssen jetzt also bei einer Funktion verschrotten() nicht mehr zwischen Auto und MR unterscheiden.
Und so weiter. Frag mich bitte nicht warum ich das jetzt schreibe