2016-09-03 1 views
1

내 게임의 개념은 다음과 같습니다. 컴퓨터는 무작위로 1-100의 숫자를 생성하며 플레이어는이 숫자를 추측해야합니다. 그들이 추측하는 숫자가 더 높거나 낮 으면 컴퓨터가이를 알려줍니다.번호 추측 게임, 다음 추측을 할 수 없습니다.

사용자가 입력 한 추측이 숫자인지 확인하기 위해 몇 가지 코드를 추가했지만 어떤 이유 때문에 첫 번째 추측에 대해서만 작동합니다.

import random 

x = random.randint(1, 100) 
guess = input("Guess the number") 

while guess.isnumeric() == True: 

    if x > int(guess): 
     print("Too low, guess again") 
     guess = input("Guess the number") 

    if x < int(guess): 
     print("Too high, guess again") 
     guess = input("Guess the number") 

    if x == int(guess): 
     print ("That is correct!") 
     break 

if guess.isnumeric() == False: 
     print("Please enter a valid number") 
     guess = input("Guess the number") 

나는 그걸 설명하는 방법을 모른다. 예를 들어 숫자 20을 첫 번째 추측으로 추측하면 무작위로 생성 된 숫자에 따라 너무 높거나 낮게 출력됩니다. 그러나 그 후에 임의의 문자를 입력하면 오류가 발생합니다. 추측은 무작위로 생성 된 숫자와 비교 될 수 없습니다.

+0

질문에 * 전체 추적 * 오류를 포함하십시오. 당신은 두 번째 또는 세 번째'if' 문에서 'ValueError' 예외를 얻었을 것입니다. –

+0

break가있는 것을 제외하고는 각 if 문 끝으로 continue를 넣으십시오. –

답변

2

나는 당신을 위해 코드를 수정했습니다. 시도해보십시오.

모든 추측 이후에 사용자에게 입력하라는 메시지가 필요하지 않습니다. 즉, 첫 번째 입력 프롬프트가 대상입니다. while True을 지정하기 때문에 정확한 숫자를 입력하지 않으면 매번 숫자를 입력하라는 메시지가 표시됩니다.이 경우 숫자가 무한 루프 인 break입니다.

또한 input 문을 try 블록에 넣을 수 있습니다. 입력을 정수로 바로 캐스팅하기 때문입니다. 사용자가 문자열을 입력하면 정수로 캐스팅하려고 시도하면 프로그램이 실패하지만, except ValueError:continue 인 경우 사용자에게 입력 내용이 잘못되었다는 경고가 표시되고 다시 입력하라는 메시지가 표시됩니다.

1

추측이 올 때까지 계속되는 또 다른 루프에서 추측 논리를 둘러 쌀 필요가 있습니다.

의사 코드 :

choose_target_answer 
while player_has_not_guessed_answer 
    get_player_guess 
    if player_guess_is_valid 
     respond_to_player_guess 
    else 
     give_error_message 
2

귀하의 if 문은 모두 독립적 :

if x > int(guess): 
    print("Too low, guess again") 
    guess = input("Guess the number") 

if x < int(guess): 
    print("Too high, guess again") 
    guess = input("Guess the number") 

if x == int(guess): 
    print ("That is correct!") 
    break 

두 번째와 세 번째 if항상 테스트 guess 다시 첫 번째 if 테스트가 일치 할 경우에도 마찬가지입니다. 첫 번째 if 테스트가 일치하고 숫자가 아닌 guess 값을 입력 한 경우 int() 호출이 ValueError 예외를 throw하므로이 두 테스트가 실패합니다.

elifelse을 사용하여 테스트가 상호 의존적이라는 것을 파이썬에게 알릴 수 있습니다. 이제 파이썬 만 제 정합 블록를 실행하고, 완전히 다른 이동 :

if x > int(guess): 
    print("Too low, guess again") 
    guess = input("Guess the number") 

elif x < int(guess): 
    print("Too high, guess again") 
    guess = input("Guess the number") 

else: 
    print ("That is correct!") 
    break 

이것은else 블록 후 연속 실행이 수단 중 하나 if 또는 elif 검사가 일치 될 때.

끝에 else을 사용했음을 유의하십시오. 숫자가 너무 높지도 낮지 않은 경우 숫자 이어야하며 다른 옵션은 없습니다. 명시 적으로 테스트 할 필요가 없습니다.

그러나 지금은 반복하고 있습니다. 3 가지 다른 장소에서 추측을 요구합니다. 당신은을 물어 루프가 새 값을 요구 알아서 할 수있다 : 이미 훨씬 덜 반복의

while True: 
    while True: 
     guess = input("Guess the number:") 
     if guess.isnumeric(): 
      break 
     print("Not a valid number, try again!") 

    guess = int(guess) 

    if x > guess: 
     print("Too low, guess again") 

    elif x < guess: 
     print("Too high, guess again") 

    else: 
     print ("That is correct!") 
     break 

; 별도의 while 루프는 실제로 숫자가 될 때까지 숫자를 묻고 guessint()으로 단 한번 변환됩니다.

:

당신은 중첩 된 while True:을 제거하고 여기 바깥 하나를 사용할 수, 결과는 숫자 값이 없을 때 당신은 루프의 나머지 부분을 건너 뛰려면 continue 키워드를 사용하여 제공 같은 것

while True: 
    guess = input("Guess the number:") 
    if not guess.isnumeric(): 
     print("Not a valid number, try again!") 
     continue # skip to the top of the loop again, so ask again 

    guess = int(guess) 

    if x > guess: 
     print("Too low, guess again") 

    elif x < guess: 
     print("Too high, guess again") 

    else: 
     print ("That is correct!") 
     break