2015-11-22 2 views
2

Моя курсовая работа - создать Tic Tac Toe в Python, мой преподаватель помог мне заставить его работать в 2,7, однако он должен быть в 3,5.Код Python работает в 2,7, но не в 3,5

Во-первых, в 2.7 приведенный ниже код печатает список 3x3, однако в 3.5 он просто печатает список вниз, а не 3x3. мой преподаватель сказал, может быть, положить end = ' ' в конце, но это также не работает.

def printBoard(board): 
    counter = 0 
    for y in range(3):  
     for x in range(3):  
      print (board[counter]),  
      counter += 1  
     print  
    print 

вторая проблема на 2.7 это позволяет мне продолжать вводить цифры, пока доска заполнена X или O, на 3.5 позволяет ввести только один раз, а затем программа завершается?

value = input("input number between 1 and 9")  
value = int(value)   
if value == 1:  
    alist[0] = player1  
    printBoard(alist)  
    value = input("input number between 1 and 9")  
if value == 2:  
    alist[1] = player1  
    printBoard(alist)  
    value = input("input number between 1 and 9") 

т.д.

+0

Вы использовали 'value = int (value)' только один раз, вы должны использовать его каждый раз, когда хотите принять ввод как 'int'. – ZdaR

ответ

4
  1. print изменился с statement на a function в Python 3.x. Чтобы распечатать заявление без перехода на новую строку, вам нужно передать end=' ' параметр (Вы можете использовать print как функция в Python 2.7, если вы поставите from __future__ import print_function в начале кода):

    print(board[counter], end=' ') 
    
  2. input возвращает строку в Python 3.x. (не оценивает входную строку). Вам нужно преобразовать значение в int каждый, где вы использовали input:

    value = input("input number between 1 and 9") 
    value = int(value) 
    

    В качестве альтернативы, вместо сравнения ввода с целой буквальным 1 или 2, сравнить введенную строку со строками: '1', '2' без преобразования строки в целое число. (Но это требует использования raw_input в Python 2.7 вместо input)

  3. print следует назвать: print(). В противном случае ничего не печатается.

+0

изменение 1 до '1' работало благодаря большому количеству людей, однако печать (board [counter], end = '') печатает только список, а не затем вниз. –

+0

Защиту printBoard (доска): Счетчик = 0 для г в диапазоне (3): для х в диапазоне (3): печать (доска [счетчик], конец = '') счетчик + = 1 печати вот как напечатанный список, im работает в 3.5, 1 2 3 4 5 6 7 8 9 номер ввода от 1 до 9 –

+2

используйте 'print()' вместо 'print' для перемещения текста в новую строку. – furas

0

Я полагаю board что-то вроде [['*', '*', '*'], ['*', '*', '*'], ['*', '*', '*']]. Это означает, что у вас есть простой способ печати с помощью одного вызова print().

print(*(''.join(row) for row in board), sep='\n') 

Это объединяет каждую строку в новую строку, создавая каждую строку как часть генератора. Этот генератор распаковывается с * и отправляется в print(), где каждая строка разделяется символом новой строки.

Для вашей второй проблемы проблема проста: вы сделали int() для первого value, но не для последующих. Однако это то, что вы должны делать с циклом. Это предотвратит именно такую ​​ошибку. Если вы обнаружите, что пишете много кода с помощью Ctrl + V, вы делаете что-то неправильно. Если каждый блок немного отличается, с добавленным числом, вы делаете это с чем-то вроде for i in range(n):, что позволяет выполнять тот же код с добавленным числом на каждой итерации.

Однако я бы рекомендовал простой while цикл, который проверяет, является ли игра закончена:

while True: 
    move = request_move() 
    do_move('X', move) 
    if game_complete(): 
     break 
    request_move() 
    do_move('O', move) 
    if game_complete(): 
     break 

Вы бы тогда написать соответствующие функции для запроса координат перемещения, вход переходит в борт, и если проверить игра завершена.

+0

Я также недавно опубликовал [мою собственную реализацию TTT] (http://codereview.stackexchange.com/questions/111386/text-based-tic-tac-toe-with-dry-and-pep-8) на CR, если вы хотите взглянуть. – TigerhawkT3

Смежные вопросы