Develop and Download Open Source Software

Browse Subversion Repository

Contents of /trunc/mine_sweeper/Unit1.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2 - (show annotations) (download) (as text)
Tue Apr 4 10:02:13 2017 UTC (7 years, 1 month ago) by yamat0jp
File MIME type: text/x-pascal
File size: 7845 byte(s)
悪意あるソフトウェアと判断されているようです touch
1 unit Unit1;
2
3 interface
4
5 uses
6 System.SysUtils, System.Types, System.UITypes, System.Classes,
7 System.Variants,
8 FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, FMX.StdCtrls;
9
10 const
11 WidCount = 10;
12 HeiCount = 10;
13
14 var
15 Size :integer = 64;
16
17 type
18 TItemState = (Flag, Down, Normal);
19
20 TItem = class
21 State: TItemState;
22 Number: integer;
23 end;
24
25 TForm1 = class(TForm)
26 Panel1: TPanel;
27 Panel2: TPanel;
28 ImageControl1: TImageControl;
29 SpeedButton1: TSpeedButton;
30 SpeedButton2: TSpeedButton;
31 Panel3: TPanel;
32 Button1: TButton;
33 Button2: TButton;
34 Label1: TLabel;
35 Label2: TLabel;
36 procedure FormCreate(Sender: TObject);
37 procedure Panel3Paint(Sender: TObject; Canvas: TCanvas;
38 const ARect: TRectF);
39 procedure Panel3MouseDown(Sender: TObject; Button: TMouseButton;
40 Shift: TShiftState; X, Y: Single);
41 procedure FormDestroy(Sender: TObject);
42 procedure Button2Click(Sender: TObject);
43 procedure Button1Click(Sender: TObject);
44 private
45 { private ���� }
46 FItem: array [0 .. WidCount - 1, 0 .. HeiCount - 1] of TItem;
47 Dummy: TItem;
48 function GetItem(X, Y: integer): TItem;
49 procedure SeTItem(X, Y: integer; const Value: TItem);
50 public
51 { public ���� }
52 GameOver: Boolean;
53 Count: integer;
54 procedure CalNumber;
55 procedure OpenAround(X, Y: integer);
56 function CheckGame: Boolean;
57 property Items[X, Y: integer]: TItem read GetItem write SeTItem;
58 end;
59
60 var
61 Form1: TForm1;
62
63 implementation
64
65 {$R *.fmx}
66
67 procedure TForm1.Button1Click(Sender: TObject);
68 var
69 i: integer;
70 j: integer;
71 s: TItem;
72 begin
73 GameOver := false;
74 for i := 0 to WidCount - 1 do
75 for j := 0 to HeiCount - 1 do
76 begin
77 s := Items[i, j];
78 s.State := TItemState.Normal;
79 s.Number := 0;
80 end;
81 Randomize;
82 for i := 0 to Random(20) do
83 Items[Random(WidCount - 1), Random(HeiCount - 1)].Number := -1;
84 CalNumber;
85 Label1.Text := IntToStr(Count);
86 Panel3.Repaint;
87 end;
88
89 procedure TForm1.Button2Click(Sender: TObject);
90 begin
91 Close;
92 end;
93
94 procedure TForm1.CalNumber;
95 var
96 i: integer;
97 j: integer;
98 X: integer;
99 Y: integer;
100 k: integer;
101 begin
102 Count := 0;
103 for X := 0 to WidCount - 1 do
104 for Y := 0 to HeiCount - 1 do
105 if Items[X, Y].Number <> -1 then
106 begin
107 k := 0;
108 for i := -1 to 1 do
109 for j := -1 to 1 do
110 if Items[X + i, Y + j].Number = -1 then
111 inc(k);
112 Items[X, Y].Number := k;
113 end
114 else
115 begin
116 inc(Count);
117 end;
118 end;
119
120 function TForm1.CheckGame: Boolean;
121 var
122 i, j: integer;
123 begin
124 result := true;
125 for i := 0 to WidCount - 1 do
126 for j := 0 to HeiCount - 1 do
127 if (Items[i, j].Number = -1) and (Items[i, j].State <> TItemState.Flag)
128 then
129 begin
130 result := false;
131 Exit;
132 end;
133 end;
134
135 procedure TForm1.FormCreate(Sender: TObject);
136 var
137 i: integer;
138 j: integer;
139 begin
140 {$IFDEF MSWINDOWS}
141 Size := 32;
142 {$ENDIF}
143 Panel3.Height := Size * HeiCount;
144 Panel3.Width := Panel3.Height;
145 Dummy := TItem.Create;
146 for i := 0 to WidCount - 1 do
147 for j := 0 to HeiCount - 1 do
148 Items[i, j] := TItem.Create;
149 Button1Click(Sender);
150 end;
151
152 procedure TForm1.FormDestroy(Sender: TObject);
153 var
154 i: integer;
155 j: integer;
156 begin
157 Dummy.Free;
158 for i := 0 to WidCount - 1 do
159 for j := 0 to HeiCount - 1 do
160 Items[i, j].Free;
161 end;
162
163 function TForm1.GetItem(X, Y: integer): TItem;
164 begin
165 if (X >= 0) and (X <= WidCount - 1) and (Y >= 0) and (Y <= HeiCount - 1) then
166 begin
167 result := FItem[X, Y];
168 end
169 else
170 begin
171 result := Dummy;
172 end;
173 end;
174
175 procedure TForm1.OpenAround(X, Y: integer);
176 var
177 i: integer;
178 j: integer;
179 s: TItem;
180 begin
181 s := Items[X, Y];
182 if (s <> Dummy) and (s.State = TItemState.Normal) and (s.Number = 0) then
183 begin
184 s.State := TItemState.Down;
185 for i := -1 to 1 do
186 for j := -1 to 1 do
187 begin
188 s := Items[X + i, Y + j];
189 if (s.State = TItemState.Normal) and (s.Number = 0) then
190 begin
191 OpenAround(X + i, Y + j);
192 end
193 else
194 begin
195 s.State := TItemState.Down;
196 end;
197 end;
198 end;
199 end;
200
201 procedure TForm1.Panel3MouseDown(Sender: TObject; Button: TMouseButton;
202 Shift: TShiftState; X, Y: Single);
203 var
204 i, j, k: integer;
205 s: TItem;
206 begin
207 if GameOver = true then
208 Exit;
209 i:=Trunc(X / Size);
210 j:=Trunc(Y / Size);
211 s := Items[i, j];
212 if SpeedButton1.IsPressed = true then
213 begin
214 if s.State = TItemState.Normal then
215 begin
216 case s.Number of
217 - 1:
218 begin
219 s.State := TItemState.Down;
220 GameOver := true;
221 end;
222 0:
223 OpenAround(i, j);
224 else
225 s.State := TItemState.Down;
226 end;
227 end;
228 end
229 else
230 begin
231 case s.State of
232 TItemState.Normal:
233 begin
234 k := 0;
235 for i := 0 to WidCount - 1 do
236 for j := 0 to HeiCount - 1 do
237 if Items[i, j].State = TItemState.Flag then
238 inc(k);
239 if k >= Count then
240 Exit;
241 s.State := TItemState.Flag;
242 end;
243 TItemState.Flag:
244 s.State := TItemState.Normal;
245 end;
246 end;
247 if GameOver = false then
248 GameOver := CheckGame;
249 Panel3.Repaint;
250 end;
251
252 procedure TForm1.Panel3Paint(Sender: TObject; Canvas: TCanvas;
253 const ARect: TRectF);
254 var
255 i: integer;
256 j: integer;
257 k: integer;
258 s: TRectF;
259 t: TAlphaColor;
260 begin
261 Canvas.Fill.Color := TAlphaColorRec.Gray;
262 Canvas.FillRect(RectF(0, 0, Panel3.Width, Panel3.Height), 0, 0, [], 1);
263 for i := 0 to WidCount - 1 do
264 for j := 0 to HeiCount - 1 do
265 begin
266 s := RectF(i * Size, j * Size, (i + 1) * Size, (j + 1) * Size);
267 k := Items[i, j].Number;
268 case Items[i, j].State of
269 TItemState.Flag:
270 Canvas.DrawBitmap(ImageControl1.Bitmap, RectF(16, 0, 32, 16), s, 1);
271 TItemState.Down:
272 begin
273 if k = -1 then
274 begin
275 Canvas.Fill.Color := TAlphaColorRec.Red;
276 end
277 else
278 begin
279 Canvas.Fill.Color := TAlphaColorRec.White;
280 end;
281 Canvas.FillRect(s, 0, 0, [], 1);
282 case k of
283 1:
284 t := TAlphaColorRec.Blue;
285 2:
286 t := TAlphaColorRec.Green;
287 3:
288 t := TAlphaColorRec.Red;
289 4:
290 t := TAlphaColorRec.Darkblue;
291 5:
292 t := TAlphaColorRec.Brown;
293 6:
294 t := TAlphaColorRec.Black;
295 7:
296 t := TAlphaColorRec.Darkviolet;
297 8:
298 t := TAlphaColorRec.Aqua;
299 end;
300 if k > 0 then
301 begin
302 Canvas.Fill.Color := t;
303 Canvas.FillText(s, IntToStr(k), false, 1, [], TTextAlign.Center);
304 end;
305 end;
306 end;
307 if (GameOver = true) and (k = -1) then
308 Canvas.DrawBitmap(ImageControl1.Bitmap, RectF(32, 0, 48, 16), s, 0.5);
309 end;
310 Canvas.Stroke.Color := TAlphaColorRec.White;
311 for i := 0 to WidCount - 1 do
312 Canvas.DrawLine(PointF(i * Size, 0), PointF(i * Size, Panel3.Height), 1);
313 for j := 0 to HeiCount - 1 do
314 Canvas.DrawLine(PointF(0, j * Size), PointF(Panel3.Width, j * Size), 1);
315 end;
316
317 procedure TForm1.SeTItem(X, Y: integer; const Value: TItem);
318 begin
319 if (X >= 0) and (X <= WidCount - 1) and (Y >= 0) and (Y <= HeiCount - 1) then
320 FItem[X, Y] := Value;
321 end;
322
323 end.

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26