2014-06-07 3 views
1

'Trivia'스타일의 게임 인 첫 번째 프로그램을 작성하고 있습니다. 귀하가 선택한 라운드를 기준으로 질문을합니다. 따라서 1 라운드를 선택하면 1 목록에서 질문을, 2 라운드에서 2 라운드 질문을 할 수 있습니다.새로운 가치가 유지되지 않습니다

나는 중순 반원을 변경할 수있는 코드를 작성했습니다. 이 질문을 던지면 첫 번째 질문 만 새로운 라운드에서 나옵니다. 묻는 질문은 이전 라운드로 되돌아갑니다.

그래서 :

  1. 나는 1
  2. 2.
  3. 가져 오기를 반올림
  4. 1 라운드 스위치에서 질문 2 라운드
  5. 에서 하나의 질문을하기 라운드 선택 그 이후의 모든 질문은 1 라운드로 되돌아갑니다.

잘 모르겠습니다. 왜, 나는 이것을해야만하는 이유를 찾지 못하는 것 같습니다. repeat()에서

round = raw_input ("Round?: ") 

def turn(round): 
    print "Current Round = " + round 
    if round == "1": 
     print (choice (ssq1)) 
     play_again = raw_input("Again?: ") 
     repeat(play_again) 

    elif round == "2": 
     print (choice (ssq2)) 
     play_again = raw_input("Again?: ") 
     repeat(play_again) 

def repeat(play_again): 

    if play_again == "Yes" or play_again == "Y": 
     turn(round) 

    elif play_again == "New": 
     new_round = True 
     new_turn(new_round) 

def new_turn(new_round): 
    round = raw_input("Okay, Which round?: ") 
    turn(round) 

from random import choice 

ssq1 = ["Round1Q1", "Round1Q2", "Round1Q3"] 
ssq2 = ["Round2Q1", "Round2Q2", "Round2Q3"] 

turn(round) 

답변

2

round글로벌 변수, 시작에서 바로 설정 하나입니다

A는 문제와 코드의 버전을 벗었. 대신 번을 번으로 전달해야합니다. turn()에 사용되는 로컬 이름 round :

repeat(play_again, round) 

및 추가 인수로 repeat() 기능에 그것을 사용 :

def repeat(play_again, round): 
    if play_again == "Yes" or play_again == "Y": 
     turn(round) 

    elif play_again == "New": 
     new_round = True 
     new_turn(new_round) 

귀하의 재귀 함수는 다소 복잡하다. 대신 while 루프를 사용하는 것을 고려 : 단지 게임의 회전을 처리

def turn(round): 
    print "Current Round = " + round 
    if round == "1": 
     print (choice (ssq1)) 

    elif round == "2": 
     print (choice (ssq2)) 

round = None 

while True: 
    if round is None: 
     round = raw_input ("Round?: ") 

    turn(round) 

    play_again = raw_input("Again?: ") 
    if play_again == 'New': 
     # clear round so you are asked again 
     round = None 
    elif play_again not in ('Yes', 'Y'): 
     # end the game 
     break 

이제 turn() 기능. 게임을 플레이하고 게임을 종료 할 라운드를 묻는 반복은 모두 무한 루프의 while 루프에서 처리됩니다. break 문은 해당 루프를 끝내는 데 사용됩니다.

대신 순차적으로 명명 된 변수의, 당신의 라운드를 개최 사전 또는 목록을 사용 고려할 수 있습니다 또 다른 개선 :이 조건문의 큰 세트를 사용할 필요가 제거

round_questions = { 
    "1": ["Round1Q1", "Round1Q2", "Round1Q3"], 
    "2": ["Round2Q1", "Round2Q2", "Round2Q3"], 
} 

; 다음과 같이 키 대신 올바른 목록을 검색하기 만하면됩니다.

def turn(round): 
    if round in round_questions: 
     print "Current Round = " + round 
     ssq = round_questions[round] 
     print choice(ssq) 

    else: 
     print "No such round", round 

이렇게하면 잘못된 입력을 쉽게 처리 할 수 ​​있습니다. 선택한 라운드가 사전의 키가 아니면 첫 번째 if 문은 거짓이며 대신 오류 메시지를 인쇄 할 수 있습니다.

변수 이름으로 round을 사용하면 built-in function by the same name을 마스킹하는입니다.여기서는 괜찮습니다. 반올림이 필요한 수학을 사용하지 않고 해당 함수를 사용해야하는 경우이를 고려하십시오.

+0

아마도 변수 이름으로 round를 사용하면 안됩니다. –

+0

@PadraicCunningham : 끝 부분에 별도의 포인트로 처리했습니다. 'dict','list' 또는'str'을 이름으로 사용하는 것만 큼 큰 문제는 아닙니다. –

+0

@martjin Pieters, 큰 문제는 아니지만 여전히 기본 이름을 숨기는 것이 가장 바람직합니다. 영어로 단어가 부족하지는 않습니다.). –

관련 문제