所以,我had a question about simple text-based grid python game yesterday和你们中的一些人帮助了我。我已经弄清楚如何做动作并想出如何防止玩家穿过墙壁。我的move()
和main()
函数如下所示:
def move(grid,row,col,nRow,nCol):
grid[nRow][nCol]='O'
grid[row][col]=' '
if grid[nRow][nCol]==grid[row][col]:
grid[nRow][nCol]='O'
def main():
grid,row,col=initialize()
while True:
display(grid)
dir=int(input("Where you wanna go?: "))
if dir==2:
nRow=row+1
nCol=col
if grid[nRow][nCol]=='#':
nRow=row
nCol=col
print("There's a wall!")
move(grid,row,col,nRow,nCol)
row=nRow
col=nCol
main()
问题是我的main()
功能中存在墙壁状况,但我想将其移至move()
。但是,如果我这样做,玩家将只是穿过墙壁。那么,如何在保留功能的同时将墙面条件移动到move()
?
我试着这样做:
def move(grid,row,col,nRow,nCol):
if grid[nRow][nCol]=='#':
nRow=row
nCol=col
print("There's a wall!")
grid[nRow][nCol]='O'
grid[row][col]=' '
if grid[nRow][nCol]==grid[row][col]:
grid[nRow][nCol]='O'
def main():
grid,row,col=initialize()
while True:
display(grid)
dir=int(input("Where you wanna go?: "))
if dir==2:
nRow=row+1
nCol=col
move(grid,row,col,nRow,nCol)
答案 0 :(得分:0)
嗯,您正在检查main
功能中是否有墙;在move
函数中进行此检查你感觉如何?您认为您对move
的调用是否包含所有必要参数?
修改强>
我理解为什么你的代码不起作用:move
是方法,因为它在其参数上执行某些操作但不返回任何内容。
由于grid
是可变的,您可以就地更改其值但row
,col
,{{1}的情况并非如此 },nRow
:他们的值可以在nCol
范围内更改,但move
不会显示这些更改。这意味着从main
看不到move
拒绝无效移动,后者只有main
和nRow
的试用值,而不是更新后的值。
规避这种情况的一种方法就是返回nCol
和nRow
:
nCol
让def move(grid, ...):
(...)
return nRow, nCol
意识到这一点:
main
这样,def main():
(...)
nRow, nCol = move(grid,row,col,nRow,nCol)
row=nRow
col=nCol
可以更新move
中nRow
和nCol
的值。
your first question中 abarnet 的评论中给出的另一个解决方案是main
会在有墙的情况下引发move
:
Exception
您对此“尝试并处理问题”解决方案感觉如何?我觉得它更具可读性,异常的提升可以通过几层方法,这使得它们非常有用。
顺便说一句,在我看来,你的移动方法错过了一个条件块class MoveException(BaseException):
"""exception to be raised when move would hit a wall"""
pass
def move(grid, row, col, nRow, nCol):
if grid[nRow][nCol]=='#':
# illegal move!
raise MoveException
else:
# move can be done, updating grid content
grid[nRow][nCol] = '0' # moving character
grid[row][col] = ' ' # cleaning grid
def main()
grid,row,col=initialize()
while True:
display(grid)
dir=int(input("Where you wanna go?: "))
if dir==2:
nRow=row+1
nCol=col
# specify other possible movements here
# now trying to move
try:
move(grid,row,col,nRow,nCol)
except MoveException:
# illegal move!
# We do not update character's position.
# This could also be the place to print some error message
# but I'm lazy and will let you add something here ;)
pass
else:
# move could be performed, updating character's position
row, col = nRow, nCol
,这会使它更清洁一点:
else