列表索引超出范围 ConnectFour

Posted

技术标签:

【中文标题】列表索引超出范围 ConnectFour【英文标题】:List index out of range ConnectFour 【发布时间】:2017-01-02 23:47:15 【问题描述】:

这个错误来了。我不知道那是什么。我是初级程序员

ConnectFourBoard.py",第 58 行,在 show_board_dynamic 中 print(self.__board[i][j], end = ""), IndexError: list index out of range

我的代码:

class ConnectFourBoard:
    def __init__(self, cols = 7, rows = 6, requiredToWin = 4):
        global __board
        self.__space = ''
        self.__board = []
        self.cols = cols
        self.rows = rows
        self.Win = requiredToWin
        self.__board = [[''] * rows for i in range(cols)]

        for i in range(cols):
            row = ['']*cols
            self.__board.append(row)

    def MakeMove(self, row, col, element):
        global __board
        self.__board[row][col] = element

    def CheckForWin(self):
        return winner

    def CheckHz():
        for x in range (6):
            for y in range (7):
                row += board[x][y]
                print("%s" %row)
                row = ""
                if "XXXX" in row:
                    print("Winner is X")
                    break;

    def CheckVt():
        for y in range(7):
            for x in range(6):
                column += board[y][x]
                print("%s" %column)
                column = ""
                if "XXXX" in column:
                    print ("Winner is X")
                    break;




    def FullBoard(self):
        return True

    def FreeSpace(self, row, col):
        return True

    def show_board_dynamic(self):
        print()
        print("-------")
        for i in range(len(self.__board)):
            for j in range(len(self.__board)):
                print("|", end = "")
                print(self.__board[i][j], end = ""),
            print("|")
            print("-------")
        print()

【问题讨论】:

查看pythontutor.com 尝试从您的__init__() 中删除这个for i in range(cols): row = ['']*cols self.__board.append(row),即它的最后几行。 【参考方案1】:

您有不同的行数和列数,但会在 len(self.__board) 上对它们进行迭代。

变化:

    for i in range(len(self.__board)):
        for j in range(len(self.__board)):
            print("|", end = "")
            print(self.__board[i][j], end = ""),
        print("|")
        print("-------")

到:

    for col in self.__board:
        for val in col:
            print("|", end = "")
            print(val, end = ""),
        print("|")
        print("-------")

【讨论】:

它有效,谢谢!!!但是当我只需要 6 行时,我的行数太多了,你知道为什么吗?【参考方案2】:

你应该

    将板更改为正方形,使 rows=cols。 分别删除 6 和 7 行和列的默认参数。 6 行 7 列的硬编码

有很多方法可以解决在整个程序中行和列不同步的错误。

        for i in range(len(self.__board)):
            for j in range(len(self.__board[0])):

这条线应该是固定的。

【讨论】:

这会解决我运行时打印太多行的问题吗? def show_board_dynamic(self): print() print("-------") for col in self.__board: for val in col: print("|", end = " ") print(val, end = ""), print("|") print("------") 我已经把那一行改成了这样,所以我不知道下一步该怎么做 请参阅我的回答以了解三种可能的解决方案。它仍然抛出错误吗?您在上面发布的评论将不起作用。它将遍历元素。相反,您想遍历索引并通过板打印索引中的值。 只需将第二个 for 循环替换为“for j in range(len(self.__board[0])):”

以上是关于列表索引超出范围 ConnectFour的主要内容,如果未能解决你的问题,请参考以下文章

Python - 索引错误 - 列表索引超出范围

findspark.init() 列表索引超出范围错误

IndexError:列表索引超出范围 - python 错误

Python:IndexError:列表索引超出范围

QQmlApplicationEngine 列表索引超出范围问题

Python循环:列表索引超出范围