'int'对象不可订阅

时间:2017-05-16 14:55:49

标签: python

我在python中为我的IT课程编写了一个小型扫雷游戏。 现在我在第58行得到错误“'int'对象不可订阅”,这是一个在输入方块旁边生成地雷数量的函数

import random
from string import ascii_lowercase

gameHasEnded = False
size = 0
mines = 0
PG = []
CT = []

#eine clear Funktion um die Konsole zu leeren bzw. einfach runter zu scrollen
def cls():
     print ("\n"*100)

#Funktion in der Sämtliche Dinge stehen sie zum Start nur einmal ausgeführt werden müssen
def start():
    global size
    size=(int(input("size")))
    global mines
    mines=(int(input("mines")))
    #spielfeld wird generiert
    global PG
    PG = [["#" for i in range(size)]for j in range(size)]
    global gridsize
    gridsize = len(PG)
    #Kontrollfeld wird generiert
    global CT
    CT =[["0" for i in range(size)]for j in range(size)]



#Funktion zum Auswählen einer Zufallskoordinate
def getrandomcellandsetmine(grid):
    global mines
    while mines > 0:
        Z1 = random.randint(0, gridsize - 1)
        Z2 = random.randint(0, gridsize - 1)
        #print(Z1)
        #print(Z2)
        if CT[Z1][Z2] != "X":
            CT[Z1][Z2]="X"
            mines=mines-1

def generateNeighborCount():
    global CT
    for x in range(0,size):
        for y in range(0,size):
            if CT[x][y] != "X":
                a = 0
                list = [(-1, -1),
                        (0, -1),
                        (1, -1),
                        (-1, 1),
                        (0, 1),
                        (1, 1),
                        (-1, 0),
                        (1, 0)]
                for l in list:
                    newx = (x)+l[0]
                    newy = (x)+l[1]
                    if (newx >= 0 and newx < size and newy >= 0 and newy < size):
                       if CT[newx][newy] == "X":
                            a += 1
                       if a > 0:
                          CT[x][y] = str(a)


#Funktion um die Nachbarn einer eingegebenen Koordinate zu ermitteln
def openPos(pos):
    if (pos[0] < 0 or pos[0] >= size or pos[1] < 0 or pos[1] >= size):
        return
     if PG[pos[0]][pos[1]] == CT[pos[0]][pos[1]]:
         print("test")
         return
    PG[pos[0]][pos[1]] = CT[pos[0]][pos[1]]
    if CT[pos[0]][pos[1]] == " ":
        list = [(-1, -1),
                (0, -1),
                (1, -1),
                (-1, 1),
                (0, 1),
                (1, 1),
                (-1, 0),
                (1, 0)]
        for l in list:
            openPos(((pos[0]+l[0]), (pos[1]+l[1])))
    elif CT[pos[0]][pos[1]] == "X":
       gameHasEnded = True

        for xo in CT:
            x=CT.index(xo)
            for yo in CT[x]:
                y = CT[x].index(yo)
                if CT[x][y] == "X":
                    PG[x][y] = CT[x][y]

#Input der Koordinate als Int./Ausgabe der Anzahl der Umgebenden minen als Int.
#funktion für den Userinput
def userinput():
    ui=(input("deine koordinate (x-y)"))
    uiList = ui.split("-")
    pos = (int(uiList[0])-1), (int(uiList[1])-1)


    openPos(pos)


#Funktion zum schönen und übersichtlichen darstellen
def showplayground (grid):
     horizontal = '   ' + (4 * gridsize * '-') + '-'
     # Fügt Buchstaben oben ein
     toplabel = '     '

    for i in ascii_lowercase[:gridsize]:
        toplabel = toplabel + i + '   '

    print(toplabel + '\n' + horizontal)

    # Fügt links Zahlen ein
    for idx, i in enumerate(grid):
        row = '{0:2} |'.format(idx + 1)

        for j in i:
            row = row + ' ' + j + ' |'

        print(row + '\n' + horizontal)

    print('')






start()

#for i in range(len(PG)):
    #print(PG[i])

#for i in range(len(CT)):
 #   print(CT[i])

#cls()


getrandomcellandsetmine(PG)
generateNeighborCount()
while not gameHasEnded:
    cls()
    showplayground(CT)
    userinput()
#for i in range(len(CT)):
#   print(CT[i])
print ("Du hast verloren")

1 个答案:

答案 0 :(得分:0)

修改

您修改了自己的问题,以便发布整个代码。一旦我纠正了一些IndetationError,你的代码就可以运行而不会产生任何错误。

您的代码中只有两个不同的订阅 1 CTl

llist的元素,它只包含可订阅的元组。

因此,如果您发布的代码有效地引发了错误,则会通过订阅CT来引发错误。

CT的值在您发布的代码中未明确定义,因此我无法确定它是否可订阅。但是,这是此代码中唯一可能引发TypeError 'int' object is not subscriptable的{​​{1}}的地方。

作为旁注,请注意list永远不应该用作变量名。它引用list类,重新分配它将覆盖list构造函数。这同样适用于intstrdictsetfloattuple(可能还有其他)。

此外,您的代码中未定义CT。这段裸代码会引发NameError。您可能之前在其余代码中定义了它,并且Python容忍您从函数内部调用它,但由于您希望它是一个全局变量,您应该在您的开头添加global CT功能的身体(虽然有更好的做法)。

1:订阅是指在对象上调用[]运算符的时候。 l[1]是对l的订阅。