Mathematischer Algorithmus gesucht.
Hi,
ich habe ein Problem andem ich echt schon ewig sitze, aber ich komme nicht auf die Lösung und deshalb frag ich hier ob mir da jemand helfen könnt, hab dazu mal ein Bild gemacht:
So sieht es bis jetzt aus, ich will erstmal kurz erklären was das sein soll. Wenn ich auf das gekennzeichnete Event klicke erscheinen drum herum grüne Felder wenn man auf ein Feld klickt, findet es über den Pathfinder den Weg zu dem geklickten Tile, nur die Grünen Felder sollen nur so erscheinen, dass das Event in jedemfall nur 2 Felder weit laufen kann (ist jetzt nur für dieses Beispiel, dies soll später auch für 3 Felder gehen), d.h. die von mir Rot makierten Felder müssen ausgeblendet werden, weil ja Events dazwischen sind und das geklickte Eventja nicht fliegen kann. Nur wie mach ich das mit einer Schleife? Ich wollte sogar schon versuchen, weil ich keine bessere Lösung fand, alle felder einzeln überprüfen zu lassen, aba dass währen über 1000 Script zeilen geworden. Also hat jemand vielleicht eine Lösung um dies mit einem Algorithmus zu lösen?
Wer es noch immer nicht verstande haben sollte hier noch Mein Script und eine erklärung dazu:
Währe echt cool wenn mir jemand so ein Scrip schreiben könnte, weil ich sitze echt schon ewig dran.
ich habe ein Problem andem ich echt schon ewig sitze, aber ich komme nicht auf die Lösung und deshalb frag ich hier ob mir da jemand helfen könnt, hab dazu mal ein Bild gemacht:
So sieht es bis jetzt aus, ich will erstmal kurz erklären was das sein soll. Wenn ich auf das gekennzeichnete Event klicke erscheinen drum herum grüne Felder wenn man auf ein Feld klickt, findet es über den Pathfinder den Weg zu dem geklickten Tile, nur die Grünen Felder sollen nur so erscheinen, dass das Event in jedemfall nur 2 Felder weit laufen kann (ist jetzt nur für dieses Beispiel, dies soll später auch für 3 Felder gehen), d.h. die von mir Rot makierten Felder müssen ausgeblendet werden, weil ja Events dazwischen sind und das geklickte Eventja nicht fliegen kann. Nur wie mach ich das mit einer Schleife? Ich wollte sogar schon versuchen, weil ich keine bessere Lösung fand, alle felder einzeln überprüfen zu lassen, aba dass währen über 1000 Script zeilen geworden. Also hat jemand vielleicht eine Lösung um dies mit einem Algorithmus zu lösen?
Wer es noch immer nicht verstande haben sollte hier noch Mein Script und eine erklärung dazu:
Äh, ich arbeite im Editior mit nem Modul. Und ich verstehe dein Script da iwie 0 xD, deshalb weis ich nicht genau wie ich es in mein Script einfügen soll, kannst du mir mal bitte deinen Code da genausetens erklären? Nicht nur was es zurück gibt.
Oder hier, fals du mir dann mal besser helfen kannst, der teil aus meinem Script der die Felder anzeigen lässt:
ne kurze erklkärung. Also for x in minus_x..plus_x und for y in minus_y..plus_y arbeiten immer von z.B. bei zwei feldern von -2..2, oder bei 3 feldern von -3..3, dann werden sie später im script bei $game_map.data[@x_geklickt+x, @y_geklickt+y, 2] = 384 im Spiel angezeigt, @x_geklickt ist die x koordinate von dem Event auf das geklickt worden ist. Da jetzt aber -2..2 im Quadrat arbeiten würde habe ich dafür noch if @a+@b != var1 && @a+@b != var2 dieses If hier eingefügt, dies verhindert das x im plus und y im plus zusammen bezählt nie größer sind als die reichweite von dem wie viel sie laufen können, so das war eiggentlich das wichtigste.
EDIT: Wenn ich das jetzt richtig interpretiert habe, macht dieser Code von dir auch nix anderes als ich schon drine hab, ich glaub du hast oben meine Frage nicht ganz verstanden, bei dem was du jetzt hast berechnet man ja auch nur die reichweite, aber nicht ob ein Event dazwischen ist oder nicht. Ich will ebi mir oben, dass die Roten Events ausgeblendet werden.
Hier mal nochmal ein bsp.:
Die Roten felder sollen ausgebelndet werden, sodass das event immer nur 5 Felder laufen kann.
Oder hier, fals du mir dann mal besser helfen kannst, der teil aus meinem Script der die Felder anzeigen lässt:
|
|
Ruby Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
def self.haupt_setzen(minus_x,plus_x,minus_y,plus_y,var1=0,var2=0,var3=0,var4=0,var5=0,var6=0) @plus_x = 0 @plus_y = 0 @minus_x = 0 @minus_y = 0 #Der Rest for x in minus_x..plus_x for y in minus_y..plus_y @a=x.abs @b=y.abs if @a+@b != var1 && @a+@b != var2 && @a+@b != var3 && @a+@b != var4 && @a+@b != var5 && @a+@b != var6 && @a+@b != 0 for i in 1..20 if $game_map.events[i].x == @x_geklickt+x && $game_map.events[i].y == @y_geklickt+y $koordinaten[x+12,y+12] = 1 end end for i in 1..20 if $teleport[i] != true && $game_map.data[@x_geklickt+x, @y_geklickt+y, 2] == 392 && $koordinaten[x+12,y+12] != 1 $game_map.data[@x_geklickt+x, @y_geklickt+y, 2] = 384 end end end end end end |
zum Lesen den Text mit der Maus markieren
ne kurze erklkärung. Also for x in minus_x..plus_x und for y in minus_y..plus_y arbeiten immer von z.B. bei zwei feldern von -2..2, oder bei 3 feldern von -3..3, dann werden sie später im script bei $game_map.data[@x_geklickt+x, @y_geklickt+y, 2] = 384 im Spiel angezeigt, @x_geklickt ist die x koordinate von dem Event auf das geklickt worden ist. Da jetzt aber -2..2 im Quadrat arbeiten würde habe ich dafür noch if @a+@b != var1 && @a+@b != var2 dieses If hier eingefügt, dies verhindert das x im plus und y im plus zusammen bezählt nie größer sind als die reichweite von dem wie viel sie laufen können, so das war eiggentlich das wichtigste.
EDIT: Wenn ich das jetzt richtig interpretiert habe, macht dieser Code von dir auch nix anderes als ich schon drine hab, ich glaub du hast oben meine Frage nicht ganz verstanden, bei dem was du jetzt hast berechnet man ja auch nur die reichweite, aber nicht ob ein Event dazwischen ist oder nicht. Ich will ebi mir oben, dass die Roten Events ausgeblendet werden.
Hier mal nochmal ein bsp.:
Die Roten felder sollen ausgebelndet werden, sodass das event immer nur 5 Felder laufen kann.
zum Lesen den Text mit der Maus markieren
Währe echt cool wenn mir jemand so ein Scrip schreiben könnte, weil ich sitze echt schon ewig dran.
zum Lesen den Text mit der Maus markieren
Mehr als a Allgäuer ka a Mensch it wera.
Wie soll ich wissen was ich denke, bevor ich nicht höre was ich sage?
NES-Emulator - a simple NES-Emulator
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
zum Lesen den Text mit der Maus markieren
Hui ganz schön spät geworden hier 
Egal, also ich mach mal kurz ne denke:
Um herauzufinden ob ein tile begehbar ist müste das komplette tileset von der position der figur aus berechnet werden, und alle begehbaren tilesets die in der range liegen eingrünen.
Mathematischer overkill würde ich sagen. Man könnte performance sparen wenn man dann die begehbaren zwischenspeichert, aber da sich alles verändern kann muss jeder zug komplett neu berechnet werden.
Ich empfehle hier die rechenmaschine überhaupt "das menschliche gehirn" die arbeit machen zu lassen.
Keine ahnung ob du dir schon gedanken zu alternativen gemacht hast, aber ich hätte da drei:
1. Alternative:
Man hat 5 schritte die man mit den Cursortasten gehen kann. Erst wenn man die gemacht hat (oder auch weniger) kann man die bestätigen. Bereits begangene werden da zwsichengespeichert und abgezogen wenn man wieder zurück geht.
2. Alternative:
Mit der "kürzeste weg" methode (ein Algoritmus) wird beim klick auf ein tile geprüft ob das Event den weg bis zum angeklickten tile schafft.
Wenn nicht, wird auf das tile ein blinkendes rotes X oder sowas gesetzt mit nem error sound und ner meldung das das event dieses tile nicht erreichen kann. Ich halte es durchaus für möglich auch für jüngere spieler sich einen weg im kopf auszudenken der dann passt.
Imho finde ich das auch interaktiver und spätestens nach dem 3ten kreuz wirds sicher auch jeder verstanden haben.
3. Alternative:
Wenn man zum klicken kommt wird der bereich engedunkelt und der mousecursor "erhellt" quasi das tile wenn man drüberfährt. Eine methode berechnet den weg von start bis mauszeiger tile und zeigt maximal 5 tiles an.
hier sieht man quasi beim mausbewegen wo er hingehen kann. Sobald die maus ein neues tile "überfliegt" wird der pfad berechnet und geschaut obs passt.
Ich bin kein Mathematiker daher maße ich mir nicht an zu glauben das es dafür keine formel gibt.
Aber ich bin mir ziemlich sicher, jemanden zu finden der das kann und dir das baut wird nicht sehr leicht.
Klar fällt schwer coole ideen oder konzepte einzustampfen und dann was simpleres zu nehmen, aber "alles" ist nunmal nicht möglich wenn man begrenzte ressourcen hat, sowie physikalisch als auch wissens technisch ^^
Pathfinder skripte gibt es schon für XP, das aufzubohren wäre sicherlich nicht so schwer.
Wünsch dir trotzdem viel erfolg!

Egal, also ich mach mal kurz ne denke:
Um herauzufinden ob ein tile begehbar ist müste das komplette tileset von der position der figur aus berechnet werden, und alle begehbaren tilesets die in der range liegen eingrünen.
Mathematischer overkill würde ich sagen. Man könnte performance sparen wenn man dann die begehbaren zwischenspeichert, aber da sich alles verändern kann muss jeder zug komplett neu berechnet werden.
Ich empfehle hier die rechenmaschine überhaupt "das menschliche gehirn" die arbeit machen zu lassen.
Keine ahnung ob du dir schon gedanken zu alternativen gemacht hast, aber ich hätte da drei:
1. Alternative:
Man hat 5 schritte die man mit den Cursortasten gehen kann. Erst wenn man die gemacht hat (oder auch weniger) kann man die bestätigen. Bereits begangene werden da zwsichengespeichert und abgezogen wenn man wieder zurück geht.
2. Alternative:
Mit der "kürzeste weg" methode (ein Algoritmus) wird beim klick auf ein tile geprüft ob das Event den weg bis zum angeklickten tile schafft.
Wenn nicht, wird auf das tile ein blinkendes rotes X oder sowas gesetzt mit nem error sound und ner meldung das das event dieses tile nicht erreichen kann. Ich halte es durchaus für möglich auch für jüngere spieler sich einen weg im kopf auszudenken der dann passt.
Imho finde ich das auch interaktiver und spätestens nach dem 3ten kreuz wirds sicher auch jeder verstanden haben.
3. Alternative:
Wenn man zum klicken kommt wird der bereich engedunkelt und der mousecursor "erhellt" quasi das tile wenn man drüberfährt. Eine methode berechnet den weg von start bis mauszeiger tile und zeigt maximal 5 tiles an.
hier sieht man quasi beim mausbewegen wo er hingehen kann. Sobald die maus ein neues tile "überfliegt" wird der pfad berechnet und geschaut obs passt.
Ich bin kein Mathematiker daher maße ich mir nicht an zu glauben das es dafür keine formel gibt.
Aber ich bin mir ziemlich sicher, jemanden zu finden der das kann und dir das baut wird nicht sehr leicht.
Klar fällt schwer coole ideen oder konzepte einzustampfen und dann was simpleres zu nehmen, aber "alles" ist nunmal nicht möglich wenn man begrenzte ressourcen hat, sowie physikalisch als auch wissens technisch ^^
Pathfinder skripte gibt es schon für XP, das aufzubohren wäre sicherlich nicht so schwer.
Wünsch dir trotzdem viel erfolg!
Es gab doch da mal so ein KS, oder? Dieses konnte genau diese Aufgabe. Wieso schuast du dir nicht mal den Source Code an? Vielleicht kannst du den ja als kleinen Denkansporn nehmen, musst es ja nicht gleich kopieren, ist aber eine gute Idee - find ich.
Wie hieß das KS doch gleich? Ich glaub "Taret Blade" oder so - musst mal gucken.
EDIT: Oder nimm mal die Dateien in ein neues Testprojekt.
EDIT2: Oder schau dir gleich mal diesen Link noch an: Taret Blade
Gruß Kenai
Wie hieß das KS doch gleich? Ich glaub "Taret Blade" oder so - musst mal gucken.
EDIT: Oder nimm mal die Dateien in ein neues Testprojekt.
EDIT2: Oder schau dir gleich mal diesen Link noch an: Taret Blade
Gruß Kenai
-
NeuigkeitenSämtliche Projekte sind erst mal pausiert. Weitere Informationen findet ihr hier. (Stand: 21.12.2012). -
Cursal Engine (Jump and Run Engine)Mit Hilfe der Cursal Engine (RCE) ist es möglich auf ziemlich einfache Weise „Jump and Run“-Projekte im RPG Maker XP zu entwerfen. Das Anlegen basiert auf Installations- und Updatepaketen sowie reinen Archiven für fortgeschrittene Benutzer. Die Version 2 (CE2) befindet sich bereits in Entwicklung. Interessiert? Dann lade dir die neuste Version herunter ;3! -
AvatarDiese kleinen, netten und knuffigen Vögelchen nennen sich Hamachou und dürften einigen aus Skies of Arcadia bekannt sein. Ich habe diese Bilder weder selbst gezeichnet noch modelliert. Dennoch finde ich sie so knuffig, dass man sie einfach lieb haben muss und ich hoffe euch geht's genau so^^". Diese Grafiken sind wirklich rar und ich bin stolz sie im Web gefunden zu haben.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Kenai« (16. Februar 2009, 15:36)
Hast du dir mal das game angeschaut? Der hat das von grundauf neu geschrieben, da kann ich doch nix abschauen^^, das checke ich eh nicht XD.
Mehr als a Allgäuer ka a Mensch it wera.
Wie soll ich wissen was ich denke, bevor ich nicht höre was ich sage?
NES-Emulator - a simple NES-Emulator
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
zum Lesen den Text mit der Maus markieren
Was du suchst nennst sich "Breitensuche über einen Graphen". Die Idee ist im Grunde genommen das du vom Startfeld aus in jede Richtung schrittweise läufst und dir dabei merkst welche Felder du bereits besucht hast. Diese müssen dann logischerweise nicht nochmal besucht werden.
Im günstigsten Fall arbeitest du mit einer 2D-Table. Die muss auch nur doppelt so groß sein, wie die Schritte die du maximal gehen darfst.
Konstanten:
0 = Feld nicht besucht
1 = Feld besucht und begehbar
2 = Feld nicht begehbar
Initialisierung:
- Gehe alle Events durch und speichere deren Position in der Tabelle, in dem du die Felder in der Tabelle, wo das Event "draufsteht" auf 2 setzt.
- Lege einen Array BesuchteFelder an, in dem du das Startfeld des Helden speicherst (also die Koordinaten)
Ablauf:
- Brich ab, wenn BesuchteFelder leer ist oder wenn Ablauf bereits so häufig stattgefunden hat wie die Zahl der möglichen Schritte
- Gehe nacheinander alle Elemente in BesuchteFelder durch. Setze ihren Wert auf 1, lösche sie aus dem Array und schaue dir dann alle benachbarten Felder an. Sind sie von einem Event versperrt (also ist ihr Wert 2), dann ignoriere sie. Sind sie von allen Richtungen aus nicht passierbar, dann setze sie auf 2. Sind sie passierbar und nicht mit dem Wert 1 belegt, dann füge ihre Koordinaten in BesuchteFelder ein.
- Wiederhole Ablauf
Terminierung:
- Alle Felder die den Wert 1 haben, sind von deinem Helden aus erreichbar.
Im günstigsten Fall arbeitest du mit einer 2D-Table. Die muss auch nur doppelt so groß sein, wie die Schritte die du maximal gehen darfst.
Konstanten:
0 = Feld nicht besucht
1 = Feld besucht und begehbar
2 = Feld nicht begehbar
Initialisierung:
- Gehe alle Events durch und speichere deren Position in der Tabelle, in dem du die Felder in der Tabelle, wo das Event "draufsteht" auf 2 setzt.
- Lege einen Array BesuchteFelder an, in dem du das Startfeld des Helden speicherst (also die Koordinaten)
Ablauf:
- Brich ab, wenn BesuchteFelder leer ist oder wenn Ablauf bereits so häufig stattgefunden hat wie die Zahl der möglichen Schritte
- Gehe nacheinander alle Elemente in BesuchteFelder durch. Setze ihren Wert auf 1, lösche sie aus dem Array und schaue dir dann alle benachbarten Felder an. Sind sie von einem Event versperrt (also ist ihr Wert 2), dann ignoriere sie. Sind sie von allen Richtungen aus nicht passierbar, dann setze sie auf 2. Sind sie passierbar und nicht mit dem Wert 1 belegt, dann füge ihre Koordinaten in BesuchteFelder ein.
- Wiederhole Ablauf
Terminierung:
- Alle Felder die den Wert 1 haben, sind von deinem Helden aus erreichbar.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »=Kai=« (16. Februar 2009, 20:51)
Zitat
Was du suchst nennst sich "Breitensuche über einen Graphen". Die Idee ist im Grunde genommen das du vom Startfeld aus in jede Richtung schrittweise läufst und dir dabei merkst welche Felder du bereits besucht hast. Diese müssen dann logischerweise nicht nochmal besucht werden.
Im günstigsten Fall arbeitest du mit einer 2D-Table. Die muss auch nur doppelt so groß sein, wie die Schritte die du maximal gehen darfst.
Konstanten:
0 = Feld nicht besucht
1 = Feld besucht und begehbar
2 = Feld nicht begehbar
Initialisierung:
- Gehe alle Events durch und speichere deren Position in der Tabelle, in dem du die Felder in der Tabelle, wo das Event "draufsteht" auf 2 setzt.
- Lege einen Array BesuchteFelder an, in dem du das Startfeld des Helden speicherst (also die Koordinaten)
Ablauf:
- Brich ab, wenn BesuchteFelder leer ist oder wenn Ablauf bereits so häufig stattgefunden hat wie die Zahl der möglichen Schritte
- Gehe nacheinander alle Elemente in BesuchteFelder durch. Setze ihren Wert auf 1, lösche sie aus dem Array und schaue dir dann alle benachbarten Felder an. Sind sie von einem Event versperrt (also ist ihr Wert 2), dann ignoriere sie. Sind sie von allen Richtungen aus nicht passierbar, dann setze sie auf 2. Sind sie passierbar und nicht mit dem Wert 1 belegt, dann füge ihre Koordinaten in BesuchteFelder ein.
- Wiederhole Ablauf
Terminierung:
- Alle Felder die den Wert 1 haben, sind von deinem Helden aus erreichbar.
Siehe hierzu den anderen Post von dir, der exakt das gleiche Prob beschreibt und indem ich eine zu 70%identische Lösung gepostet habe, die auch nur durch Mathe Läuft.
-
Werbung -
1plus3
-
Nuuuhminaaah
-
compétences(Dieser Tab ist rein satirisch.)mes compétences
max.
Maps machen
Musik machen
Scripts machen
Story ausdenken
Pixeln und so
Events proggen
-
mes projets-
Silentium
Name: Silentium
Maker: Eigenbau (C++, x86-SSE/AVX-Assembly, Ruby/Lua)
Story
NPCs
Scripts
Ressis
Maps
Gesamt(3+4)% 42 69% 0815 -17.438 103.38% ± 6.3mm²
(Die Tabelle erfüllt lediglich satirische Zwecke.) -
OnyxEine in C++ implementierte, modulare, plattformunabhängige, virtuelle Maschine. Die Test-Version ist bereits halb fertig. Ab dann gibt es vielleicht mehr Infos. Sie soll die auf dem ersten Blick LISP-artige und eigens dafür konstruierte Sprache Obsidian ausführen können. Experimentell wird auch ein Lua-Compiler für Onyx gebaut. Ziel ist eine leistungsfähige, virtuelle Maschine für beliebige Scriptsprachen. Theoretisch gesehen müsste man bloß noch einen kompatiblen Compiler schreiben, der Quellcode jener Sprache in Onyx-Assembly, oder direkt in Onyx-Bytecode übersetzt. Ob die jemand nutzen wird, ist eine andere Frage und nur ein sekundäres... nein, eher tertiäres Ziel dieser VM. Primär dient es mir lediglich dazu, mein Verständnis von Hardware, ISA, und Assembly zu vertiefen, sowie eigene Grenzen auszutesten.
Warnung!
Das Entwickeln einer virtuellen Maschine oder Programmiersprache (im wahnsinnigsten Fall beides) ist eine höchst komplizierte Tätigkeit, aus der viel Frust und Hirnmatsche hervor gehen. Sollte sich dennoch ein ähnlich wahnsinniger finden, der sowas zusammen schustern will, so lege ich ihm/ihr die folgenden Bücher ans Herz:- Compiler - Das Drachenbuch [978-3-8273-7097-6]
Dieses Buch schlachtet ausführlich und leicht verständlich die Grundlagen bis hoch zu den Experten-Techniken des Compilerbaus aus. Es fängt mit der Automaten-Theorie und formalen Sprachen an, arbeitet sich durch Analysetechniken vor, und landet schließlich bei Techniken wie Optimierung und Register-Zuweisung. Das Buch wiegt 3Kg oder 4Kg. Hab's mal gewogen. Ist also nicht gerade die Lektüre für unterwegs.
- Computerarchitektur [3-8273-7016-7]
Hier werden leicht verständlich die wichtigsten Entwicklungen der Rechnerarchitekturen erklärt (Gut, das Buch ist in die Jahre gekommen, aber der Weg zu heute ist ein winziger Schritt, den man sich nach diesem Buch selbst erdenken kann). Hauptbestandteil des Buchs ist eine relativ umfassende Betrachtung der Funktionsweise dreier gänzlich unterschiedlicher, aber dominierender Prozessor-Typen am Beispiel des Pentium II, UltraSPARC II, sowie picoJava. Die meisten Elemente dieses Buchs sind zwar für die Konstruktion einer virtuellen Maschine irrelevant, oder aufgrund der Tatsache, dass die VM Software ist und z.B. Byte-Grenzen hat, sogar zu Leistungseinbußen führen kann, doch ist ein hinreichendes Verständnis dieser Maschinen, mit denen wir arbeiten, äußerst hilfreich für die Überlegungen, wie die VM arbeiten soll.
Es kann sehr hilfreich und inspirierend sein, den Code quelloffener, virtueller Maschinen anderer Sprachen zu überfliegen. Meine Lieblings-Quelle war und ist stets die VM von Lua. Sie ist schlank, verständlich, in C implementiert, und basiert im Gegensatz zu vielen anderen Scriptsprachen-VMs auf einer Register-Maschine statt einer Stapelmaschine. Es wäre natürlich vorteilhaft, die entsprechende Sprache zu verstehen, in der man auch die eigene VM implementieren will. Weiterhin ist es äußerst vorteilhaft, eine leistungsstarke und bequeme Sprache wie C++ zu beherrschen, um die VM zu implementieren. Und bevor irgendwer auf die Idee kommt: Assembly ist NICHT als dominierende Sprache für den Bau einer VM geeignet. Wer die Frage des "Warum?" nicht beantworten kann, sollte zunächst die gewählte Sprache und Assembly hinreichend verstehen lernen, und es dann erneut mit der Frage versuchen. Es lohnt sich dennoch, Assembly zu lernen. Allein schon, um erneut das Verständnis zu vertiefen, zumal ihr mehr oder weniger gezwungen seid, auch für eure VM eine Assembler-Sprache zu entwickeln (Außer natürlich ihr schreibt eure Test-Programme Bit für Bit ;3). - Compiler - Das Drachenbuch [978-3-8273-7097-6]
-
-
enfinJe ne peux pas parler français.
C'est tout ce que Goodle et les restes de cours de français.
@=Kai=
Erstmal TY das du mir so ne lange nachricht geschrieben hast^^, aber du hast das jetzt alles in einer Denkweise wie es sich ein Mensch denken würde geschrieben, dann hört sich das viel leichter an, ich hab mir das auch schon 1000mal durchgedacht auch schon bei den Nachrichten von Evrey, ich komm nur nicht drauf wie ich das am besten mache, deshalb wollte ich das mir hier vielleicht jemand einen kleinen Code dafür schreiben kann, weil mit solchen denkweisen kann ich nicht mehr viel anfangen^^, ich weis nicht wie ich das in eine schleife einbauen kann.
Erstmal TY das du mir so ne lange nachricht geschrieben hast^^, aber du hast das jetzt alles in einer Denkweise wie es sich ein Mensch denken würde geschrieben, dann hört sich das viel leichter an, ich hab mir das auch schon 1000mal durchgedacht auch schon bei den Nachrichten von Evrey, ich komm nur nicht drauf wie ich das am besten mache, deshalb wollte ich das mir hier vielleicht jemand einen kleinen Code dafür schreiben kann, weil mit solchen denkweisen kann ich nicht mehr viel anfangen^^, ich weis nicht wie ich das in eine schleife einbauen kann.
Mehr als a Allgäuer ka a Mensch it wera.
Wie soll ich wissen was ich denke, bevor ich nicht höre was ich sage?
NES-Emulator - a simple NES-Emulator
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
zum Lesen den Text mit der Maus markieren
Tiefensuche geht natürlich auch. Sieht ggf. schöner aus, da es sich leicht rekursiv schreiben lässt. Ich habs jetzt trotzdem mal per Breitensuche gemacht:
Ungetestet, höchstwahrscheinlich fehlerbehaftet. Kommst also nicht drum rum nochmal nachzukorrigieren. Aber dir ging es ja eh nur um ein Codebeispiel.
|
|
Ruby Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
class Rect # gibt true zurück, wenn Koordinaten sich im Rect befinden def include_point? px, py (px >= x && px <= (x+width)) && (py >= y && py <= (y+height)) end end # Ausschnitt einer Tabelle class ClipTable attr_reader :clip def initialize(x, y, width, height) @clip = Rect.new(x, y, width, height) @data = Table.new(width, height) end def width @clip.width end def height @clip.height end def [](x, y) @data[x - @clip.x, y - @clip.y] end def []=(x, y, v) @data[x - @clip.x, y - @clip.y] = v end end class Game_Map # gibt true zurück, wenn Feld begehbar ist (unabhängig von Events die darauf stehen könnten) def field_passable?(x, y, d=0) bit = (1 << (d / 2 - 1)) & 0x0f for i in [2, 1, 0] # Get tile ID tile_id = data[x, y, i] # Tile ID acquistion failure if tile_id == nil # impassable return false # If obstacle bit is set elsif @passages[tile_id] & bit != 0 # impassable return false # If obstacle bit is set in all directions elsif @passages[tile_id] & 0x0f == 0x0f # impassable return false # If priorities other than that are 0 elsif @priorities[tile_id] == 0 # passable return true end end end # erzeugt einen Tabellenausschnitt, der alle erreichbaren Felder mit einem positiven Wert > 0 markiert def reachable_table_for(x, y, steps) size = steps * 2 + 1 bx, by = x-steps, y-steps bx = [[0, bx].max, width].min by = [[0, by].max, height].min w = [bx + size, width].min h = [by + size, height].min clip = ClipTable.new(bx, by, w, h) write_blocking_events_in_table(clip) active = [[x, y]] clip[x, y] = -1 i = 1 until active.empty? || i > steps active = active.inject([]) do |to_visit, (vx, vy)| to_visit.push(*visit_field(clip, i, vx, vy)) end i += 1 end clip[x, y] = 0 clip end private() # besucht ein einzelnes Feld, markiert dabei alle erreichbaren Felder und gibt diese zurück def visit_field(clip, step, x, y) to_visit = [] # markiere nun alle umliegenden Felder die begehbar sind cords = [[x, y-1, 2], [x-1, y, 4], [x+1, y, 6], [x, y+1, 8]] cords.each {|fx, fy, d| next if clip[fx, fy] != 0 next unless field_passable?(fx, fy, d) clip[fx, fy] = step to_visit << [fx, fy] } to_visit end # markiert alle unereichbaren Felder, die von Events versperrt sind, mit einer -1 def write_blocking_events_in_table(table) @events.each_value {|event| if not event.through and table.clip.include_point?(event.x, event.y) then table[event.x, event.y] = -1 end } end end |
Ungetestet, höchstwahrscheinlich fehlerbehaftet. Kommst also nicht drum rum nochmal nachzukorrigieren. Aber dir ging es ja eh nur um ein Codebeispiel.
Wow, danke hab gedacht würde kürzer werden, echt hammer, hätte nicht gedacht das mir sowas jemand schreibt 109 zeilen^^ echt ein fettes danke.
Aber jetzt noch ne sau dumme frage, kenne mich nämlich noch nicht so gut aus mit Klassen, wie kann ich die jetzt am besten aufrufen?
Aber jetzt noch ne sau dumme frage, kenne mich nämlich noch nicht so gut aus mit Klassen, wie kann ich die jetzt am besten aufrufen?
Mehr als a Allgäuer ka a Mensch it wera.
Wie soll ich wissen was ich denke, bevor ich nicht höre was ich sage?
NES-Emulator - a simple NES-Emulator
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
zum Lesen den Text mit der Maus markieren
Einfach:
Sollte dir 'ne Tabelle zurückgeben, mit Werten > 0 für all die Felder, die erreichbar sind.
Falls dir der Code zu lang ist, hier nochmal 'nen rekursiver Tiefensuche-Algorithmus:
Ist vermutlich nicht so effizient wie der obige. Aber du erkennst vielleicht besser wie der Algorithmus funktioniert.
|
|
Ruby Quellcode |
1 |
$game_map.reachable_table_for($game_player.x, $game_player.y, 5) |
Sollte dir 'ne Tabelle zurückgeben, mit Werten > 0 für all die Felder, die erreichbar sind.
Falls dir der Code zu lang ist, hier nochmal 'nen rekursiver Tiefensuche-Algorithmus:
|
|
Ruby Quellcode |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
class Game_Map def create_reachable_table x, y, steps table = Table.new(width, height) visit_field(x, y, steps, table) table end DIRECTIONS = [ [0, 1, 2], [-1, 0, 4], [1, 0, 6], [0, -1, 8] ] def visit_field(x, y, steps, table) return table if steps < 0 table[x, y] = steps + 1 DIRECTIONS.each do |xplus, yplus, dir| nx = x + xplus ny = y + yplus next if nx < 0 or nx >= width or ny < 0 or ny >= height or table[nx, ny] >= steps or not passable?(nx, ny, dir) visit_field(nx, ny, steps-1, table) end end end |
Ist vermutlich nicht so effizient wie der obige. Aber du erkennst vielleicht besser wie der Algorithmus funktioniert.
Wie der gibt die werte in einer Tabelle zurück? Kann ich das nicht auch einfach mit True oder false abfragen?
Mehr als a Allgäuer ka a Mensch it wera.
Wie soll ich wissen was ich denke, bevor ich nicht höre was ich sage?
NES-Emulator - a simple NES-Emulator
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
zum Lesen den Text mit der Maus markieren
Benutzerinformationen überspringen
Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.
Ist doch total egal O.o
|
|
Ruby Quellcode |
1 2 3 4 5 6 |
table = $game_map.reachable_table_for($game_player.x, $game_player.y, 5) if table[x,y] == 0 false else true end |
wofür steht x,y und wofür die 5?
Mehr als a Allgäuer ka a Mensch it wera.
Wie soll ich wissen was ich denke, bevor ich nicht höre was ich sage?
NES-Emulator - a simple NES-Emulator
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
zum Lesen den Text mit der Maus markieren
Benutzerinformationen überspringen
Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.
x und y sind die Koordinaten die du abfragst.
5 ist warscheinlich die Anzahl der Felder, die man gehen kann
5 ist warscheinlich die Anzahl der Felder, die man gehen kann
Ja toll^^, das weis ich schon selber, aba wie soll ich die abfragen? einfach so:
for x in 0..19
for y in 0..14
end
end
oder ist das die empfernung vno den feldern?
for x in 0..19
for y in 0..14
end
end
oder ist das die empfernung vno den feldern?
Mehr als a Allgäuer ka a Mensch it wera.
Wie soll ich wissen was ich denke, bevor ich nicht höre was ich sage?
NES-Emulator - a simple NES-Emulator
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
zum Lesen den Text mit der Maus markieren
Benutzerinformationen überspringen
Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.
Musst du doch wissen, wie du die abfragst :o
Ich kenn deni Skript ja nich^^
Ich kenn deni Skript ja nich^^
Hä, jetzt checke ich gar nix mehr, das ist doch nicht mein Script das ist von =Kai=, das siehst du auch wenn du hochscrollst, ich will dazu wissen wie man die Tabelle abfrägt, weil wenn if [20,40] == true ist und ich diesen wert haben will kann ich ja auch nicht schreiben if [40,20] == true, weil das währe dann falsch abgefragt.
Mehr als a Allgäuer ka a Mensch it wera.
Wie soll ich wissen was ich denke, bevor ich nicht höre was ich sage?
NES-Emulator - a simple NES-Emulator
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
zum Lesen den Text mit der Maus markieren
T__T x & y = Playerkoordinaten; 5 = Maximale begehbare Felder
-
Werbung -
1plus3
-
Nuuuhminaaah
-
compétences(Dieser Tab ist rein satirisch.)mes compétences
max.
Maps machen
Musik machen
Scripts machen
Story ausdenken
Pixeln und so
Events proggen
-
mes projets-
Silentium
Name: Silentium
Maker: Eigenbau (C++, x86-SSE/AVX-Assembly, Ruby/Lua)
Story
NPCs
Scripts
Ressis
Maps
Gesamt(3+4)% 42 69% 0815 -17.438 103.38% ± 6.3mm²
(Die Tabelle erfüllt lediglich satirische Zwecke.) -
OnyxEine in C++ implementierte, modulare, plattformunabhängige, virtuelle Maschine. Die Test-Version ist bereits halb fertig. Ab dann gibt es vielleicht mehr Infos. Sie soll die auf dem ersten Blick LISP-artige und eigens dafür konstruierte Sprache Obsidian ausführen können. Experimentell wird auch ein Lua-Compiler für Onyx gebaut. Ziel ist eine leistungsfähige, virtuelle Maschine für beliebige Scriptsprachen. Theoretisch gesehen müsste man bloß noch einen kompatiblen Compiler schreiben, der Quellcode jener Sprache in Onyx-Assembly, oder direkt in Onyx-Bytecode übersetzt. Ob die jemand nutzen wird, ist eine andere Frage und nur ein sekundäres... nein, eher tertiäres Ziel dieser VM. Primär dient es mir lediglich dazu, mein Verständnis von Hardware, ISA, und Assembly zu vertiefen, sowie eigene Grenzen auszutesten.
Warnung!
Das Entwickeln einer virtuellen Maschine oder Programmiersprache (im wahnsinnigsten Fall beides) ist eine höchst komplizierte Tätigkeit, aus der viel Frust und Hirnmatsche hervor gehen. Sollte sich dennoch ein ähnlich wahnsinniger finden, der sowas zusammen schustern will, so lege ich ihm/ihr die folgenden Bücher ans Herz:- Compiler - Das Drachenbuch [978-3-8273-7097-6]
Dieses Buch schlachtet ausführlich und leicht verständlich die Grundlagen bis hoch zu den Experten-Techniken des Compilerbaus aus. Es fängt mit der Automaten-Theorie und formalen Sprachen an, arbeitet sich durch Analysetechniken vor, und landet schließlich bei Techniken wie Optimierung und Register-Zuweisung. Das Buch wiegt 3Kg oder 4Kg. Hab's mal gewogen. Ist also nicht gerade die Lektüre für unterwegs.
- Computerarchitektur [3-8273-7016-7]
Hier werden leicht verständlich die wichtigsten Entwicklungen der Rechnerarchitekturen erklärt (Gut, das Buch ist in die Jahre gekommen, aber der Weg zu heute ist ein winziger Schritt, den man sich nach diesem Buch selbst erdenken kann). Hauptbestandteil des Buchs ist eine relativ umfassende Betrachtung der Funktionsweise dreier gänzlich unterschiedlicher, aber dominierender Prozessor-Typen am Beispiel des Pentium II, UltraSPARC II, sowie picoJava. Die meisten Elemente dieses Buchs sind zwar für die Konstruktion einer virtuellen Maschine irrelevant, oder aufgrund der Tatsache, dass die VM Software ist und z.B. Byte-Grenzen hat, sogar zu Leistungseinbußen führen kann, doch ist ein hinreichendes Verständnis dieser Maschinen, mit denen wir arbeiten, äußerst hilfreich für die Überlegungen, wie die VM arbeiten soll.
Es kann sehr hilfreich und inspirierend sein, den Code quelloffener, virtueller Maschinen anderer Sprachen zu überfliegen. Meine Lieblings-Quelle war und ist stets die VM von Lua. Sie ist schlank, verständlich, in C implementiert, und basiert im Gegensatz zu vielen anderen Scriptsprachen-VMs auf einer Register-Maschine statt einer Stapelmaschine. Es wäre natürlich vorteilhaft, die entsprechende Sprache zu verstehen, in der man auch die eigene VM implementieren will. Weiterhin ist es äußerst vorteilhaft, eine leistungsstarke und bequeme Sprache wie C++ zu beherrschen, um die VM zu implementieren. Und bevor irgendwer auf die Idee kommt: Assembly ist NICHT als dominierende Sprache für den Bau einer VM geeignet. Wer die Frage des "Warum?" nicht beantworten kann, sollte zunächst die gewählte Sprache und Assembly hinreichend verstehen lernen, und es dann erneut mit der Frage versuchen. Es lohnt sich dennoch, Assembly zu lernen. Allein schon, um erneut das Verständnis zu vertiefen, zumal ihr mehr oder weniger gezwungen seid, auch für eure VM eine Assembler-Sprache zu entwickeln (Außer natürlich ihr schreibt eure Test-Programme Bit für Bit ;3). - Compiler - Das Drachenbuch [978-3-8273-7097-6]
-
-
enfinJe ne peux pas parler français.
C'est tout ce que Goodle et les restes de cours de français.
Naja, habs nach langem rumprobieren zum l aufen gebracht, danke^^, geht perfekt.
Mehr als a Allgäuer ka a Mensch it wera.
Wie soll ich wissen was ich denke, bevor ich nicht höre was ich sage?
NES-Emulator - a simple NES-Emulator
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
ERDL - a embedded Ruby Interpreter with the abilltiy to render images with DirectX ERDL shall be 100% compatible to RPGXP-Ruby Scripts
zum Lesen den Text mit der Maus markieren
Ähnliche Themen
-
Einsteigerhilfe »-
Databse Charackter und Monster entwicklung
(9. Januar 2009, 12:48)
-
Archiv Spielvorstellungen »-
[Abenteuer] Silent Voice
(15. März 2008, 19:22)
-
Ältere Suchanfragen »-
Char passend zu Battler gesucht
(3. September 2007, 20:26)
-
RGSS 1 Probleme & Talk »-
MD5?
(1. September 2007, 16:51)
-
(Alt) Smalltalk »-
Wie funktioniert ein Keygenerator???
(16. Juni 2007, 13:18)





