2017-10-06 2 views
-2

J'ai besoin de faire un jeu de base de devinettes et je ne sais pas comment boucler le code afin que l'utilisateur entre à nouveau sa réponse lorsqu'il rencontre une erreur. Ce code est tout je l'ai écrit:Comment est-ce que irepeat code si une erreur est rencontrée?

#include <iostream> 
#include <stdlib.h>  //srand 
#include <time.h>  // time 
#include <vector> 
#include <stdexcept> 

void error(std::string s) 
{ 
    throw std::runtime_error(s); 
} 

int main() 
{ 
    int characters ,length ,guess_number = 0,letter_number = 0, total_guess = 0 , err_count = 0; 

    char letters,guess; 
    std::vector <char> v; 
    std::vector <char> answer; 
    std::cout << "Enter the amount of different characters: "; 
    std::cin >> characters; 
    std::cout << "Enter the pattern length "; 
    std::cin >> length; 

    if(length > 26) 
    { 
     error("Length can't be over 26"); 
    } 

    srand (time(NULL)); 

    for(int i =0; i < length ; i++) 
    { 
     letters = rand()% (26-(26-characters))+65; //ascii code for Upper case letters. we discard the 26-characters to only generate random numbers up until how many characters. 
     letter_number++; 
     v.push_back(letters);       //random letters 
    } 
    for(int i = 0;i <v.size(); i++) 
     std::cout << v[i]; 

    try 
    { 
     while(guess_number != letter_number) 
     { 
      std::cout << "Enter your guess: "; 
      while(std::cin >> guess) 
      { 
       answer.push_back(guess);      //user guess 
       if (std::cin.peek() == '\n') 
       break; 
      } 
      total_guess ++; 

      if(v.size() != answer.size()) 
      { 
       error("Answer too short"); 
      } 

      for(int i = 0; i < v.size(); i++) 
      { 
       if(v[i] == answer[i]) 
       { 
        guess_number++; 

       } 
      } 

      if(guess_number != letter_number) 
      { 
       std::cout << "you have guessed " << guess_number << " characters correctly." << std::endl; 
       guess_number = 0; 
       answer = {}; 
      } 

      else if(guess_number == letter_number) 
      { 
       std::cout << "You have guessed " << guess_number << " characters correctly" << std::endl; 
       std::cout << "You guesses the pattern in " << total_guess << " guesses"; 
       break; 
      } 

     } 
    } 

    catch(std::runtime_error& error) 
    { 
     std::cerr << "error: "<< error.what() << std::endl; 

     return 1; 
    } 

    return 0; 
} 

Fondamentalement, je ne sais pas comment faire le programme pour demander à nouveau l'utilisateur si l'utilisateur saisit une réponse plus courte que le vecteur de lettres au hasard. Après la partie:

if(v.size() != answer.size()) 
    { 
     error("Answer too short"); 
    } 

Après l'avoir exécuté et avoir saisi quelque chose, le programme donne l'erreur et se termine au lieu de recommencer.

+2

Que diriez-vous que vous venez de [* '* CONTINUE] (http://en.cppreference.com/ w/cpp/language/continue) la boucle? –

+0

Est-ce vraiment une exception si l'utilisateur entre trop peu de caractères? Ce que je veux dire par là, c'est que ce n'est pas vraiment une circonstance exceptionnelle, n'est-ce pas? Que diriez-vous de maintenir un drapeau qui représente si leur réponse était trop courte. Ensuite, dans votre boucle while, vérifiez le drapeau (si la réponse des utilisateurs est trop courte, puis bouclez à nouveau, où vous lancez l'erreur, mettez simplement l'indicateur à true, sinon placez-le à false). –

+0

Ou comme un programmeur mec vient de le dire, utilisez continuer à revenir au début de la boucle si la réponse était trop courte. –

Répondre

0

Votre code échoue car une fois l'erreur déclenchée, vous attrapez l'erreur (en dehors de la boucle while, ce qui la termine essentiellement), puis exécutez même return 1 (arrêt du programme). En outre, puisque l'erreur peut arrêter l'exécution tôt, vous devez toujours effacer le answer juste après avoir démarré chaque étape. Donc, vous devriez faire trois choses:

  1. Enroulez le try...catch dans la while
  2. Supprimez la ligne return 1 de la capture, de sorte que le code continue à exécuter
  3. Déplacer answer = {}; vers le haut de la try...catch

Cela devrait ressembler à ceci:

while(guess_number != letter_number) 
{ 
    try 
    { 
     answer = {}; 
     std::cout << "Enter your guess: "; 
     while(std::cin >> guess) 
     { 
      answer.push_back(guess);      //user guess 
      if (std::cin.peek() == '\n') 
      break; 
     } 
     total_guess ++; 

     if(v.size() != answer.size()) 
     { 
      error("Answer too short"); 
     } 

     for(int i = 0; i < v.size(); i++) 
     { 
      if(v[i] == answer[i]) 
      { 
       guess_number++; 

      } 
     } 

     if(guess_number != letter_number) 
     { 
      std::cout << "you have guessed " << guess_number << " characters correctly." << std::endl; 
      guess_number = 0; 
     } 

     else if(guess_number == letter_number) 
     { 
      std::cout << "You have guessed " << guess_number << " characters correctly" << std::endl; 
      std::cout << "You guesses the pattern in " << total_guess << " guesses"; 
      break; 
     } 

    } 
    catch(std::runtime_error& error) 
    { 
     std::cerr << "error: "<< error.what() << std::endl; 
    } 
} 

Ici, vous allez: tio.runNote: J'ai modifié votre code pour toujours "générer" AB comme motif