【问题标题】:IndexErrors in Tic-Tac-Toe program I'm having issues with我遇到问题的井字游戏程序中的 IndexErrors
【发布时间】:2011-05-23 04:03:02
【问题描述】:
I've pasted the code here:

X = "X"
O = "O"
board = []
EMPTY = ""

def instructions_prompt ():
    print "\t\t\tNoughts and Crosses"
    print \
        """Foolish human. Now that you've entered this Python program,
       there is no exit. None! (At any point in the game if you feel
       like you are intimidated by my presence, hit 0 to exit)

       This challenge of wits will be one of many failures in your life.

       The instructions are as follows:

       1. Select a number from the following key:

                   0 | 1 | 2
                   ---------
                   3 | 4 | 5
                   ---------
                   6 | 7 | 8

       to place X or O which is predetermined by whether or not you start
       the game.

       2. Try to save face while failing. And don't talk about Fight Club."""

def start_prompt ():
    choice = raw_input ("Would you like to go first (Y/N)?")
    lower = choice.lower()
    if lower == "y":
        human = X
        computer = O
        print "You're",human
        print "I am",computer
    elif lower == "n":
        computer = X
        human = O
        print "You're",human
        print "I'm in",computer
    return human, computer

def display_board (board):
    print "",board[0],"|",board[1],"|",board[2],""
    print "---------"
    print "",board[3],"|",board[4],"|",board[5],""
    print "---------"
    print "",board[6],"|",board[7],"|",board[8],""

def turn_switcher (turn):
    if turn == X:
        return O
   else:
        return X 

def fresh_board ():
    for i in range (9):
        board.append (EMPTY)
    return board

def request_move ():
    try:
        square = int(raw_input("Where'd you like your square to be?"))
        if square>8 or square<0:
            print "This program can't proceed as that number is not on the board."
        else:
            return square
    except:
        print "That's not a number on the board. This program can't proceed."

def legal_moves (board):
    legal_moves = []
    for i in range (9):
        if board [i] == EMPTY:
            legal_moves.append(i)
    return legal_moves

def winner (board):
    if board[0] == board [1] == board [2] != EMPTY:
        winner = board [0]
        return winner
    elif board [0] == board [3] == board [6] != EMPTY:
        winner = board [0]
        return winner
    elif board [0] == board [4] == board [8] != EMPTY:
        winner = board [0]
        return winner
    elif board [1] == board [4] == board [7] != EMPTY:
        winner = board [1]
        return winner
    elif board [2] == board [5] == board [8] != EMPTY:
        winner = board [2]
        return winner
    elif board [2] == board [4] == board [6] != EMPTY:
        winner = board [2]
        return winner
    elif board [6] == board [7] == board [8] != EMPTY:
        winner = board [8]
        return winner
    elif EMPTY not in board:
        return None

def human_move (board, square):
    legal = legal_moves(board)
    if square not in legal: 
        print "This is not a legal move"
        sys.exit()
    else:
        return square

def computer_move (computer, board, human):
    best = (4,0,8,2,6,1,3,5,7)
    board = board [:]
    legal = legal_moves(board)
    for i in legal:
        board[i] = computer
        if winner(board) == computer:
            return i
        board = EMPTY

#Stopping human from winning
    for i in legal_moves(board):
        board [i] = human
        if winner(board) == human:
             return i

    for i in best:
        if i in legal_moves(board):
            return i

def main ():
    instructions_prompt ()
    human, computer = start_prompt ()
    turn = X
    board = fresh_board()
    request_move ()
    display_board (board)

    while not winner(board):
        if turn == human:
            square = request_move()
            move = human_move (board, square)
            board[move] = human
        else:
            move = computer_move(computer, board, human)
            board[move] = computer
        display_board(board)
        turn = turn_switcher(turn)

main ()
raw_input ("Enter a key to end.")

回溯:

Traceback (most recent call last):
  File "C:\Users\COMPAQ\Desktop\NoughtsCrosses.py", line 152, in <module>
  main ()
  File "C:\Users\COMPAQ\Desktop\NoughtsCrosses.py", line 147, in main
  move = computer_move(computer, board, human)
  File "C:\Users\COMPAQ\Desktop\NoughtsCrosses.py", line 118, in computer_move
 board[i] = computer
 TypeError: 'str' object does not support item assignment 

【问题讨论】:

  • 尽可能让问题自成一体。它使回答者更容易,即使 网络上的所有其他网站在一夜之间消失,SO 也应该保持有用!

标签: python debugging indexing tic-tac-toe


【解决方案1】:

您为函数computer_move 混淆了参数。在第 113 行,参数的顺序为 computerboardhuman。但是,在调用 computer_move 的第 147 行,顺序为 boardcomputerhuman

Python 给您带来了令人困惑的索引错误,因为 Python 字符串实际上只是字符列表。例如。

>>> "foo"[2] == "o"
True

更新:由于computer_move 的最后一行,您收到了这个新错误。它应该是board[i] = EMPTY 而不是board = EMPTY

【讨论】:

  • 这很有趣,不知道。但是,当我对参数进行更改时,会出现相同的片段并出现错误。我已将更改添加到原始问题。感谢您再次查看它1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多