Распечатать часть 2D-списка - PullRequest
5 голосов
/ 14 марта 2019

Мне нужно создать игру-лабиринт, которая получает от пользователя команду для игры. Я написал код для игры-лабиринта. То, что я хочу изменить, это показывать часть лабиринта, когда он распечатан пользователю (после того, как был сделан ход). Вот лабиринт, который у меня есть:

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               

т.е. так что он может видеть только 2 другие клетки в каждом направлении.

Надеюсь, я прояснил вопрос. Ниже приведена часть кода, которая является основной игрой, если это необходимо:

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 Ответ

4 голосов
/ 14 марта 2019
Массивы

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 включительно .

max(y-2, 0) существует в случае падения y-2ниже 0 (т.е. отрицательный).Нарезка с отрицательным индексом begin и положительным индексом end возвращает пустой список (например, some_array[-1:1] ==> []).То же самое касается max(x-2, 0).Мы могли бы также добавить min(y+3, <height-of-level>) и min(x+3, <width-of-level>) для end -индексов, но срезание массива уже обрабатывает эти крайние случаи - так что это все хорошо.

NB Для этого требуется установить модуль NumPy.Если это еще не сделано, установите его, введя python -m pip install numpy в командной строке / терминале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...