Ce que vous pouvez faire est de définir une taille maximale d'un bouton, puis divisez simplement la taille du conteneur pour trouver le nombre de boutons que vous souhaitez. Cette partie est facile, ajouter des boutons n'est pas vraiment un problème. Vous pouvez utiliser la propriété Tag
pour garder une trace de la position des boutons dans le tableau tic tac toe. Je pense cependant que puisque vous avez un maximum de boutons, vous pouvez créer les boutons 9x9 depuis le début, en mettant simplement leur propriété Visible
à false
en les affichant comme vous en avez besoin. La routine de redimensionnement n'a alors qu'à redimensionner les boutons.
J'ai fourni un exemple simple de la façon de créer les boutons dans le constructeur de formulaire, notez cependant que ceci est extrêmement simple, mais sert simplement à illustrer mon point ci-dessus. Notez que j'utilise un tableau à une seule dimension, au lieu d'un tableau à deux dimensions, afin de faciliter la recherche d'un gagnant plus tard.
// Declare constants used for our tic tac toe example
const int minButtons = 3; // The minimum number of buttons in either direction
const int maxButtons = 9; // The maximum number of buttons in either direction
const int buttonDistance = 5; // The distance between the buttons
const int buttonSize = 50; // The targeted button size.
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
// Create our buttons and set some tag value to identify them later.
for (int i = 0; i < maxButtons; i++)
{
for (int j = 0; j < maxButtons; j++)
{
int idx = i * maxButtons + j;
buttons[idx] = new TButton(this);
buttons[idx]->Parent = this;
// Assign the on click event (we define this later)
buttons[idx]->OnClick = ButtonPressed;
}
}
// Let the X player start
currentPlayer = "X";
}
Après avoir créé les boutons que vous pouvez contrôler le nombre pour afficher et la taille de ces sous les formes OnResize
événement:
void __fastcall TForm1::FormResize(TObject *Sender)
{
// Calculate the number of buttons to display.
int btd = std::min(ClientWidth, ClientHeight)/buttonSize;
// Make sure we have atleast minButtons and at most maxButtons buttons.
btd = (btd < minButtons) ? minButtons : (btd > maxButtons) ? maxButtons : btd;
// Write the tic tac toe board size in the form caption
Caption = IntToStr(btd) + " x " + IntToStr(btd);
// Calculate the new button size.
int buttonWidth = (ClientWidth - (btd - 1) * buttonDistance)/btd;
int buttonHeight = (ClientHeight - (btd - 1) * buttonDistance)/btd;
// Show and position buttons
for (int i = 0; i < maxButtons; i++)
{
for (int j = 0; j < maxButtons; j++)
{
int idx = i * maxButtons + j;
if (i < btd && j < btd)
{
buttons[idx]->Visible = true;
buttons[idx]->Width = buttonWidth;
buttons[idx]->Height = buttonHeight;
buttons[idx]->Left = i * buttonWidth + i * buttonDistance;
buttons[idx]->Top = j * buttonHeight + j * buttonDistance;
}
else
{
buttons[idx]->Visible = false;
}
}
}
}
Maintenant, nous avons besoin du code pour traiter l'entrée d'utilisateur, qui est à chaque fois que l'utilisateur appuie sur l'un de nos boutons, nous passons le paramètre Sender à un TButton, de cette façon nous pouvons faire le clic sur une seule fonction.
void __fastcall TForm1::ButtonPressed(TObject *Sender)
{
TButton *btn = dynamic_cast<TButton*>(Sender);
if (btn)
{
// Check if this button is free to be pressed
if (btn->Enabled)
{
btn->Caption = currentPlayer;
btn->Enabled = false;
if (IsWinner())
ShowMessage(currentPlayer + " is the winner :)");
if (currentPlayer == "X") currentPlayer = "O";
else currentPlayer = "X";
}
}
}
Enfin nous ajoutons une fonction simple pour vérifier si le joueur actuel est le gagnant, cela peut évidemment être plus intelligent et beaucoup plus optimisé, mais cela est juste un exemple simple servant en tant que source d'inspiration:
bool __fastcall TForm1::IsWinner()
{
bool foundWinner;
// Calculate the number of buttons to display.
int btd = std::min(ClientWidth, ClientHeight)/buttonSize;
// Make sure we have atleast minButtons and at most maxButtons buttons.
btd = (btd < minButtons) ? minButtons : (btd > maxButtons) ? maxButtons : btd;
// Check for a winner in the direction top to bottom
for (int i = 0; i < btd; i++)
{
foundWinner = true;
for (int j = 0; j < btd; j++)
{
if (buttons[i * maxButtons + j]->Caption != currentPlayer)
foundWinner = false;
}
if (foundWinner) return true;
}
// Check for a winner in the direction left to right
for (int j = 0; j < btd; j++)
{
foundWinner = true;
for (int i = 0; i < btd; i++)
{
if (buttons[i * maxButtons + j]->Caption != currentPlayer)
foundWinner = false;
}
if (foundWinner) return true;
}
// Check for a winner in the diagonal directions
foundWinner = true;
for (int i = 0; i < btd; i++)
{
if (buttons[i * maxButtons + i]->Caption != currentPlayer)
foundWinner = false;
}
if (foundWinner) return true;
foundWinner = true;
for (int i = btd - 1; i >= 0; i--)
{
if (buttons[i * maxButtons + i]->Caption != currentPlayer)
foundWinner = false;
}
return foundWinner;
}
de toute évidence, il y a beaucoup reste à faire, le traitement de l'ensemble qui a gagné (mise à jour vient d'ajouter une simple vérification), la création d'une interface pour commencer un nouveau jeu, etc. en plus le jeu est pas tout à fait l'erreur preuve, dans la version actuelle, le jeu ajoute des boutons supplémentaires lorsque vous redimensionnez même après que le jeu a sta Ce n'est probablement pas ce que vous voulez, mais la résolution de cette question est simple: ajouter une vérification à la fonction de redimensionnement. De toute façon, je ne suis pas sur le point de créer le jeu entier pour vous, je suis tout à fait certain que vous voudriez le faire vous-même.
Si vous le trouvez utile, vous pouvez l'utiliser, sinon peut-être (et très probablement) vous pouvez être inspiré par mon approche (qui est vraiment une solution faite 2 minutes). J'espère que ça marche pour toi. Le webdesign gratuit ne sera pas nécessaire, je suppose que vous pouvez enregistrer cela pour une question ultérieure;)