2013-07-12 2 views
0

누구든지 다음 코드에 대한 도움을 줄 수 있습니까? 하나의 사소한 오류를 제외하고는 아무 문제가 없습니다. 기본적으로 코드는 사용자에게 단어를 묻습니다. 단어를 가져온 다음 마스크 처리합니다. 예를 들어, 내가 단어를 입력 가정 해 봅시다 : 축구함수에서 수정할 때 주 변수가 업데이트되지 않습니다.

축구 다음 * * (각 문자 하나 *)로 변환됩니다. 그 후 코드는 사용자에게 시도 할 여러 가지 추측을 요청합니다. 나는 8을 ​​입력한다고 해봅시다.

8을 입력하면 추측 된 문자를 표시하기 위해 마스크 된 문자열을 업데이트 할 때마다 올바른 추측을 8 회 추측하도록 요청됩니다. 문제는 단어가 공개 된 직후 자동으로 프로그램을 끝내기를 원한다는 것입니다. 예를 들어, 축구에서는 중복 문자 (예 : o 및 l)를 입력 할 때마다 두 개의 문자가 표시되고 추측 시도는 건너 뜁니다. 따라서 축구가 완전히 해독 된 후에 코드/프로그램은 여전히 ​​2 가지 추측을 요구합니다. 나는이 두 가지 추가 추측을 원하지 않는다. 나는 프로그램을 즉시 끝내기를 원한다. 그러나 나는 그것을하는 방법을 알아낼 수 없습니다.

나는 masked_secret_word가 == secret_word 경우 최종

에서 다음 명령을 설정하려고 :

휴식 그러나 그것은 아무것도하지 않는 것. 완전히 추측 된 단어와 원래 단어를 일치시킨 다음 종료한다고 생각했지만 효과가없는 것 같습니다. 도움을 줄 수있는 사람은 누구입니까? 고맙습니다.

def word_update (secret_word, guessed_letters): 
    masked_secret_word = "" 
    for letter_guess in secret_word: 
     if letter_guess in guessed_letters: 
      masked_secret_word += letter_guess 
     else: 
      masked_secret_word += "*" 
    print "Secret Word update:" + masked_secret_word 

alphabet = map(chr, range(97, 123)) 

secret_word = raw_input ("Type in the secret word: ").lower() 
while secret_word.isalpha() == False: 
    secret_word = raw_input ("ERROR: Type in the secret word").lower() 
masked_secret_word = len(secret_word) * "*" 
guesses = raw_input ("How many guesses will you allow?") 
while guesses.isdigit() == False or 0 >= int(guesses): 
    guesses = raw_input ("ERROR: How many guesses will you allow?") 
guesses = int(guesses) 
while len(secret_word) > guesses: 
    guesses = raw_input ("ERROR: The number of guesses is smaller than the word") 
    while guesses.isdigit() == False or 0 >= int(guesses): 
     guesses = raw_input ("ERROR: How many guesses will you allow?") 
    guesses = int(guesses) 
print "Secret Word = " + masked_secret_word 
guessed_letters = [] 
while guesses != 0: 
    letter_guess = raw_input ("Guess a letter (a-z)? ") 
    while letter_guess not in alphabet: 
     letter_guess = raw_input ("ERROR: Guess a letter (a-z)? ") 
    if letter_guess in guessed_letters: 
     print "That letter has already been guessed." 
    else: 
     guesses = guesses - 1 
     guessed_letters.append(letter_guess) 
     word_update(secret_word, guessed_letters) 
+5

질문에 대한 더 나은 제목으로 올 마십시오. –

+1

* * 한 줄을 추가하려고 시도한 곳은 어디입니까? –

답변

2

word_update() 기능 만 인쇄됩니다. 아무 것도 반환하지 않습니다. 해당 함수 내의 masked_secret_word 변수는 로컬 변수이며 함수 외부에서는 볼 수 없습니다. word_update() 기능의

외부는 masked_secret_word은 그래서 당신의 secret_word 값이 일치하지 않습니다 값 '*******'와 다른 변수이다.

돌아 호출자에게 다시 전달하는 기능의 값 :

def word_update (secret_word, guessed_letters): 
    masked_secret_word = "" 
    for letter_guess in secret_word: 
     if letter_guess in guessed_letters: 
      masked_secret_word += letter_guess 
     else: 
      masked_secret_word += "*" 
    print "Secret Word update:" + masked_secret_word 
    return masked_secret_word == secret_word # returns True or False 

그 반환 값에 대한 시험 :

word_update() 기능에
if word_update(secret_word, guessed_letters): 
    break 
+0

감사합니다, 모든 답변이 유용했지만이 하나가 나를 위해 최선을 다해 노력했습니다. 모두들 감사합니다. – Kevin

3

, 당신은 masked_secret_word라는 지역 변수를 만들 . 이는 메인 코드의 masked_secret_word과 같은 변수가 아니라 새로운 로컬 변수입니다.

masked_secret_word 메인 변수를 실제로 업데이트하지 않으므로 일련 번호는 '*'입니다.

이의 작은 수정은 word_update() 함수에서

global masked_secret_word 

을 추가하는 것입니다,하지만 그것을 할 수있는 더 나은 방법은 word_update() 기능은 새로운 masked_secret_word으로 다시 글로벌을 업데이트하는 것을 사용하는 것입니다 변수와 함께 :

masked_secret_word = word_update(secret_word, guessed_letters) 

그러면 제안 된 라인이 작동합니다.

+0

+1 두 가지 방법을 설명합니다. Kevin, 대부분의 경우,'global' 변수의 사용은 당신이해야 할 충분한 이유가 없다면, 낙심됩니다. 여기에서보다 적절한 방법으로 할 수 있으므로'global' 변수를 사용하지 않는 것이 좋습니다. 코드가보다 명확하고 이해하기 쉽습니다. 또한 파이썬에서는'global' 명령없이 언제든지 함수 내에서 상위 범위 (메인 스크립트의 "전역 적")에 선언 된 변수에 액세스 할 수 있습니다 (읽기 전용). 그러나 빨리 작성해야 할 때, 레나 트 (Lennart)가 말했듯이, 그것을 글로브로 선언해야합니다. – cedbeu

1

masked_secret_word을 절대 업데이트하지 않습니다. word_update()에서 반환하고 secret_word과 일치하는지 확인할 수 있습니다.

여기에 전체 코드입니다 - 나는 word_update()에서 return 문을 추가하고 메인 루프에서 평등을위한 검사 :

def word_update (secret_word, guessed_letters): 
    masked_secret_word = "" 
    for letter_guess in secret_word: 
     if letter_guess in guessed_letters: 
      masked_secret_word += letter_guess 
     else: 
      masked_secret_word += "*" 
    print "Secret Word update:" + masked_secret_word 
    return masked_secret_word 

alphabet = map(chr, range(97, 123)) 

secret_word = raw_input ("Type in the secret word: ").lower() 
while secret_word.isalpha() == False: 
    secret_word = raw_input ("ERROR: Type in the secret word").lower() 
masked_secret_word = len(secret_word) * "*" 
guesses = raw_input ("How many guesses will you allow?") 
while guesses.isdigit() == False or 0 >= int(guesses): 
    guesses = raw_input ("ERROR: How many guesses will you allow?") 
guesses = int(guesses) 
while len(secret_word) > guesses: 
    guesses = raw_input ("ERROR: The number of guesses is smaller than the word") 
    while guesses.isdigit() == False or 0 >= int(guesses): 
     guesses = raw_input ("ERROR: How many guesses will you allow?") 
    guesses = int(guesses) 
print "Secret Word = " + masked_secret_word 
guessed_letters = [] 
while guesses != 0: 
    letter_guess = raw_input ("Guess a letter (a-z)? ") 
    while letter_guess not in alphabet: 
     letter_guess = raw_input ("ERROR: Guess a letter (a-z)? ") 
    if letter_guess in guessed_letters: 
     print "That letter has already been guessed." 
    else: 
     guesses = guesses - 1 
     guessed_letters.append(letter_guess) 
     masked_secret_word = word_update(secret_word, guessed_letters) 
     if masked_secret_word == secret_word: 
      # You win 
      break 
관련 문제