VCLButtons(Delphi)

From RAD Studio Code Examples

Description

This example demonstrates how to use a TButtonGroup. This example requires the following components:

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