2010-01-06 4 views
0

Je veux faire une partie de TicTacToe. Quand je redimensionne la fenêtre, je veux apparaître plus de boutons sur l'interface. D'une matrice de 3x3 à 4x4 etc. jusqu'à 9x9, en fonction de combien je redimensionne la fenêtre. Comment puis-je faire cela?Allocation dynamique de boutons dans C Builder 6?

Je ferai une conception de site web gratuite à quiconque me fournira une réponse de travail (et quelque chose en plus pour le programme complet de jeu de tictactoe).

Merci!

Répondre

2

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;)

Questions connexes