-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathUMinesweeperGame.pas
112 lines (90 loc) · 3.02 KB
/
UMinesweeperGame.pas
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
unit UMinesweeperGame;
interface
uses
UMinesweeperDataController, Vcl.Forms, UDogFrame, UBoardFrame;
type
TMinesweeperGame = class
private
fDataController: TMineSweeperDataController;
fMainWindow: TForm;
fDogFrame: TDogFrame;
fBoardFrame: TBoardFrame;
fBoardWidth, fBoardHeight: Integer;
fNumberOfMines: Integer;
procedure DataControllerOnRestartRequired(Sender: TObject);
procedure DataControllerOnVictory(Sender: TObject);
public
constructor Create(aMainWindow: TForm; aDogFrame: TDogFrame; aBoardFrame: TBoardFrame);
destructor Destroy(); override;
procedure NewGame();
function GetGameTime(): TDateTime;
function GetUserRemainingMines(): Integer;
procedure HelpAreFlagsGood();
property BoardWidth: Integer read fBoardWidth write fBoardWidth;
property BoardHeight: Integer read fBoardHeight write fBoardHeight;
property NumberOfMines: Integer read fNumberOfMines write fNumberOfMines;
end;
implementation
uses
System.SysUtils, UHighScoresForm, Vcl.Dialogs;
{ TMinesweeperGame }
constructor TMinesweeperGame.Create(aMainWindow: TForm; aDogFrame: TDogFrame; aBoardFrame: TBoardFrame);
begin
fMainWindow := aMainWindow;
fDogFrame := aDogFrame;
fBoardFrame := aBoardFrame;
fBoardWidth := 10;
fBoardHeight := 10;
fNumberOfMines := 20;
end;
procedure TMinesweeperGame.DataControllerOnRestartRequired(Sender: TObject);
begin
NewGame();
end;
procedure TMinesweeperGame.DataControllerOnVictory(Sender: TObject);
begin
var highScoresForm := THighScoresForm.Create(nil);
try
highScoresForm.LoadForConfig(BoardWidth, BoardHeight, NumberOfMines);
highScoresForm.NewScore(GetGameTime());
highScoresForm.ShowModal();
finally
FreeAndNil(highScoresForm);
end;
end;
destructor TMinesweeperGame.Destroy;
begin
FreeAndNil(fDataController);
inherited;
end;
function TMinesweeperGame.GetGameTime: TDateTime;
begin
if fDataController.IsRunning then
result := fDataController.GetEndTime() - fDataController.GetStartTime()
else
result := 0;
end;
function TMinesweeperGame.GetUserRemainingMines: Integer;
begin
result := fDataController.GetNumberOfMines() - fDataController.GetNumberOfFlags();
end;
procedure TMinesweeperGame.HelpAreFlagsGood;
begin
if fDataController.CheckFlagCorrectness() then
ShowMessage('The all-knowing dog thinks your flags are good.')
else
ShowMessage('The all-knowing dog does not like your flags.');
end;
procedure TMinesweeperGame.NewGame;
begin
var newDataController := TMineSweeperDataController.Create(fBoardWidth, fBoardHeight, fNumberOfMines);
newDataController.OnRestartRequired := DataControllerOnRestartRequired;
newDataController.OnVictory := DataControllerOnVictory;
fBoardFrame.Controller := newDataController;
fDogFrame.Controller := newDataController;
FreeAndNil(fDataController);
fDataController := newDataController;
fMainWindow.ClientWidth := fBoardFrame.Left + fBoardFrame.GetPreferredWidth();
fMainWindow.ClientHeight := fBoardFrame.Top + fBoardFrame.GetPreferredHeight();
end;
end.