2009-04-27 5 views
2

J'écris un jeu de pendu. J'ai une logique qui échoue, à la fois avec moi-même et ma logique de jeu. Char deviner (la lettre que la personne a devinée) n'est pas ajouté dans la fente de mémoire correcte du vecteur guessArray. Supposons que ce mot est un mot entré par l'utilisateur.Quelle est la similarité entre un vecteur std :: et un tableau brut en C++?

Je suppose que cela fonctionnerait si guessArray était un tableau brut. Y at-il une raison pour laquelle cela ne fonctionne pas avec un vecteur?

//assume that attempts is num of attempts left 
void coutWord(int attempts, std::string word, char guess) 
{ 
std::vector<char> guessArray(word.length()); 


//this is supposed to add the guess to the correct area of guessArray; 
//It's not. 

for (int i = 0; i < word.length(); i++) { 
    if (guess == word[i]) { 
     guessArray[i] = guess; 
     std::cout << " " << guessArray[i] << " "; 
     continue; 
    } 

    std::cout << " _ "; 
} 

std::cout << std::endl << std::endl; 
} 

EDIT: Mon objectif avec ce code est de tous les espaces cout unguessed et les espaces devinés dans la même boucle. J'ai juste besoin de "me souvenir" des suppositions précédentes pour obtenir une sortie correcte. Compte tenu de mot = "compote de pommes":

Input: a 
a _ _ _ _ _ a _ _ _ 
Input: p 
a p p _ _ _ a _ _ _ 

etc.

+2

Cela semble être du code assez bogué, indépendamment du fait que guessArray soit un vecteur ou un tableau brut. Pour être en mesure de répondre à votre question, vous devez dire ce que vous ESSAYEZ de faire ici. EG, si le mot était "Triangulate", et devinez "g", que devrait être la sortie? –

+0

Donc devrais-je passer le vecteur comme un autre argument? – jkeys

+0

En fonction de votre fonction, vous devrez également parcourir toutes les suppositions précédentes, car vous ne sauvegardez pas guessArray entre les appels. Vous voudrez probablement le passer comme un autre argument, oui. –

Répondre

3

Un vecteur peut être indexé avec la notation [] indice, et il est stocké dans la mémoire contiguë. C'est un conteneur STL donc, comme un tableau, vous pouvez en avoir un de n'importe quel type.

Un vecteur est automatiquement redimensionné. Un tableau est "statiquement" dimensionné, et ne peut pas être facilement redimensionné (à l'exception d'une fonction manuelle appelée à realloc.) Vous pouvez utiliser une fonction push_back pour gérer cela, et vous pouvez également .reserve() mémoire à l'avance pour enregistrer sur la réallocation.

Un tableau ne suit pas sa propre taille, alors qu'un vecteur a des fonctions qui peuvent le vérifier.

Si vous n'êtes pas sûr de la taille d'un vecteur, il suffit d'utiliser .push_back() pour ajouter des éléments pour gérer le dimensionnement automatique. Si vous réservez un morceau de mémoire via resize(), puis que vous l'indexez, il est plus facile à utiliser en tant que tableau, mais vous perdez un peu de son avantage syntaxique en l'utilisant comme un objet de taille dynamique.

+2

Si vous conservez() un morceau de mémoire, il est techniquement incorrect d'y indexer. La fonction reserve() ne modifie pas la taille conceptuelle du vecteur. La fonction à utiliser dans ce cas est resize(). Erreur très commune. –

+0

Merci, Andrew; édité avec correction. – Anthony

-1

Vous devez utiliser la fonction push_back(). Voir cpprefererence.com pour plus de détails.

En outre, vous ne pouvez pas remplacer simplement guessArray avec tableau C de style, parce que vous devez spécifier excplicitly sa taille avec constante connue à la compilation, comme

int guessArray[25]; 
0

Réponse à l'EDIT:

Le vecteur guessArray est créé localement dans la fonction et, par conséquent, l'insertion précédente dans le vecteur ne sera pas disponible pour la prochaine tentative. Vous devez passer le vecteur par référence et mettre à jour le vecteur pour chaque tentative.

void coutWord(std::vector<char>& guessArray, int attempts, std::string word, char guess) 

Code Pseudo:

void coutWord(std::vector<char>& guessArray, int attempts, std::string word, char guess) 
{ 

    for (int i = 0; i < word.length(); i++) 
    { 
     if (guess == word[i]) 
     { 
      //its current guess 
      //insert and display as well 
      guessArray[i] = guess; 
      std::cout << " " << guessArray[i] << " "; 

     } 
     //Check if the previous attempt has already inserted the char (previous guess) 
     else if(guessArray[i] != 0) 
     { 
      //display previous guess too 
      std::cout << " " << guessArray[i] << " "; 

     } 
     else 
     { //not yet guessed 
      std::cout << " _ "; 
     } 
    } 

    std::cout << std::endl << std::endl; 
} 

définissent le vecteur extérieur:

std::vector<char> guessArray(word.length()); 

    coutWord(guessArray, 1, word, 'a'); 
2

Il y a fondamentales défauts logiques dans votre code, au-delà de l'utilisation du vecteur ou des tableaux.

Il y a deux tâches que vous essayez de faire ici:

  • Mise à jour un tableau de suppositions
  • Sortie le tableau des suppositions

Il est facile de se mélanger pendant que vous êtes tenter de faire les deux tâches dans une seule fonction. Ma suggestion pour vous est de les mettre dans des fonctions distinctes.

Voici une structure de code de base (en utilisant les fonctions que vous pouvez mettre en œuvre):

int attempts = 0; 
std::vector<char> guessArray(word.length()); 
while((attempts > maxAttemps) && (!HasFoundWord(guessArray)) 
{ 
    char guess = InputGuess(); 
    UpdateResults(guessArray, guess, word); 
    OutputGuess(guessArray); 
    ++attempts; 
} 

Les updateResults auraient une signature de fonction comme:

void UpdateResults(std::vector<char>& guessArray, char guess, const std::string& word) 

Une fois que vous avez séparé les morceaux de fonctionnalité , vous trouverez le problème beaucoup plus simple à résoudre.

0

Je suis surpris que personne ne l'ait encore mentionné, mais std :: vector n'est pas un tableau. C'est un conteneur contigu de redimensionnement d'éléments qui peuvent être utilisés pour beaucoup des mêmes objectifs qu'un tableau. Si vous voulez un tableau enveloppé (et il y a un certain nombre de raisons à), vous devriez regarder boost::array