2017-12-20 5 views
2

Wenn ich dieses Programm starte, erhalte ich manchmal einen Fehler. Dieser Fehler ist jedoch nicht möglich, da ich ein 8x8-Gitter verwende und die Eingänge so begrenze, dass sie nur Zahlen von 0 bis 8 sein können. 7, um der Tatsache zu folgen, dass Listenindizes bei 0 beginnen.Index außerhalb des Bereichs bei künstlicher Begrenzung

Der Benutzer muss Koordinaten eingeben (1-8), (AH) und das Programm wird überprüfen, um zu sehen, ob diese Koordinaten korrekt sind, indem die CompShips systematisch durchlaufen Liste und wiederholtes Vergleichen dieser Koordinaten mit den vom Benutzer angegebenen Koordinaten. Wenn die Kabel übereinstimmen, erscheint eine Nachricht und ein "Z" wird an diesen Koordinaten zu einem "X", was auf einen Treffer hinweist. Wenn die Schätzung nicht übereinstimmt, ändert sich ein "Z" an den Koordinaten, die eine MISS anzeigen, zu einem "M".

CompShips=[[1,0],[1,1],[2,2],[2,3],[2,4],[3,0],[3,1],[3,2],[5,4],[5,5],[5,6],[5,7],[1,7],[2,7],[3,7],[4,7],[5,7]] 
FRow1=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow2=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow3=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow4=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow5=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow6=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow7=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow8=["Z","Z","Z","Z","Z","Z","Z","Z",] 
def PrintFireBoard(): 
    print(Index) 
    print(FRow1) 
    print(FRow2) 
    print(FRow3) 
    print(FRow4) 
    print(FRow5) 
    print(FRow6) 
    print(FRow7) 
    print(FRow8) 
FireBoard=[FRow1,FRow2,FRow3,FRow4,FRow5,FRow6,FRow7,FRow8] 
while len(CompShips) !=0 or CompSuccess==17: 
    FireRow=input("Please Choose The Row That You Wish To Fire Upon (1-8) ") 
    FireIndex=input("Please Choose The Column That You Wish To Fire Upon (A-H) ") 
    #As Lists start at 0 
    FireRow=int(FireRow)-1 
    if FireIndex==("A"): 
     FireIndex=0 
    elif FireIndex==("B"): 
     FireIndex=1 
    elif FireIndex==("C"): 
     FireIndex=2 
    elif FireIndex==("D"): 
     FireIndex=3 
    elif FireIndex==("E"): 
     FireIndex=4 
    elif FireIndex==("F"): 
     FireIndex=5 
    elif FireIndex==("G"): 
     FireIndex=6 
    elif FireIndex==("H"): 
     FireIndex=7 
Guess=[FireRow,FireIndex] 
#Check To See If Correct 
UserSuccess=0 
for i in CompShips: 
    if Guess==i: 
     CompShips.remove(Guess) 
     UserSuccess=1 
    else: 
     pass 
if UserSuccess==1: 
    print("HIT") 
    print(FireRow) 
    print(FireIndex) 
    FireBoard[[FireRow][FireIndex]]=("H") 
    PrintFireBoard() 
else: 
    print("MISS") 
    print(FireRow) 
    print(FireIndex) 
    FireBoard[[FireRow][FireIndex]]=("M") 
    PrintFireBoard() 

erhalte ich die Fehlermeldung:

IndexError: string index out of range 
+1

Ermittelt Sie, in welcher Zeile 'IndexError' aufgetreten ist? – sam

+2

Nur ein kleiner Kommentar, anstatt das Board so zu bauen, können Sie mit diesem raffinierten Trick Objekte in eine Liste erweitern. '[" Z "] * 8 'erzeugt" [' Z ',' Z ',' Z ',' Z ',' Z ',' Z ',' Z ',' Z '] 'so ' [["Z"] * 8] * 8 'erzeugt eine 8x8 Liste von Listen mit "Z" als Elementen. –

+2

@AxelPersinger Das wird 8 Kopien des äußeren Arrays erstellen, wenn Sie also eines modifizieren, werden alle geändert. Sie müssen dies tun: '[['Z' für i in Bereich (8)] für j in Bereich (8)]' – user3080953

Antwort

1

wie diese beiden Linien Looks

FireBoard[[FireRow][FireIndex]]=("H") 
FireBoard[[FireRow][FireIndex]]=("M") 

sollte

FireBoard[FireRow][FireIndex]="H" 
FireBoard[FireRow][FireIndex]="M" 

sein Erläuterung: In Ihrem alten Code, FireBoard[[FireRow][FireIndex]]=("H")

[FireRow][FireIndex] Mittel, da eine Liste [FireRow] (die nur ein Element enthält), erhalten das FireIndex -te Element. Das ist nicht das, was du versuchst.

Zum Beispiel [3][0] gibt 3 zurück, und [3][1] gibt IndexError.

Werfen Sie einen Blick auf How to define a two-dimensional array in Python

Beachten Sie auch, dass ("H") die gleiche wie die Zeichenfolge "H" ist. Es müssen keine Klammern hinzugefügt werden.

0

Der Einzug in Ihrer Frage war deaktiviert. Ich denke, dass der gesamte Code von

Guess=[FireRow,FireIndex] 

bis zum Ende sollte 4 Leerzeichen vorangestellt werden.

Ich habe drucken (Index), da es nicht definiert wurde.

Um Fire Verwendung zuzugreifen:

FireBoard[FireRow][FireIndex] 

Statt

FireBoard[[FireRow][FireIndex]] 

Dies sollte ein viel sauberer Code

CompShips=[[1,0],[1,1],[2,2],[2,3],[2,4],[3,0],[3,1],[3,2],[5,4], 

[5,5],[5,6],[5,7],[1,7],[2,7],[3,7],[4,7],[5,7]] 
FRow1=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow2=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow3=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow4=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow5=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow6=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow7=["Z","Z","Z","Z","Z","Z","Z","Z",] 
FRow8=["Z","Z","Z","Z","Z","Z","Z","Z",] 
def PrintFireBoard(): 
    print(FRow1) 
    print(FRow2) 
    print(FRow3) 
    print(FRow4) 
    print(FRow5) 
    print(FRow6) 
    print(FRow7) 
    print(FRow8) 
FireBoard=[FRow1,FRow2,FRow3,FRow4,FRow5,FRow6,FRow7,FRow8] 
while len(CompShips) !=0 or CompSuccess==17: 
    FireRow=input("Please Choose The Row That You Wish To Fire Upon (1-8) ") 
    FireIndex=input("Please Choose The Column That You Wish To Fire Upon (A-H) ") 
    #As Lists start at 0 
    FireRow=int(FireRow)-1 
    if FireIndex==("A"): 
     FireIndex=0 
    elif FireIndex==("B"): 
     FireIndex=1 
    elif FireIndex==("C"): 
     FireIndex=2 
    elif FireIndex==("D"): 
     FireIndex=3 
    elif FireIndex==("E"): 
     FireIndex=4 
    elif FireIndex==("F"): 
     FireIndex=5 
    elif FireIndex==("G"): 
     FireIndex=6 
    elif FireIndex==("H"): 
     FireIndex=7 
    Guess=[FireRow,FireIndex] 
    #Check To See If Correct 
    UserSuccess=0 
    for i in CompShips: 
     if Guess==i: 
      CompShips.remove(Guess) 
      UserSuccess=1 
     else: 
      pass 
    if UserSuccess==1: 
     print("HIT") 
     print(FireRow) 
     print(FireIndex) 
     FireBoard[FireRow][FireIndex]=("H") 
     PrintFireBoard() 
    else: 
     print("MISS") 
     print(FireRow) 
     print(FireIndex) 
     FireBoard[FireRow][FireIndex]=("M") 
     PrintFireBoard() 
0

Hier arbeiten!

CompShips=[[1,0],[1,1],[2,2],[2,3], 
      [2,4],[3,0],[3,1],[3,2], 
      [5,4],[5,5],[5,6],[5,7], 
      [1,7],[2,7],[3,7],[4,7], 
      [5,7]] 

FRow=[["Z"]*8]*8 #1 More Pythonic 


def PrintFireBoard(): 
    #print(Index) 
    for i in range(0,8): 
     print(FRow[i]) 

FireBoard=FRow[:] #NOTE THIS ONE!!! 

mydict = {} 
for i,key in enumerate(["A","B","C","D","E","F","G","H"]): #2 More Pythonic 
    mydict[key] = i 


while len(CompShips) !=0 or CompSuccess==17: 
    FireRow=input("Please Choose The Row That You Wish To Fire Upon (1-8) ") 
    FireIndex=input("Please Choose The Column That You Wish To Fire Upon (A-H) ") 

    FireRow=int(FireRow)-1 
    FireIndex = mydict[FireIndex] 
    Guess=[FireRow,FireIndex] 
    print(Guess) 

    UserSuccess=0 
    for i in CompShips: 
     if Guess==i: 
      CompShips.remove(Guess) 
      UserSuccess=1 
     else: 
      pass 
    if UserSuccess==1: 
     print("HIT") 
     print(FireRow,FireIndex) 
     FireBoard[FireRow][FireIndex]="H" #3 your problem here 
     PrintFireBoard() 
    else: 
     print("MISS") 
     print(FireRow,FireIndex) 
     FireBoard[FireRow][FireIndex]="M" 
     PrintFireBoard() 

1) Wie in den Kommentaren erklärt das ist nur eine schönere Möglichkeit, eine Liste von Listen zu erstellen !. Denken Sie daran, DRY Prinzip!Nicht selbst wiederholen!

2) Anstatt alles, wenn sonst, um das 'A' auf 0 zu konvertieren. Sie können stattdessen eine Wörterbuchsuche verwenden!

3) Ihr Problem scheint hier zu sein! Korrigieren Sie dies zu FireBoard[FireRow][FireIndex]="H"

PS: HINWEIS DIESES!: Ich mache nicht nur FireBoard als Alias ​​zu FRow! Ich kopiere es in eine FireBoard als eine neue Liste! Es gibt eine subtle difference lesen Sie hier darüber. Ich mache das, wenn Sie nicht möchten, dass Ihre ursprüngliche FRow-Liste geändert wird!

Verwandte Themen