Код не работает, очистить сообщение об ошибке, но не удается найти источник

#python-3.x

#python-3.x

Вопрос:

У меня есть следующий код, и я просто не могу найти причину ошибки. Это игра в крестики-нолики, которая принимает вводимые пользователем данные и помещает их на доску, проверяя и решая, является ли это ничьей или кто-либо из игроков выиграл. Я делаю это в записной книжке Jupyter. Когда какой-либо игрок должен выбрать позицию на доске, он выдает следующую ошибку:

 ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-28-e7a9cb1b19c0> in <module>()
    107             display_board(theBoard)
    108             position = player_choice(theBoard)
--> 109             place_marker(theBoard, player1_marker, position)
    110 
    111             if win_check(theBoard, player1_marker):

<ipython-input-28-e7a9cb1b19c0> in place_marker(board, marker, position)
     34 def place_marker(board, marker, position):
     35 
---> 36     board[position] = marker
     37 
     38 

TypeError: 'str' object does not support item assignment
  

Я проверил все функции, но безрезультатно, кажется, у меня все в порядке. Даже сравнил его с правильным решением (это курс) и не повезло.
Вот код:

 from IPython.display import clear_output

import random

def display_board(board):

    clear_output()   # Or just print('n'*100)
    print("   |   |")
    print(" "   board[7]   " | "   board[8]   " | "   board[9])
    print("   |   |")
    print("-----------")
    print("   |   |")
    print(" "   board[4]   " | "   board[5]   " | "   board[6])
    print("   |   |")
    print("-----------")
    print("   |   |")
    print(" "   board[1]   " | "   board[2]   " | "   board[3])
    print("   |   |")


def player_input():

    marker = ""

    while not (marker == "X" or marker == "O"):
        marker = input("Player 1: Do you want to be X or O? ").upper()

    if marker == "X":
        return ("X", "O")
    else:
        return ("O", "X")


def place_marker(board, marker, position):

    board[position] = marker


def win_check(board, mark):

    return ((board[7] == board[8] == board[9] == mark) or # across the top
            (board[4] == board[5] == board[6] == mark) or # across the middle
            (board[1] == board[2] == board[3] == mark) or # across the bottom
            (board[7] == board[4] == board[1] == mark) or # down the lef tside
            (board[8] == board[5] == board[2] == mark) or # down the middle
            (board[9] == board[6] == board[3] == mark) or # down the right side
            (board[7] == board[5] == board[3] == mark) or # diagonal
            (board[9] == board[5] == board[1] == mark)) # diagonal


def choose_first():

    flip = random.randint(0,1)

    if flip == 0:
        return "Player 2"

    else:
        return "Player 1"


def space_check(board, position):

    return board[position] == " "    


def full_board_check(board):

    for i in range(1,10):
        if space_check(board,i):

            return False
    return True


def player_choice(board):

    position = 0

    while position not in [1,2,3,4,5,6,7,8,9] or not space_check(board, position):
        position = int(input("Choose your next position: (1-9)")) 

    return position


def replay():

    return input("Do you want to play again? Enter Yes or No: ").lower().startswith("y")    


print('Welcome to Tic Tac Toe!')

while True:

    theBoard = " " * 10
    player1_marker, player2_marker = player_input()
    turn = choose_first()
    print (turn   " will go first.")

    play_game = input("Are you ready to play? Enter Yes or No.")

    if play_game.lower()[0] == "y":
        game_on = True

        if turn == "Player 1":

            display_board(theBoard)
            position = player_choice(theBoard)
            place_marker(theBoard, player1_marker, position)

            if win_check(theBoard, player1_marker):
                display_board(theBoard)
                print("Congratulations! You have won the game!")
                game_on = False

            else:
                if full_board_check(theBoard):
                    display_board(theBoard)
                    print("The game is a draw!")
                    break

                else:
                    turn = "PLayer 2"

        else:


            display_board(theBoard)
            position = player_choice(theBoard)
            place_marker(theBoard, player2_marker, position)

            if win_check(theBoard, player2_marker):
                display_board(theBoard)
                print("Player 2 has won!")
                game_on = False

            else:
                if full_board_check(theBoard):
                    display_board(theBoard)
                    print("The game is a draw!")
                    break

                else:
                    turn = "PLayer 1"

    if not replay():
        break
  

Ответ №1:

 theBoard = " " * 10
# later...
theBoard[2] = # anything
  

Это не сработает, потому str что ing являются неизменяемыми, то есть вы не можете изменить их отдельные элементы. Если вы хотите изменить элемент строки, вы не можете преобразуйте его в a list .

Комментарии:

1. Вау, спасибо! Да, я понял, в чем заключалась ошибка (само сообщение), но оно указывало на другое направление по сравнению с тем, где была ошибка. Да, теперь все ясно, я сделаю из этого [» «] , спасибо за помощь, ребята!

Ответ №2:

Измените доску на список вместо строки.

В Python строки неизменяемы, поэтому вы не можете изменить их символы на месте.