source: trunk/Board.pas

Last change on this file was 109, checked in by chronos, 16 months ago
  • Modified: Added more score information.
  • Fixed: Record only non-zero scores.
File size: 4.0 KB
Line 
1unit Board;
2
3interface
4
5uses
6 Classes, SysUtils, Tile, RegistryEx;
7
8type
9 TMoveDirection = (drNone, drLeft, drUp, drRight, drDown);
10
11 { TBoard }
12
13 TBoard = class
14 private
15 FSize: TPoint;
16 procedure SetSize(AValue: TPoint);
17 public
18 Tiles: array of array of TTile;
19 procedure Assign(Source: TBoard);
20 procedure Clear;
21 procedure ClearMerged;
22 function GetBiggestTile: Integer;
23 function GetValueSum: Integer;
24 function GetHighestTileValue: Integer;
25 function GetEmptyTilesCount: Integer;
26 procedure GetEmptyTiles(EmptyTiles: TTiles);
27 procedure SaveToRegistry(Reg: TRegistryEx; RegContext: TRegistryContext);
28 procedure LoadFromRegistry(Reg: TRegistryEx; RegContext: TRegistryContext);
29 destructor Destroy; override;
30 property Size: TPoint read FSize write SetSize;
31 end;
32
33
34implementation
35
36{ TBoard }
37
38procedure TBoard.SetSize(AValue: TPoint);
39var
40 X, Y: Integer;
41begin
42 if FSize = AValue then Exit;
43 for Y := 0 to FSize.Y - 1 do
44 for X := 0 to FSize.X - 1 do
45 Tiles[Y, X].Free;
46 FSize := AValue;
47 SetLength(Tiles, FSize.Y, FSize.X);
48 for Y := 0 to FSize.Y - 1 do
49 for X := 0 to FSize.X - 1 do begin
50 Tiles[Y, X] := TTile.Create;
51 Tiles[Y, X].Index := Point(X, Y);
52 end;
53end;
54
55procedure TBoard.Assign(Source: TBoard);
56var
57 X, Y: Integer;
58begin
59 Size := Source.Size;
60 for Y := 0 to Size.Y - 1 do
61 for X := 0 to Size.X - 1 do
62 Tiles[Y, X].Assign(Source.Tiles[Y, X]);
63end;
64
65procedure TBoard.GetEmptyTiles(EmptyTiles: TTiles);
66var
67 X, Y: Integer;
68begin
69 EmptyTiles.Clear;
70 for Y := 0 to Size.Y - 1 do
71 for X := 0 to Size.X - 1 do
72 if (Tiles[Y, X].Value = 0) and not Tiles[Y, X].Disabled then
73 EmptyTiles.Add(Tiles[Y, X]);
74end;
75
76procedure TBoard.SaveToRegistry(Reg: TRegistryEx; RegContext: TRegistryContext);
77var
78 X, Y: Integer;
79begin
80 with Reg do begin
81 CurrentContext := RegContext;
82
83 WriteInteger('SizeX', Size.X);
84 WriteInteger('SizeY', Size.Y);
85 for Y := 0 to Size.Y - 1 do begin
86 for X := 0 to Size.X - 1 do begin
87 Tiles[Y, X].SaveToRegistry(Reg, TRegistryContext.Create(RegContext.RootKey, RegContext.Key + '\Tile' + IntToStr(X) + 'x' + IntToStr(Y)));
88 end;
89 end;
90 end;
91end;
92
93procedure TBoard.LoadFromRegistry(Reg: TRegistryEx; RegContext: TRegistryContext);
94var
95 X, Y: Integer;
96begin
97 with Reg do begin
98 CurrentContext := RegContext;
99
100 Size := Point(ReadIntegerWithDefault('SizeX', 4),
101 ReadIntegerWithDefault('SizeY', 4));
102 for Y := 0 to Size.Y - 1 do begin
103 for X := 0 to Size.X - 1 do begin
104 Tiles[Y, X].LoadFromRegistry(Reg, TRegistryContext.Create(RegContext.RootKey, RegContext.Key + '\Tile' + IntToStr(X) + 'x' + IntToStr(Y)));
105 end;
106 end;
107 end;
108end;
109
110destructor TBoard.Destroy;
111begin
112 Size := Point(0, 0);
113 inherited;
114end;
115
116procedure TBoard.ClearMerged;
117var
118 X, Y: Integer;
119begin
120 for Y := 0 to Size.Y - 1 do
121 for X := 0 to Size.X - 1 do
122 Tiles[Y, X].Merged := False;
123end;
124
125function TBoard.GetBiggestTile: Integer;
126var
127 X, Y: Integer;
128begin
129 Result := 0;
130 for Y := 0 to Size.Y - 1 do
131 for X := 0 to Size.X - 1 do
132 if not Tiles[Y, X].Disabled and
133 not Tiles[Y, X].Unmergeable and
134 (Tiles[Y, X].Value > Result) then Result := Tiles[Y, X].Value;
135end;
136
137function TBoard.GetValueSum: Integer;
138var
139 X, Y: Integer;
140begin
141 Result := 0;
142 for Y := 0 to Size.Y - 1 do
143 for X := 0 to Size.X - 1 do
144 Inc(Result, Tiles[Y, X].Value);
145end;
146
147function TBoard.GetEmptyTilesCount: Integer;
148var
149 X, Y: Integer;
150begin
151 Result := 0;
152 for Y := 0 to Size.Y - 1 do
153 for X := 0 to Size.X - 1 do
154 if (Tiles[Y, X].Value = 0) and not Tiles[Y, X].Disabled then
155 Inc(Result);
156end;
157
158function TBoard.GetHighestTileValue: Integer;
159var
160 X, Y: Integer;
161begin
162 Result := 0;
163 for Y := 0 to Size.Y - 1 do
164 for X := 0 to Size.X - 1 do
165 if Result < Tiles[Y, X].Value then Result := Tiles[Y, X].Value;
166end;
167
168procedure TBoard.Clear;
169var
170 X, Y: Integer;
171begin
172 for Y := 0 to Size.Y - 1 do
173 for X := 0 to Size.X - 1 do
174 Tiles[Y, X].Clear;
175end;
176
177end.
178
Note: See TracBrowser for help on using the repository browser.