Python: IndexError: list index out of range happens in some case only
Python: IndexError: list index out of range happens in some case only
我一直在做一个井字游戏的程序,需要两个玩家轮流输入棋盘的坐标,比如(r1,c1)->(r2,c2)->(r3,c3)-> …
,其中r是行,c是专栏和董事会看起来像
0 1 2
3 4 5
6 7 8
我输入的程序:
board=[0,1,2,3,4,5,6,7,8]
def show():
print(str(board[0])+str(board[1])+str(board[2]))
print(str(board[3])+str(board[4])+str(board[5]))
print(str(board[6])+str(board[7])+str(board[8]))
def check(char,spot1,spot2,spot3):
if board[spot1]==char and board[spot2]==char and board[spot3]==char:
return True
def checkAll(char):
if check(char,0,1,2):
return True
if check(char,3,4,5):
return True
if check(char,6,7,8):
return True
if check(char,0,3,6):
return True
if check(char,1,4,7):
return True
if check(char,2,5,8):
return True
if check(char,0,4,8):
return True
if check(char,2,4,6):
return True
else:
return False
def ChangeSpotInputToAList(spotInput):
spotafter=[]
for i in spotInput:
if i=="(0,0)":
spotafter.append(0)
if i=="(0,1)":
spotafter.append(1)
if i=="(0,2)":
spotafter.append(2)
if i=="(1,0)":
spotafter.append(3)
if i=="(1,1)":
spotafter.append(4)
if i=="(1,2)":
spotafter.append(5)
if i=="(2,0)":
spotafter.append(6)
if i=="(2,1)":
spotafter.append(7)
if i=="(2,2)":
spotafter.append(8)
return spotafter
i=0
spotInput=input().split("->")
spotafter=ChangeSpotInputToAList(spotInput)
for x in spotafter:
show()
if spotafter[x]%2==0:
print("X-->",x)
spot=x
i+=1
char="X"
board[spot]=char
if i==9:
show()
print("Winner: None")
break
if checkAll(char):
show()
print("Winner:",char)
break
if spotafter[x]%2==1:
print("O-->",x)
spot=x
i+=1
char="O"
board[spot]=char
if i==9:
show()
print("Winner: None")
break
if checkAll(char):
show()
print("Winner:",char)
break
我尝试了一些输入,但其中一个一直出错,即(2,2)->(0,0)->(1,1)->(0,2)->(1,0)->(0,1)
,程序显示:
012
345
678
Traceback (most recent call last):
File "thisishardlol.py", line 55, in <module>
if spotafter[x]%2==0:
IndexError: list index out of range
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
from apport.report import Report
File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
import apport.fileutils
File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
from apport.packaging_impl import impl as packaging
File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 24, in <module>
import apt
File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
Original exception was:
Traceback (most recent call last):
File "thisishardlol.py", line 55, in <module>
if spotafter[x]%2==0:
IndexError: list index out of range
有人知道我哪里错了吗?任何帮助将不胜感激!
让我们运行通过一个场景。
spotInput=input().split("->")
spotafter=ChangeSpotInputToAList(spotInput)
如果我输入 (2,2)->(2,2)
那么 spotafter = [8,8]
现在我进入我的 for 循环:
for x in spotafter:
show()
if spotafter[x]%2==0:
在我的第一个循环 x = 8
中,我试图获得 spotafter[8]
,它不存在(spotafter
只有 2 个元素)。
因为我不知道您的目标,所以我帮不上什么忙,但这就是您收到 IndexError 的原因。
我一直在做一个井字游戏的程序,需要两个玩家轮流输入棋盘的坐标,比如(r1,c1)->(r2,c2)->(r3,c3)-> …
,其中r是行,c是专栏和董事会看起来像
0 1 2
3 4 5
6 7 8
我输入的程序:
board=[0,1,2,3,4,5,6,7,8]
def show():
print(str(board[0])+str(board[1])+str(board[2]))
print(str(board[3])+str(board[4])+str(board[5]))
print(str(board[6])+str(board[7])+str(board[8]))
def check(char,spot1,spot2,spot3):
if board[spot1]==char and board[spot2]==char and board[spot3]==char:
return True
def checkAll(char):
if check(char,0,1,2):
return True
if check(char,3,4,5):
return True
if check(char,6,7,8):
return True
if check(char,0,3,6):
return True
if check(char,1,4,7):
return True
if check(char,2,5,8):
return True
if check(char,0,4,8):
return True
if check(char,2,4,6):
return True
else:
return False
def ChangeSpotInputToAList(spotInput):
spotafter=[]
for i in spotInput:
if i=="(0,0)":
spotafter.append(0)
if i=="(0,1)":
spotafter.append(1)
if i=="(0,2)":
spotafter.append(2)
if i=="(1,0)":
spotafter.append(3)
if i=="(1,1)":
spotafter.append(4)
if i=="(1,2)":
spotafter.append(5)
if i=="(2,0)":
spotafter.append(6)
if i=="(2,1)":
spotafter.append(7)
if i=="(2,2)":
spotafter.append(8)
return spotafter
i=0
spotInput=input().split("->")
spotafter=ChangeSpotInputToAList(spotInput)
for x in spotafter:
show()
if spotafter[x]%2==0:
print("X-->",x)
spot=x
i+=1
char="X"
board[spot]=char
if i==9:
show()
print("Winner: None")
break
if checkAll(char):
show()
print("Winner:",char)
break
if spotafter[x]%2==1:
print("O-->",x)
spot=x
i+=1
char="O"
board[spot]=char
if i==9:
show()
print("Winner: None")
break
if checkAll(char):
show()
print("Winner:",char)
break
我尝试了一些输入,但其中一个一直出错,即(2,2)->(0,0)->(1,1)->(0,2)->(1,0)->(0,1)
,程序显示:
012
345
678
Traceback (most recent call last):
File "thisishardlol.py", line 55, in <module>
if spotafter[x]%2==0:
IndexError: list index out of range
Error in sys.excepthook:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 63, in apport_excepthook
from apport.fileutils import likely_packaged, get_recent_crashes
File "/usr/lib/python3/dist-packages/apport/__init__.py", line 5, in <module>
from apport.report import Report
File "/usr/lib/python3/dist-packages/apport/report.py", line 30, in <module>
import apport.fileutils
File "/usr/lib/python3/dist-packages/apport/fileutils.py", line 23, in <module>
from apport.packaging_impl import impl as packaging
File "/usr/lib/python3/dist-packages/apport/packaging_impl.py", line 24, in <module>
import apt
File "/usr/lib/python3/dist-packages/apt/__init__.py", line 23, in <module>
import apt_pkg
ModuleNotFoundError: No module named 'apt_pkg'
Original exception was:
Traceback (most recent call last):
File "thisishardlol.py", line 55, in <module>
if spotafter[x]%2==0:
IndexError: list index out of range
有人知道我哪里错了吗?任何帮助将不胜感激!
让我们运行通过一个场景。
spotInput=input().split("->")
spotafter=ChangeSpotInputToAList(spotInput)
如果我输入 (2,2)->(2,2)
那么 spotafter = [8,8]
现在我进入我的 for 循环:
for x in spotafter:
show()
if spotafter[x]%2==0:
在我的第一个循环 x = 8
中,我试图获得 spotafter[8]
,它不存在(spotafter
只有 2 个元素)。
因为我不知道您的目标,所以我帮不上什么忙,但这就是您收到 IndexError 的原因。