unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, Forms, Controls, Graphics,
Dialogs, StdCtrls, Grids, ExtCtrls, LCLType;
type
{ TForm1 }
TForm1 = class(TForm)
BtnEXIT: TButton;
BtnGenerate: TButton;
BtnRestart: TButton;
LabelNumbersText: TLabel;
Panel1: TPanel;
Panel2: TPanel;
PanelNUMBER: TPanel;
PanelStringGrid: TPanel;
PanelButtons: TPanel;
StringGrid1: TStringGrid;
procedure BtnEXITClick(Sender: TObject);
procedure BtnGenerateClick(Sender: TObject);
procedure BtnRestartClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
private
FUsedNumbers: array[1..75] of Boolean;
FRemainingNumbers: Integer;
procedure Generate;
procedure ResetGame;
function GenerateRandomNumber: Integer;
public
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
// Procuderes + Function
procedure TForm1.FormCreate(Sender: TObject);
begin
// Initialize the game at startup
ResetGame;
end;
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
case Key of
VK_F12 : BtnEXIT.Click;
VK_SPACE : //BtnGenerate.Click;
end;
end;
procedure TForm1.ResetGame;
var
i, j: Integer;
begin
// Initialize the StringGrid
StringGrid1.ColCount := 15;
StringGrid1.RowCount := 5;
//
StringGrid1.DefaultRowHeight := 110;
StringGrid1.DefaultColWidth := 85;
//
StringGrid1.Canvas.Font.Color:= clBlack ;
StringGrid1.FixedCols := 0;
StringGrid1.FixedRows := 0;
// Fill the StringGrid with numbers from 1 to 75
for i := 0 to 4 do
for j := 0 to 14 do
begin
StringGrid1.Cells[j, i] := IntToStr(i * 15 + j + 1);
StringGrid1.Canvas.Brush.Color := clWhite;
StringGrid1.Canvas.FillRect(StringGrid1.CellRect(j, i));
StringGrid1.Canvas.TextOut(StringGrid1.CellRect(j, i).Left + 10,
StringGrid1.CellRect(j, i).Top + 10,
IntToStr(i * 15 + j + 1));
end;
// Reset the array for used numbers
for i := 1 to 75 do FUsedNumbers[i] := False;
FRemainingNumbers := 75;
PanelNUMBER.Caption:= '';;
PanelNUMBER.Color:= clSilver;
end;
procedure TForm1.Generate;
var
Number: Integer;
Row, Col: Integer;
begin
//Generate a random number that has not yet been used
Number := GenerateRandomNumber;
if Number = -1 then
begin
ShowMessage('All numbers have already been drawn!');
Exit;
end;
// Show the generated number
PanelNUMBER.Caption:= IntToStr(Number);
PanelNUMBER.Color:= clYellow;;
// Find the row and column in the StringGrid
Row := (Number - 1) div 15;
Col := (Number - 1) mod 15;
// Highlight the number in the StringGrid
StringGrid1.Canvas.Brush.Color := ($FFFF00); // clYellow;
StringGrid1.Canvas.FillRect(StringGrid1.CellRect(Col, Row));
StringGrid1.Canvas.TextOut(StringGrid1.CellRect(Col, Row).Left + 10,
StringGrid1.CellRect(Col, Row).Top + 10, IntToStr(Number));
end;
procedure TForm1.BtnEXITClick(Sender: TObject);
begin
Application.Terminate;
end;
procedure TForm1.BtnGenerateClick(Sender: TObject);
begin
// Generate the game
Generate;
end;
procedure TForm1.BtnRestartClick(Sender: TObject);
begin
// Restart the game
ResetGame;
end;
// FUNCTION
function TForm1.GenerateRandomNumber: Integer;
var
Num: Integer;
begin
if FRemainingNumbers = 0 then
begin
Result := -1; // No more nombers left
Exit;
end;
// Choose any number that hasn't been used yet
repeat
Num := Random(75) + 1;
until not FUsedNumbers[Num];
// Mark the number as used
FUsedNumbers[Num] := True;
Dec(FRemainingNumbers);
Result := Num;
end;
end.