2015-01-15 4 views
0

Я начинаю с python, и я создаю игру с двумя игроками tic tac toe в терминале. По сути, в этой игре есть все свои ошибки и изломы, однако у меня есть последняя проблема. В принципе, когда будет предложено ввести перемещение, если один пользователь вводит письмо, когда будет предложено переместить его куда-нибудь, если введена буква или не целое число, он сработает. Вот код, а затем я поставлю вывод, когда запускается игра, и пользователь вводит письмо после подсказки для перемещения.Python tic tac toe error error

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() 

ВЫВОД

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 

Можно ли решить эту проблему, так что если не-intiger вводится, это даст подсказку для движения снова (пока правильный ход не ставится в). Если это возможно, тогда как это будет сделано.

ответ

1

Да, исправить ваш немедленно проблема, используйте raw_input.

Под Python 2, input получит значение от вас then попытаться его оценить. Оценка 1 в порядке, но оценка 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() 

Python 3 также исправление с момента его input функции эквивалентно raw_input Pyhon 2.

0

При вызове input значение должно быть синтаксически корректным для python.

Эта функция не вызывает ошибок пользователя. Если вход не является синтаксически действительным, будет увеличен SyntaxError. Другие исключения могут быть подняты, если во время оценки имеется ошибка

С другой стороны, raw_input считается нитью.

Функция затем считывает строку с ввода, преобразует ее в строку (зачищая конечную новую строку) и возвращает ее.