2017-05-16 1 views
-2

Ich programmiere ein kleines Minesweeper-Spiel in Python für meinen IT-Kurs in der Schule. Jetzt bekomme ich die Fehlermeldung „‚int‘Objekt ist nicht subscriptable“ in Zeile 58, eine Funktion, die'int' Objekt ist nicht unterscheidbar

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") 
+2

Wie ordnen wir Zeile 58 Ihrem gebuchten Code zu, der weniger als 58 Zeilen enthält? Auch Ihre Einrückung ist falsch – EdChum

+1

Sie sollten Ihre Liste nicht aufrufen, da dies der Name des Listentyps ist. – khelwood

+1

Dieser Code würde nicht den Fehler erzeugen, den Sie in der von Ihnen angegebenen Zeile beschreiben. – khelwood

Antwort

0

EDIT die Menge an Minen neben dem Eingabe Quadrat erzeugt

Sie bearbeitet Ihre Frage, um Ihren gesamten Code zu veröffentlichen. Nachdem ich ein paar IndetationError s korrigiert hatte, funktionierte Ihr Code, ohne einen Fehler zu verursachen.


Es gibt nur zwei verschiedene Abonnements im Code: bis CT und zu l.

l ist ein Element von list, das nur Tupel enthält, die eingruppierbar sind.

Wenn der Fehler effektiv durch den von Ihnen geposteten Code ausgelöst wird, wird er daher von einem Abonnement auf CT ausgelöst.

Der Wert CT ist in dem von Ihnen geposteten Code nicht klar definiert, daher kann ich nicht sicher sein, dass er subscriptierbar ist. Dies ist jedoch der einzige mögliche Ort in diesem Codeabschnitt, der eine TypeError mit der Angabe 'int' object is not subscriptable auslösen könnte.


Als Randbemerkung, bitte beachten Sie, dass list nie als Variablennamen verwendet werden soll. Sie bezieht sich auf die Klasse list, und ihre Neuzuweisung würde den Konstruktor list überschreiben. Gleiches gilt für int, str, dict, set, float und tuple (und wahrscheinlich andere).

Außerdem ist CT nicht in Ihrem Code definiert. Dieser nackte Code würde eine NameError auslösen. Wahrscheinlich hast du es vorher im Rest deines Codes definiert, und Python toleriert, dass du es aus dem Inneren deiner Funktion herausrufst, aber da du erwartest, dass es eine globale Variable ist, solltest du global CT am Anfang des Körpers deiner Funktion hinzufügen (though es gibt bessere Praktiken).


1: Ein Abonnement ist, wenn Sie den [] Operator auf ein Objekt aufrufen. l[1] ist ein Abonnement für l.

Verwandte Themen