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
110
111
112
113
114
115
116
117
|
package body Grids is
function Create
(X, Y, W, H : in Integer;
Text : in String)
return Grid is
begin
return This : Grid :=
(FLTK.Widgets.Widget'(FLTK.Widgets.Create (X, Y, W, H, Text)) with
Cells => Square_Vector_Vectors.Empty_Vector,
Rows => 0, Cols => 0);
end Create;
function Create
(X, Y : in Integer)
return Grid is
begin
return Create (X, Y, 0, 0, "Sokoban Grid");
end Create;
procedure Draw
(This : in out Grid) is
begin
for Y in Integer range 1 .. This.Rows loop
for X in Integer range 1 .. This.Cols loop
This.Cells.Reference (X).Reference (Y).Draw
(This.Get_X + (X - 1) * Step,
This.Get_Y + (Y - 1) * Step);
end loop;
end loop;
end Draw;
procedure Set_Cols
(This : in out Grid;
To : in Natural) is
begin
This.Cells.Set_Length (Ada.Containers.Count_Type (To));
for X in Integer range This.Cols + 1 .. To loop
This.Cells.Replace_Element (X, Square_Vectors.Empty_Vector);
This.Cells.Reference (X).Set_Length (Ada.Containers.Count_Type (This.Rows));
for Y in Integer range 1 .. This.Rows loop
This.Cells.Reference (X).Replace_Element (Y, Squares.Void);
end loop;
end loop;
This.Cols := To;
This.Resize (Step * This.Cols, This.Get_H);
end Set_Cols;
procedure Set_Rows
(This : in out Grid;
To : in Natural) is
begin
for X in Integer range 1 .. This.Cols loop
This.Cells.Reference (X).Set_Length (Ada.Containers.Count_Type (To));
for Y in Integer range This.Rows + 1 .. To loop
This.Cells.Reference (X).Replace_Element (Y, Squares.Void);
end loop;
end loop;
This.Rows := To;
This.Resize (This.Get_W, Step * This.Rows);
end Set_Rows;
function In_Bounds
(This : in Grid;
X, Y : in Integer)
return Boolean is
begin
return X in 1 .. This.Cols and Y in 1 .. This.Rows;
end In_Bounds;
function Get_Square
(This : in Grid;
X, Y : in Integer)
return Squares.Square is
begin
if not This.In_Bounds (X, Y) then
return Squares.Void;
else
return This.Cells.Element (X).Element (Y);
end if;
end Get_Square;
procedure Set_Square
(This : in out Grid;
X, Y : in Integer;
Item : in Squares.Square) is
begin
This.Cells.Reference (X).Reference (Y) := Item;
end Set_Square;
end Grids;
|