From ee5d0dae7738e0cb480465ae0ecd6e15fd8ed118 Mon Sep 17 00:00:00 2001 From: rexim Date: Sun, 17 Mar 2024 01:59:06 +0700 Subject: Optimize path finding, remove custom queue. --- game.adb | 12 ++++-------- queue.adb | 43 ------------------------------------------- queue.ads | 18 ------------------ 3 files changed, 4 insertions(+), 69 deletions(-) delete mode 100644 queue.adb delete mode 100644 queue.ads diff --git a/game.adb b/game.adb index 7dbe7f0..3d2f625 100644 --- a/game.adb +++ b/game.adb @@ -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; -- cgit v1.2.3