2017-10-06 9 views
-2

私は、推測の基本的なゲームを作る必要があり、コードをループする方法を知らないので、ユーザーはエラーに合ったときに再び答えを入力します。 エラーが発生した場合、irepeatコードはどのようにして表示されますか?

#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; 
} 

は基本的に私は、ユーザーがランダムな文字ベクトルより短い答えを入力すると、再びユーザーを依頼するプログラムを作成する方法がわからない:これは私が書いたコード全体です。この部分の後:

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

私はそれを実行し、何か短い時間を入力した後、プログラムはエラーを返し、代わりに終了します。

+2

あなたはどうばかり[* 'continue'の*](http://en.cppreference.com/としてAB "を生成" するようにコードを変更w/cpp/language/continue)ループ? –

+0

ユーザーが少なすぎる文字を入力すると、実際には例外ですか?私はそれが本当に例外的な状況ではないということですか?彼らの答えが短すぎるかどうかを表すフラグを維持するのはいかがですか? whileループでフラグをチェックします(ユーザーの回答が短すぎる場合は、ループを再実行し、エラーをスローするにはフラグをtrueに設定し、そうでない場合はfalseに設定します)。 –

+0

または、ちょうど言ったいくつかのプログラマーのおっぱいのように、答えがあまりにも短い場合は、ループの先頭にスキップしてください。 –

答えて

0

エラーが発生するとエラーをキャッチしています(whileループの外で、本質的に終了しています)。return 1(プログラムの終了)を実行してもコードが失敗します。また、エラーにより実行が早期に停止する可能性があるため、各ステップを開始した直後にanswerをクリアする必要があります。コードはtry...catch のトップへ

  • 移動answer = {};の実行を継続するので、

    1. がラップwhile
    2. 内部try...catchはキャッチからreturn 1行を削除します。だから、3つのことを行う必要があります

      それは次のようになります。

      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; 
          } 
      } 
      
      ここ

      あなたが行く:tio.run注:私はいつものパターン

  • 関連する問題