VCLButtons(Delphi)
Description
This example demonstrates how to use a TButtonGroup. This example requires the following components:
- A TButtonGroup object with 3 TGrpButtonItems objects
- A TButton object
The form should look like in the following image.
Error creating thumbnail: Unable to save thumbnail to destination
After running the project and pressing the button, the form should look like in the following image.
Error creating thumbnail: Unable to save thumbnail to destination
The user can press different buttons from the button group, setting their caption to X. The computer automatically places a 0 caption on an empty button, chosen randomly.
If a column, line, or diagonal is marked the same, a ShowMessage box appears, announcing the winner.
Error creating thumbnail: Unable to save thumbnail to destination
Code
//Delphi
//procedures and variables declaration
procedure Validate();
procedure StartGame();
procedure FillMatrix(Pos: Integer; I: Integer);
procedure Comp();
var
Form1: TForm1;
Random_var: Byte; //generate a random number from 0 through 9
GameMatrix: array[1..3,1..3] of Integer; //set to be -10 for an empty position, 0 for the 0-player, 1 for the X-player
Score: Integer; //used for verifying whether the game is over (equals 3 if the X-player wins, 0 if the 0-player wins)
implementation
procedure TForm1.FormCreate(Sender: TObject);
begin
// initialize the properties of the button group and other visual objects
Form1.Caption := 'Tic Tac Toe';
ButtonGroup1.ButtonHeight := 50;
ButtonGroup1.ButtonWidth := 50;
ButtonGroup1.Height := 170;
ButtonGroup1.Width := 170;
ButtonGroup1.Visible := False;
ButtonGroup1.BorderStyle := bsNone;
ButtonGroup1.Font.Size := ButtonGroup1.ButtonHeight - 10;
Button1.Align := alBottom;
Button1.Caption := 'START GAME';
end;
//procedures implementation
procedure FillMatrix(Pos: Integer;I: Integer);
begin
//set a specific item of the matrix to be the value given through the parameter
case Pos of
0: GameMatrix[1,1] := I;
1: GameMatrix[1,2] := I;
2: GameMatrix[1,3] := I;
3: GameMatrix[2,1] := I;
4: GameMatrix[2,2] := I;
5: GameMatrix[2,3] := I;
6: GameMatrix[3,1] := I;
7: GameMatrix[3,2] := I;
8: GameMatrix[3,3] := I;
end;
end;
procedure StartGame();
var I, J: Integer;
begin
//show the button group and all the buttons' captions to an empty string
Form1.ButtonGroup1.Visible := True;
for I := 0 to 8 do
Form1.ButtonGroup1.Items.Items[I].Caption := '';
//fill the game matrix with negative values, to help calculating the score
for I := 1 to 3 do
for J := 1 to 3 do
GameMatrix[I,J] := -10;
end;
procedure Validate;
var
I, J: Integer;
begin
// verify the lines
for i := 1 to 3 do
begin
Score := 0;
for j := 1 to 3 do Score := Score + GameMatrix[i,j];
if (Score = 3) or (Score = 0) then
Exit;
end;
// verify the main diagonal
Score := 0;
for i := 1 to 3 do Score := Score + GameMatrix[i,i];
if (Score = 3) or (Score = 0) then
Exit;
// verify the secondary diagonal
Score := 0;
for i := 1 to 3 do Score := Score + GameMatrix[i,4-i];
if (Score = 3) or (Score = 0) then
Exit;
// verify the columns
for i := 1 to 3 do
begin
Score := 0;
for j := 1 to 3 do Score := Score + GameMatrix[j,i];
if (Score = 3) or (Score = 0) then
Exit;
end;
end;
procedure Comp();
var I: Integer;
begin
//when the user presses a button and sets its caption to 'X', randomly find an
//unused button and set its caption to '0'
for I := 1 to 9 do
begin
Random_var := Random(9);
if (Form1.ButtonGroup1.Items.Items[Random_var].Caption = '') then
begin
Form1.ButtonGroup1.Items.Items[Random_var].Caption := '0';
FillMatrix(Random_var,0);
Break;
end;
end;
end;
//OnClick event handler for TButton
procedure TForm1.Button1Click(Sender: TObject);
var I, J: Integer;
begin
ButtonGroup1.Align := alTop;
ButtonGroup1.ButtonWidth := ButtonGroup1.Width div 3;
ButtonGroup1.Height := ButtonGroup1.Width;
ButtonGroup1.ButtonHeight := ButtonGroup1.Height div 3;
ButtonGroup1.Enabled := True;
StartGame();
end;
//OnClick event handler for a button group item (TGrpButtonItems)
procedure TForm1.ButtonGroup1Items0Click(Sender: TObject);
begin
//when the user presses a button, set its caption to 'X', complete the GameMatrix,
//verify whether X wins, set another button's caption to '0', verify whether 0 wins
if (ButtonGroup1.Items.Items[0].Caption = '') then
begin
ButtonGroup1.Items.Items[0].Caption := 'X';
GameMatrix[1,1] := 1;
Validate();
if Score = 3 then
begin
ShowMessage('X WINS!');
ButtonGroup1.Enabled := False;
end
else begin
Comp();
Validate();
if Score = 0 then begin
ShowMessage('0 WINS!');
ButtonGroup1.Enabled := False;
end;
end;
end;
end;
//[...]
//rewrite the previous procedure for all the other 8 button group items
end.
Uses
- Vcl.StdCtrls.TButton ( fr | de | ja )
- Vcl.StdCtrls.TButton.OnClick ( fr | de | ja )
- Vcl.StdCtrls.TButton.Caption ( fr | de | ja )
- Vcl.StdCtrls.TButton.Align ( fr | de | ja )
- Vcl.ButtonGroup.TButtonGroup ( fr | de | ja )
- Vcl.ButtonGroup.TButtonGroup.Items ( fr | de | ja )
- Vcl.ButtonGroup.TButtonGroup.Align ( fr | de | ja )
- Vcl.ButtonGroup.TButtonGroup.Enabled ( fr | de | ja )
- Vcl.ButtonGroup.TButtonGroup.Visible ( fr | de | ja )
- Vcl.ButtonGroup.TGrpButtonItems ( fr | de | ja )
- Vcl.ButtonGroup.TGrpButtonItems.Items ( fr | de | ja )
- Vcl.ButtonGroup.TGrpButtonItem ( fr | de | ja )
- Vcl.CategoryButtons.TBaseButtonItem.Caption ( fr | de | ja )
- Vcl.CategoryButtons.TBaseButtonItem.OnClick ( fr | de | ja )