• Anmelden

Reborn

hat beim Stromkonzern schon Rabatt

  • »Reborn« ist der Autor dieses Themas

Motto: Wer noch was vom Wochenende weis, hat es nie erlebt!

  • Nachricht senden

1

Sonntag, 15. Februar 2009, 09:29

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:
Bild

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:
Spoiler
Spoiler
Ä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:
Spoiler

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.
Spoiler
Bild
zum Lesen den Text mit der Maus markieren
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?


Spoiler: OpenSource-Projects
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
zum Lesen den Text mit der Maus markieren

2

Montag, 16. Februar 2009, 04:04

Hui ganz schön spät geworden hier :D

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!
Bild Bild Bild

Kenai

Landsknecht

Motto: “Niemals aufgeben, bevor man nicht alles versucht hat.”

  • Nachricht senden

3

Montag, 16. Februar 2009, 10:37

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
»Kenai« hat folgende Datei angehängt:
  • script.rar (203,61 kB - 3 mal heruntergeladen - zuletzt: 23. Dezember 2009, 01:29)
  • :doc: Neuigkeiten

    Sämtliche Projekte sind erst mal pausiert. Weitere Informationen findet ihr hier. (Stand: 21.12.2012).
  • :rmxp: 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!
  • BildAvatar

    Diese 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)


Reborn

hat beim Stromkonzern schon Rabatt

  • »Reborn« ist der Autor dieses Themas

Motto: Wer noch was vom Wochenende weis, hat es nie erlebt!

  • Nachricht senden

4

Montag, 16. Februar 2009, 17:44

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?


Spoiler: OpenSource-Projects
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
zum Lesen den Text mit der Maus markieren

5

Montag, 16. Februar 2009, 20:45

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.
Bild
RMXP Grundkurs
1 2 3
Ruby/RGSS-Kurs

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »=Kai=« (16. Februar 2009, 20:51)


Evrey

Oberschurke im Ruhestand

Motto: "Satzzeichen sind keine Rudeltiere." - Chesra

  • Nachricht senden

6

Montag, 16. Februar 2009, 21:00

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.
  • :medal: Werbung

    Bild

    Cpp Quellcode

    1
    
    #define TRUE FALSE //Happy debugging suckers
    (Einfach nur wundervoll.)
  • :palette: 1plus3 :cake:

    Bild
  • :fires: Nuuuhminaaah

    Bild
  • :medal: compétences

    mes compétences
    :heart_full: :heart_full: :heart_full: :heart_full: :heart_full: max.
    :ruler-triangle: Maps machen :heart_full: :heart-empty: :heart-empty: :heart-empty: :heart-empty:
    :media-player: Musik machen :heart_full: :heart-half: :heart-empty: :heart-empty: :heart-empty:
    :cup: Scripts machen :heart_full: :heart_full: :heart_full: :heart_full: :heart-break:
    :paper: Story ausdenken :heart_full: :heart_full: :heart_full: :heart-empty: :heart-empty:
    :cut: Pixeln und so :heart-empty: :heart-empty: :heart-empty: :heart-empty: :heart-empty:
    :game: Events proggen :heart_full: :heart_full: :heart_full: :heart_full: :heart_full:
    (Dieser Tab ist rein satirisch.)
  • :folder-open: mes projets

    • :addressbook: Silentium
      :book: Name: Silentium
      :rmxp: Maker: Eigenbau (C++, x86-SSE/AVX-Assembly, Ruby/Lua)

      :paper: Story
      :game: NPCs
      :cup: Scripts
      :drill: Ressis
      :ruler-triangle: Maps
      :compile: Gesamt
      (3+4)% 42 69% 0815 -17.438 103.38% ± 6.3mm²

      (Die Tabelle erfüllt lediglich satirische Zwecke.)
    • :compile: Onyx
      Eine 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.

      :exclamation: 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).
  • :locale: enfin

    Je ne peux pas parler français.
    C'est tout ce que Goodle et les restes de cours de français.
Signaturstand: 24.07.2013

Reborn

hat beim Stromkonzern schon Rabatt

  • »Reborn« ist der Autor dieses Themas

Motto: Wer noch was vom Wochenende weis, hat es nie erlebt!

  • Nachricht senden

7

Montag, 16. Februar 2009, 22:54

@=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.
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?


Spoiler: OpenSource-Projects
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
zum Lesen den Text mit der Maus markieren

8

Montag, 16. Februar 2009, 23:21

@Kai:

Wie wäre es denn mit der Beschränkten Tiefensuche? Müsste nur für jede Richtung (oben, rechts, unten, links) einmal durchgeführt werden.
Der algoritmus sieht imho noch ganz simpel aus, deshalb könnt ich dann sowas machen, aber will vorher sicher gehen das ich aufm richtigen weg bin.
Bild Bild Bild

9

Dienstag, 17. Februar 2009, 03:53

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:

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.
Bild
RMXP Grundkurs
1 2 3
Ruby/RGSS-Kurs

Reborn

hat beim Stromkonzern schon Rabatt

  • »Reborn« ist der Autor dieses Themas

Motto: Wer noch was vom Wochenende weis, hat es nie erlebt!

  • Nachricht senden

10

Dienstag, 17. Februar 2009, 17:39

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?
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?


Spoiler: OpenSource-Projects
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
zum Lesen den Text mit der Maus markieren

11

Dienstag, 17. Februar 2009, 18:11

Einfach:

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.
Bild
RMXP Grundkurs
1 2 3
Ruby/RGSS-Kurs

Reborn

hat beim Stromkonzern schon Rabatt

  • »Reborn« ist der Autor dieses Themas

Motto: Wer noch was vom Wochenende weis, hat es nie erlebt!

  • Nachricht senden

12

Dienstag, 17. Februar 2009, 18:22

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?


Spoiler: OpenSource-Projects
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
zum Lesen den Text mit der Maus markieren

Neo-Bahamut

Himmelsgleicher

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

13

Dienstag, 17. Februar 2009, 18:27

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
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

Reborn

hat beim Stromkonzern schon Rabatt

  • »Reborn« ist der Autor dieses Themas

Motto: Wer noch was vom Wochenende weis, hat es nie erlebt!

  • Nachricht senden

14

Dienstag, 17. Februar 2009, 18:36

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?


Spoiler: OpenSource-Projects
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
zum Lesen den Text mit der Maus markieren

Neo-Bahamut

Himmelsgleicher

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

15

Dienstag, 17. Februar 2009, 18:39

x und y sind die Koordinaten die du abfragst.
5 ist warscheinlich die Anzahl der Felder, die man gehen kann
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

Reborn

hat beim Stromkonzern schon Rabatt

  • »Reborn« ist der Autor dieses Themas

Motto: Wer noch was vom Wochenende weis, hat es nie erlebt!

  • Nachricht senden

16

Dienstag, 17. Februar 2009, 18:40

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?
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?


Spoiler: OpenSource-Projects
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
zum Lesen den Text mit der Maus markieren

Neo-Bahamut

Himmelsgleicher

Motto: Wer anderen eine Bratwurst brät, der hat ein Bratwurstbratgerät.

  • Nachricht senden

17

Dienstag, 17. Februar 2009, 18:44

Musst du doch wissen, wie du die abfragst :o
Ich kenn deni Skript ja nich^^
Spoiler: Wurstinator
zum Lesen den Text mit der Maus markieren

Spoiler: Lazer-Wurst
zum Lesen den Text mit der Maus markieren

Spoiler: Hallowurst
zum Lesen den Text mit der Maus markieren

Reborn

hat beim Stromkonzern schon Rabatt

  • »Reborn« ist der Autor dieses Themas

Motto: Wer noch was vom Wochenende weis, hat es nie erlebt!

  • Nachricht senden

18

Dienstag, 17. Februar 2009, 18:46

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?


Spoiler: OpenSource-Projects
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
zum Lesen den Text mit der Maus markieren

Evrey

Oberschurke im Ruhestand

Motto: "Satzzeichen sind keine Rudeltiere." - Chesra

  • Nachricht senden

19

Dienstag, 17. Februar 2009, 18:47

T__T x & y = Playerkoordinaten; 5 = Maximale begehbare Felder
  • :medal: Werbung

    Bild

    Cpp Quellcode

    1
    
    #define TRUE FALSE //Happy debugging suckers
    (Einfach nur wundervoll.)
  • :palette: 1plus3 :cake:

    Bild
  • :fires: Nuuuhminaaah

    Bild
  • :medal: compétences

    mes compétences
    :heart_full: :heart_full: :heart_full: :heart_full: :heart_full: max.
    :ruler-triangle: Maps machen :heart_full: :heart-empty: :heart-empty: :heart-empty: :heart-empty:
    :media-player: Musik machen :heart_full: :heart-half: :heart-empty: :heart-empty: :heart-empty:
    :cup: Scripts machen :heart_full: :heart_full: :heart_full: :heart_full: :heart-break:
    :paper: Story ausdenken :heart_full: :heart_full: :heart_full: :heart-empty: :heart-empty:
    :cut: Pixeln und so :heart-empty: :heart-empty: :heart-empty: :heart-empty: :heart-empty:
    :game: Events proggen :heart_full: :heart_full: :heart_full: :heart_full: :heart_full:
    (Dieser Tab ist rein satirisch.)
  • :folder-open: mes projets

    • :addressbook: Silentium
      :book: Name: Silentium
      :rmxp: Maker: Eigenbau (C++, x86-SSE/AVX-Assembly, Ruby/Lua)

      :paper: Story
      :game: NPCs
      :cup: Scripts
      :drill: Ressis
      :ruler-triangle: Maps
      :compile: Gesamt
      (3+4)% 42 69% 0815 -17.438 103.38% ± 6.3mm²

      (Die Tabelle erfüllt lediglich satirische Zwecke.)
    • :compile: Onyx
      Eine 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.

      :exclamation: 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).
  • :locale: enfin

    Je ne peux pas parler français.
    C'est tout ce que Goodle et les restes de cours de français.
Signaturstand: 24.07.2013

Reborn

hat beim Stromkonzern schon Rabatt

  • »Reborn« ist der Autor dieses Themas

Motto: Wer noch was vom Wochenende weis, hat es nie erlebt!

  • Nachricht senden

20

Dienstag, 17. Februar 2009, 19:14

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?


Spoiler: OpenSource-Projects
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
zum Lesen den Text mit der Maus markieren

Social Bookmarks