diff options
author | rexim <reximkut@gmail.com> | 2024-03-17 01:59:06 +0700 |
---|---|---|
committer | rexim <reximkut@gmail.com> | 2024-03-17 01:59:06 +0700 |
commit | ee5d0dae7738e0cb480465ae0ecd6e15fd8ed118 (patch) | |
tree | a1691e76f2ebe6b2e9da91afacd532f8398c500f | |
parent | 074c3b9d787aacd13ba87fd49b01537fb99bbac0 (diff) |
Optimize path finding, remove custom queue.
-rw-r--r-- | game.adb | 12 | ||||
-rw-r--r-- | queue.adb | 43 | ||||
-rw-r--r-- | queue.ads | 18 |
3 files changed, 4 insertions, 69 deletions
@@ -12,7 +12,6 @@ use Ada.Containers; with Ada.Strings.Fixed; use Ada.Strings.Fixed; with Ada.Strings; with Ada.Exceptions; use Ada.Exceptions; -with Queue; procedure Game is DEVELOPMENT : constant Boolean := True; @@ -267,9 +266,6 @@ procedure Game is Items: Hashed_Map_Items.Map; end record; - package IVector2_Queue is new Queue(Item => IVector2); - use IVector2_Queue; - type Game_State is record Map: Map_Access := Null; Player: Player_State; @@ -287,7 +283,6 @@ procedure Game is Checkpoint: Checkpoint_State; - Q: IVector2_Queue.Queue; Duration_Of_Last_Turn: Double; end record; @@ -411,10 +406,11 @@ procedure Game is if not Boss_Can_Stand_Here(Game, New_Position, Me) then exit; end if; - if Game.Bosses(Me).Path(New_Position.Y, New_Position.X) < 0 then - Game.Bosses(Me).Path(New_Position.Y, New_Position.X) := Game.Bosses(Me).Path(Position.Y, Position.X) + 1; - Q.Append(New_Position); + if Game.Bosses(Me).Path(New_Position.Y, New_Position.X) >= 0 then + exit; end if; + Game.Bosses(Me).Path(New_Position.Y, New_Position.X) := Game.Bosses(Me).Path(Position.Y, Position.X) + 1; + Q.Append(New_Position); Step(Dir, New_Position); end loop; end; diff --git a/queue.adb b/queue.adb deleted file mode 100644 index 4745ee8..0000000 --- a/queue.adb +++ /dev/null @@ -1,43 +0,0 @@ -with Ada.Unchecked_Deallocation; - -package body Queue is - procedure Delete_Items_Array is new Ada.Unchecked_Deallocation(Items_Array, Items_Array_Access); - - procedure Grow(Q: in out Queue) is - New_Items: constant Items_Array_Access := new Items_Array(0..Q.Items'Length*2-1); - begin - for Offset in Q.Items'Range loop - New_Items(Offset) := Q.Items((Q.Start + Offset) mod Q.Items'Length); - end loop; - Delete_Items_Array(Q.Items); - Q.Items := New_Items; - Q.Start := 0; - end; - - procedure Enqueue(Q: in out Queue; X: Item) is - begin - if Q.Items = null then - Q.Items := new Items_Array(0..INIT_CAPACITY-1); - end if; - - if Q.Count >= Q.Items'Length then - Grow(Q); - end if; - - Q.Items((Q.Start + Q.Count) mod Q.Items'Length) := X; - Q.Count := Q.Count + 1; - end; - - function Dequeue(Q: in out Queue; X: out Item) return Boolean is - begin - if Q.Count <= 0 then - return False; - end if; - - X := Q.Items(Q.Start); - Q.Start := (Q.Start + 1) mod Q.Items'Length; - Q.Count := Q.Count - 1; - - return True; - end; -end Queue; diff --git a/queue.ads b/queue.ads deleted file mode 100644 index fdfa484..0000000 --- a/queue.ads +++ /dev/null @@ -1,18 +0,0 @@ -generic - type Item is private; -package Queue is - INIT_CAPACITY: constant Integer := 256; - - type Items_Array is array (Natural range <>) of Item; - type Items_Array_Access is access Items_Array; - - type Queue is record - Items: Items_Array_Access := null; - Start: Integer := 0; - Count: Integer := 0; - end record; - - procedure Grow(Q: in out Queue); - procedure Enqueue(Q: in out Queue; X: Item); - function Dequeue(Q: in out Queue; X: out Item) return Boolean; -end Queue; |