Python-vol.2中基于文本的简单网格游戏

时间:2013-11-29 22:15:35

标签: python python-3.x

所以,我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)

1 个答案:

答案 0 :(得分:0)

嗯,您正在检查main功能中是否有墙;在move函数中进行此检查你感觉如何?您认为您对move的调用是否包含所有必要参数?


修改

我理解为什么你的代码不起作用:move方法,因为它在其参数上执行某些操作但不返回任何内容。

由于grid是可变的,您可以就地更改其值rowcol,{{1}的情况并非如此 },nRow:他们的值可以在nCol范围内更改,但move不会显示这些更改。这意味着从main看不到move拒绝无效移动,后者只有mainnRow的试用值,而不是更新后的值。

规避这种情况的一种方法就是返回nColnRow

nCol

def move(grid, ...): (...) return nRow, nCol 意识到这一点:

main

这样,def main(): (...) nRow, nCol = move(grid,row,col,nRow,nCol) row=nRow col=nCol 可以更新movenRownCol的值。


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