2017-10-06 3 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 줄을 제거 : 그래서 당신은 세 가지를 수행해야

      다음과 같이 표시되어야합니다.

      여기

      당신은 갈 : tio.run참고 : 난 항상 패턴

  • 관련 문제