#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 строки неизменяемы, поэтому вы не можете изменить их символы на месте.