代码无法正常工作,清除错误消息,但找不到源

时间:2019-04-21 15:06:22

标签: 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

2 个答案:

答案 0 :(得分:0)

将董事会更改为列表而不是字符串。

在Python中,字符串是不可变的,因此您不能就地更改其字符。

答案 1 :(得分:0)

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

这是行不通的,因为str元素是不可变的,也就是说,您不能更改其各个元素。如果要更改字符串的元素,您不能将其转换为list