2015-01-15 6 views
0

저는 파이썬으로 초보자입니다. 터미널에서 두 사람의 tic tac toe 게임을 만들고 있습니다. 기본적으로이 게임에는 모든 버그와 문제가 해결되었지만 마지막 문제가 하나 있습니다. 기본적으로 이동을 입력하라는 메시지가 나타나면 한 사용자가 어딘가에 이동하라는 메시지가 표시 될 때 문자를 입력하면 문자 또는 비 정수가 입력되면 충돌합니다. 여기에 코드가 있습니다. 그리고 나서 게임이 실행될 때 출력을 넣을 것이고, 사용자는 이동을 요구 한 후 문자를 입력 할 것입니다. OUTPUT파이썬 tic tac 발가락 입력 오류

Fill in spaces on the board with number corresponding to the board below. 

1 | 2 | 3 
--------- 
4 | 5 | 6 
--------- 
7 | 8 | 9 

Who goes first, X or O? x 
Choose a Space from 1-9 for X to Go: 1 

X | | 
--------- 
    | | 
--------- 
    | | 

Choose a Space from 1-9 for O to Go: k 
Traceback (most recent call last): 
    File "move.py", line 79, in <module> 
    MakeMove() 
    File "move.py", line 66, in MakeMove 
    Move(turn) 
    File "move.py", line 56, in Move 
    move = input('Choose a Space from 1-9 for ' + str(order[turn]) + ' to Go: ') 
    File "<string>", line 1, in <module> 
NameError: name 'k' is not defined 

X = "X" 
O = "O" 
empty = " " 
S = [" ", " ", " ", " ", " ", " ", " ", " ", " "] 

def Instructions(): 
    print "Fill in spaces on the board with number corresponding to the board below." 
    print "" 
    print "",1,"|",2,"|",3 
    print "","---------" 
    print "",4,"|",5,"|",6 
    print "","---------" 
    print "",7,"|",8,"|",9 
    print "" 

def Board(): 
    print "" 
    print "",S[0],"|",S[1],"|",S[2] 
    print "","---------" 
    print "",S[3],"|",S[4],"|",S[5] 
    print "","---------" 
    print "",S[6],"|",S[7],"|",S[8], "\n" 

def WhoGoesFirst(): 
    Instructions() 
    global order 
    letter = raw_input('Who goes first, X or O? ').upper() 
    while not (letter == "X" or letter == "O"): 
     letter = raw_input('Who goes first, X or O? ').upper() 
    if letter == "X": 
     order = [X, O, X, O, X, O, X, O, X] 
    else: 
     order = [O, X, O, X, O, X, O, X, O] 

def CheckWin(): 
    global winner 
    winner = "" 
    if S[0] == S[1] == S[2] != empty: 
     winner = S[0] 
    if S[3] == S[4] == S[5] != empty: 
     winner = S[3] 
    if S[6] == S[7] == S[8] != empty: 
     winner = S[6] 
    if S[0] == S[3] == S[6] != empty: 
     winner = S[0] 
    if S[1] == S[4] == S[7] != empty: 
     winner = S[1] 
    if S[2] == S[5] == S[8] != empty: 
     winner = S[2] 
    if S[0] == S[4] == S[8] != empty: 
     winner = S[0] 
    if S[2] == S[4] == S[6] != empty: 
     winner = S[2] 

def Move(turn): 
    move = input('Choose a Space from 1-9 for ' + str(order[turn]) + ' to Go: ') 
    while move not in range (1, 10) or S[int(move) - 1] is not empty: 
     move = input('Choose a Space from 1-9 for ' + str(order[turn]) + ' to Go: ') 
    S[int(move) - 1] = order[turn] 
    Board() 
    CheckWin() 

def MakeMove(): 
    turn = 0 
    while turn <= 8: 
     Move(turn) 
     turn += 1 
     if winner == X or winner == O: 
      while turn <= 8: 
       turn += 1 
      if winner == X: 
       print winner + " Is the Winner!" 
      if winner == O: 
       print winner + " Is the Winner!" 
    if winner == "": 
     print "The Game Is a Tie" 

WhoGoesFirst() 
MakeMove() 

는하지-intiger가 입력되면 적절한 조치를 넣을 때까지, 그것은 (다시 이동에 대한 프롬프트를 줄 것이다, 그래서이 문제를 해결 할 수 있나요 에서). 가능하다면 어떻게 될까요?

답변

1

예, 즉시 문제를 해결하려면 raw_input을 사용하십시오.

파이썬 2에서 input은 다음 값을 얻습니다. 평가를 시도하십시오. 을 평가하는 것은 괜찮 으면서도 그런 변수가없는 경우 k을 평가하는 것입니다. 당신이 문자열이 있으면 당신은에서와 같이 정수로 변환하기 전에 좋아하지만, 당신이 그것을 확인할 수 있습니다

:

def Move(turn): 
    move = -1 
    while move not in range (1, 10) or S[int(move) - 1] is not empty: 
     smove = raw_input('Choose a Space from 1-9 for ' + str(order[turn]) + ' to Go: ') 
     try: 
      move = int(smove) 
     except ValueError: 
      move = -1 
    S[int(move) - 1] = order[turn] 
    Board() 
    CheckWin() 

파이썬 3 또한 input 기능 이후 수정 프로그램은 동일합니다 Pyhon 2의 raw_input입니다.

0

input을 호출 할 때 값은 구문 상 정확하게 올바른 파이썬이어야합니다.

이 기능은 사용자 오류를 포착하지 않습니다. 입력이 구문 적으로 유효하지 않으면 SyntaxError가 발생합니다. 평가 중에 오류가 발생하면 다른 예외가 발생할 수 있습니다.

반면에 raw_input은 문자열로 간주됩니다.

이 함수는 입력에서 한 줄을 읽고 문자열로 변환하고 (후행 줄 바꿈을 제거한) 그 결과를 반환합니다.