with Ada.Calendar;
with Ada.Environment_Variables;
package Game is
type t_Direction is (Up, Down, Right, Left);
type t_Game_Status is (Playing, Won, Lost);
Environment_Size : constant String := "PLAY_2048_SIZE";
Default_Length : constant := 4;
Board_Length : constant Natural :=
(if Ada.Environment_Variables.Exists (Environment_Size) then
Natural'Value (Ada.Environment_Variables.Value (Environment_Size))
else Default_Length);
subtype t_Board_Size is Natural range 1 .. Board_Length;
subtype t_Cell_Count is Natural range 0 .. Board_Length ** 2;
type t_List is array (Positive range <>) of Natural;
subtype t_Row is t_List (t_Board_Size);
type t_Board is array (t_Board_Size) of t_Row;
type t_Board_State is record
Board : t_Board;
Score : Natural;
Blanks : t_Cell_Count;
Start_Time : Ada.Calendar.Time;
Game_Status : t_Game_Status;
end record;
function Elapsed_Time (State : t_Board_State) return Duration;
procedure Reset_Game (State : out t_Board_State);
procedure Restart_Game (State : out t_Board_State);
procedure Add_Block (State : in out t_Board_State);
procedure Move
(Direction : t_Direction;
State : t_Board_State;
New_State : out t_Board_State);
procedure Update_Status (State : in out t_Board_State);
function Has_Won (State : t_Board_State) return Boolean is
(State.Game_Status = Won);
function Has_Lost (State : t_Board_State) return Boolean is
(State.Game_Status = Lost);
end Game;