人为限制时指数超出范围

时间:2017-12-20 17:10:56

标签: python list

当我运行这个程序时,有时候我会收到一个错误。但是这个错误是不可能的,因为我使用的是8x8网格而且我限制输入以便它们只能是0-7的数字,以遵守这样的事实:列表索引从0开始。

用户必须输入坐标(1-8),(A-H),程序将通过系统地浏览CompShips列表并反复将这些坐标与用户给出的坐标进行比较来检查这些坐标是否正确。如果电线匹配,则会出现一条消息,并且" Z"将改为" X"在那些坐标上,表示HIT。如果猜测不匹配,则" Z"将改为" M"在那些指示MISS的坐标上。

POPT_ARG_LONGLONG

我收到错误:

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()

3 个答案:

答案 0 :(得分:1)

看起来像这两行

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

应该是

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

说明:在旧代码FireBoard[[FireRow][FireIndex]]=("H")

[FireRow][FireIndex]表示,给定列表[FireRow](仅包含一个元素),获取FireIndex个元素。这不是你想要做的。

例如[3][0]返回3[3][1]IndexError

查看How to define a two-dimensional array in Python

另请注意,("H")与字符串"H"相同。无需添加括号。

答案 1 :(得分:0)

你问题中的缩进是关闭的。我认为来自

的所有代码
 Guess=[FireRow,FireIndex]

直到最后应该有4个空格。

我已经删除了print(Index),因为它没有定义。

要访问FireBoard,请使用:

FireBoard[FireRow][FireIndex]

而不是

FireBoard[[FireRow][FireIndex]]

这应该有效

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()

答案 2 :(得分:0)

这是一个更清洁的代码!

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)正如评论中所解释的那样,这只是创建列表列表的更好方法!记住 DRY 原则! 不要重复自己!

2)而不是将所有if if转换为'A'而不是你可以使用字典查找!

3)你的问题似乎就在这里!将此更正为FireBoard[FireRow][FireIndex]="H"

PS:注意这一个!!! :我不只是将 FireBoard 作为 FROW 的别名!我将它作为新列表复制到FireBoard中!这里有一个subtle difference的读物。我这样做,你不希望修改原来的FROW列表!