VCLButtons(C++)

From RAD Studio Code Examples
Jump to: navigation, search

Description

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

The form should look like in the following image.

ButtonGroup1.JPG

After running the project and pressing the button, the form should look like in the following image.

ButtonGroup2.JPG

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.

ButtonGroup3.JPG

Code

//C++

//procedures and variables declaration
int Random_var;//generate a random number from 0 through 9
int GameMatrix[3][3];//set to be -10 for an empty position, 0 for the 0-player, 1 for the X-player
int Score;//used for verifying whether the game is over (equals 3 if the X-player wins, 0 if the 0-player wins)

implementation

void Validate() {
	int I, J;
	// verify the lines
	for (I = 0; I < 3; I++) {
		Score = 0;
		for (J = 0; J < 3; J++)
			Score += GameMatrix[I][J];
		if ((Score == 3) || (Score == 0))
			return;
	}
	// verify the main diagonal
	Score = 0;
	for (I = 0; I < 3; I++)
		Score += GameMatrix[I][I];
	if ((Score == 3) || (Score == 0))
		return;
	// verify the secondary diagonal
	Score = 0;
	for (I = 0; I < 3; I++)
		Score += GameMatrix[I][2 - I];
	if ((Score == 3) || (Score == 0))
		return;
	// verify the columns
	for (I = 0; I < 3; I++) {
		Score = 0;
		for (J = 0; J < 3; J++)
			Score += GameMatrix[J][I];
		if ((Score == 3) || (Score == 0))
			return;
	}
}

void StartGame() {
	int I, J;
	// show the button group and all the buttons' captions to an empty string
	Form1->ButtonGroup1->Visible = True;
	for (I = 0; I < 9; I++)
		Form1->ButtonGroup1->Items->Items[I]->Caption = "";
	// fill the game matrix with negative values, to help calculating the score
	for (I = 0; I < 3; I++)
		for (J = 0; J < 3; J++)
			GameMatrix[I][J] = -10;
}

void FillMatrix(int Pos, int I) {
	// set a specific item of the matrix to be the value given through the parameter
	switch (Pos) {
	case 0:
		GameMatrix[0][0] = I;
		break;
	case 1:
		GameMatrix[0][1] = I;
		break;
	case 2:
		GameMatrix[0][2] = I;
		break;
	case 3:
		GameMatrix[1][0] = I;
		break;
	case 4:
		GameMatrix[1][1] = I;
		break;
	case 5:
		GameMatrix[1][2] = I;
		break;
	case 6:
		GameMatrix[2][0] = I;
		break;
	case 7:
		GameMatrix[2][1] = I;
		break;
	case 8:
		GameMatrix[2][2] = I;
		break;
	default: ;
	}
}

void Complete() {
	int I;
	// 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; I <= 9; I++) {
		Random_var = Random(9);
		if (Form1->ButtonGroup1->Items->Items[Random_var]->Caption == "") {
			Form1->ButtonGroup1->Items->Items[Random_var]->Caption = "0";
			FillMatrix(Random_var, 0);
			break;
		}
	}
}

void __fastcall TForm1::FormCreate(TObject *Sender) {
	// 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";
}

//OnClick event handler for TButton
void __fastcall TForm1::Button1Click(TObject *Sender) {
	int I, J;
	ButtonGroup1->Align = alTop;
	ButtonGroup1->Width = Form1->Width - 10;
	ButtonGroup1->ButtonWidth = ButtonGroup1->Width / 3;
	ButtonGroup1->Height = ButtonGroup1->Width;
	ButtonGroup1->ButtonHeight = ButtonGroup1->Height / 3;
	ButtonGroup1->Enabled = True;
	StartGame();
}

//OnClick event handler for a button group item (TGrpButtonItems)
void __fastcall TForm1::ButtonGroup1Items0Click(TObject *Sender) {
	// when the user presses a button, set its caption to 'X', complete the GameMatrix,
	// verify if the game is over, set another button's caption to '0'
	if (ButtonGroup1->Items->Items[0]->Caption == "") {
		ButtonGroup1->Items->Items[0]->Caption = "X";
		GameMatrix[0][0] = 1;
		Validate();
		if (Score == 3) {
			ShowMessage("X WINS!");
			ButtonGroup1->Enabled = False;
		}
		else {
			Complete();
			Validate();
			if (Score == 0) {
				ShowMessage("0 WINS!");
				ButtonGroup1->Enabled = False;
			}
		}
	}
}

//[...]
//rewrite the previous procedure for all the other 8 button group items

Uses