Код 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")

И т. д.

2 2

2 ответа:

  1. print изменен соператора нафункцию в 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(). В противном случае ничего не печатается.

Я предполагаю, что 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

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