打印2D列表的一部分

时间:2019-03-14 12:41:16

标签: python list maze

我必须创建一个迷宫游戏,该迷宫游戏接收来自用户的命令作为玩游戏。我已经为迷宫游戏编写了代码。我要修改的是仅将迷宫的 part 显示在打印给用户时(进行移动之后)。这是我的迷宫:

level = [
    ["1"," ","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1"],
    ["1"," "," ","1","1","1","1","1","1","1"," "," "," "," "," "," "," "," "," "," ","1","1","1","1","1"],
    ["1"," "," ","1","1","1","1","1","1","1"," "," ","1","1","1","1","1","1"," "," ","1","1","1","1","1"],
    ["1"," "," "," "," "," "," "," ","1","1"," "," ","1","1","1","1","1","1"," "," ","1","1","1","1","1"],
    ["1"," "," "," "," "," "," "," ","1","1"," "," ","1","1","1"," "," "," "," "," "," "," "," ","1","1"],
    ["1"," ","1","1","1","1"," "," ","1","1"," "," ","1","1","1"," "," "," "," "," "," "," "," ","1","1"],
    ["1"," ","1","1","1","1"," "," ","1","1"," "," ","1","1","1","1","1","1"," "," ","1","1","1","1","1"],
    ["1"," ","1","1","1","1"," "," ","1","1"," "," "," "," ","1","1","1","1"," "," ","1","1","1","1","1"],
    ["1"," "," ","1","1","1"," "," "," "," "," "," "," "," ","1","1","1","1"," "," "," "," "," "," ","1"],
    ["1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1","1"," ","1"]
]

start_maze = level[0][1]      #start of maze
end_maze = level[9][23]       #end of maze

具有这样的输出:

The initial configuration of the maze is:
1 X 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1     1 1 1 1 1 1 1                     1 1 1 1 1
1     1 1 1 1 1 1 1     1 1 1 1 1 1     1 1 1 1 1
1               1 1     1 1 1 1 1 1     1 1 1 1 1
1               1 1     1 1 1                 1 1
1   1 1 1 1     1 1     1 1 1                 1 1
1   1 1 1 1     1 1     1 1 1 1 1 1     1 1 1 1 1
1   1 1 1 1     1 1         1 1 1 1     1 1 1 1 1
1     1 1 1                 1 1 1 1             1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1   1

我如何做到这一点,以使玩家在走动时只能看到迷宫的一部分,而看不到尽头(这很容易)?

例如,具有这样的视图:

    1   1 1 1
    1     1 1 
    1   X 1 1 
    1          
    1               

即这样他在每个方向只能看到另外两个单元格。

我希望我把问题弄清楚了。如果需要的话,下面是主要游戏的代码部分:

player = {'y': 0, 'x': 1}
level[player['y']][player['x']] = 'X'

# Translate keywords into coordinate changes
move_modifications = {'UP': {'y': -1, 'x': 0},
                      'DOWN': {'y': 1, 'x': 0},
                      'LEFT': {'y':0, 'x': -1},
                      'RIGHT': {'y': 0, 'x': 1}} 

def player_move(maze):

    # Main game loop
    play = True
    while play:
        move = input("Please enter a command (LEFT/RIGHT/UP/DOWN): ")
        move = move.upper()

        coords = move_modifications[move]

        new_y = player['y'] + coords['y']
        new_x = player['x'] + coords['x']

        #Catch them if they try to leave the map
        try:
            maze_position = maze[new_y][new_x]
        except IndexError:
            print("Not on map")
            continue

        if maze_position != '1':
            # Move on the map
            maze[player['y']][player['x']] = ' '
            maze[new_y][new_x] = 'X'

            # Update player coords
            player['y'] = new_y
            player['x'] = new_x

            # Print result
            print_level(maze)

其余代码只是在四处移动,不包含任何迷宫打印。

1 个答案:

答案 0 :(得分:4)

NumPy数组可方便地对二维列表进行切片。考虑下面的代码和片段。

# load numpy from its module
import numpy as np

# create a numpy array
np_level = np.array(level)

# slice the map
slice = np_level[max(new_y-2,0) : new_y+3, \    # y slice
                 max(new_x-2,0) : new_x+3]      # x slice

# print the slice
print(slice)
# or print_level(slice), whichever one suits your case

这将获取您的2D数组level,制作一个NumPy数组np_level,然后从范围[y-2, y+3)[x-2, x+3)中打印它的一部分(使用间隔符号)。这意味着它将切片从y-2切成y+2,并且从x-2切成x+2 inclusive

如果max(y-2, 0)低于0(即负数),则y-2在那里。 开始索引为负而 end 索引为正的切片将返回一个空列表(例如some_array[-1:1] ==> [])。 max(x-2, 0)也是如此。我们还可以为 end -indices添加min(y+3, <height-of-level>)min(x+3, <width-of-level>),但是数组切片已经可以处理这些极端情况-那就很好了。

N.B。这需要安装NumPy模块。如果尚未安装,请在命令行/终端输入python -m pip install numpy进行安装。