2017-10-06 30 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/ w/cpp/language/continue)循環? –

+0

如果用戶輸入的字符太少,它真的是一個例外嗎?我的意思是,這不是特別的情況嗎?你如何維護一個表示他們的答案是否太短的標誌呢? 然後在你的while循環中檢查標誌(如果用戶回答太短,那麼只需循環,拋出錯誤只需將標誌設置爲true,否則將其設置爲false)。 –

+0

或者像剛纔說的一些程序員傢伙一樣,如果答案太短,繼續跳回循環的開始。 –

回答

0

您的代碼失敗,因爲一旦錯誤被觸發,您正在捕獲錯誤(在while循環之外,基本上終止它),然後甚至執行return 1(終止程序)。另外,由於錯誤可能會提前停止執行,因此在開始每個步驟後,您應該始終清除answer。所以,你應該做三兩件事:

  1. 包裹內while
  2. try...catch卸下漁獲的return 1線,所以代碼會繼續執行
  3. 移動answer = {};到的try...catch
頂部

它應該看起來像這樣:

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注:我改變你的代碼總是 「產生」 AB爲圖案