我在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")
答案 0 :(得分:0)
修改强>
您修改了自己的问题,以便发布整个代码。一旦我纠正了一些IndetationError
,你的代码就可以运行而不会产生任何错误。
您的代码中只有两个不同的订阅 1 :CT
和l
。
l
是list
的元素,它只包含可订阅的元组。
因此,如果您发布的代码有效地引发了错误,则会通过订阅CT
来引发错误。
CT
的值在您发布的代码中未明确定义,因此我无法确定它是否可订阅。但是,这是此代码中唯一可能引发TypeError
'int' object is not subscriptable
的{{1}}的地方。
作为旁注,请注意list
永远不应该用作变量名。它引用list
类,重新分配它将覆盖list
构造函数。这同样适用于int
,str
,dict
,set
,float
和tuple
(可能还有其他)。
此外,您的代码中未定义CT
。这段裸代码会引发NameError
。您可能之前在其余代码中定义了它,并且Python容忍您从函数内部调用它,但由于您希望它是一个全局变量,您应该在您的开头添加global CT
功能的身体(虽然有更好的做法)。
1:订阅是指在对象上调用[]
运算符的时候。 l[1]
是对l
的订阅。