«Карта списка», как вы ее назвали, - это просто 2D-карта, где каждый символ / буква представляет отдельную текстуру плитки на экране.Каждая строка на карте определяет строку на экране.
Приведенный ниже код берет массив / список из вопроса и выводит его на экран в виде плитки кирпича или травы.Текстуры взяты из https://opengameart.org. В основном, когда вызывается функция drawMap()
, двойной цикл перебирает строки уровня, рисуя сетку из 32x32 графических растровых изображений, которые меняются для каждой буквы.
Остальная часть кода предназначена для простой обработки основного окна, ввода с помощью клавиши со стрелкой и изменения размераwindow.
import pygame
import time
import sys
# Window size
WINDOW_WIDTH=400
WINDOW_HEIGHT=400
pygame.init()
WINDOW = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE )
pygame.display.set_caption("Map Loader")
clock = pygame.time.Clock()
TILE_SIZE = 32
wall_image = pygame.image.load('brick_32.png')
grass_image = pygame.image.load('grass_32.png')
level = [
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",
"P P",
"P P",
"P P",
"P PPPPPPPPPPP P",
"P P",
"P P",
"P P",
"P PPPPPPPP P",
"P P",
"P PPPPPPP P",
"P PPPPPP P",
"P P",
"P PPPPPPP P",
"P P",
"P PPPPPP P",
"P P",
"P PPPPPPPPPPP P",
"P P",
"P PPPPPPPPPPP P",
"P P",
"P P",
"P P",
"P P",
"PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP",]
def drawMap( screen, level ):
level_width = len(level[0]) # width for first row
level_height = len(level) # number of rows
for y in range( level_height ):
for x in range ( level_width ):
if ( level[y][x] == 'P' ):
screen.blit( wall_image, ( x*TILE_SIZE, y*TILE_SIZE) )
elif ( level[y][x] == ' ' ):
screen.blit( grass_image, (x*TILE_SIZE, y*TILE_SIZE) )
def drawGameWindow( screen ):
global WINDOW_WIDTH, WINDOW_HEIGHT
drawMap( screen, level )
pygame.display.update()
pygame.display.flip()
clock = pygame.time.Clock()
done = False
while not done:
for event in pygame.event.get():
if ( event.type == pygame.QUIT ):
done = True
elif ( event.type == pygame.VIDEORESIZE ):
WINDOW_WIDTH = event.w
WINDOW_HEIGHT = event.h
WINDOW = pygame.display.set_mode( ( WINDOW_WIDTH, WINDOW_HEIGHT ), pygame.HWSURFACE|pygame.DOUBLEBUF|pygame.RESIZABLE )
# Movement keys
keys = pygame.key.get_pressed()
if ( keys[pygame.K_UP] ):
print("up")
elif ( keys[pygame.K_DOWN] ):
print("down")
elif ( keys[pygame.K_LEFT] ):
print("left")
elif ( keys[pygame.K_RIGHT] ):
print("right")
drawGameWindow( WINDOW )
clock.tick_busy_loop( 60 )
pygame.quit()
Очевидно, что в реальной игре карта намного больше экрана.Поэтому необходимо написать код, чтобы нарисовать только правильный участок карты на экране.Пример кода выше наивно просто рисует из верхнего левого угла.Если карта списка была довольно сложной, возможно, стоит загрузить все текстуры тайлов в словарь, а затем просто рисовать по номерам , например: textures['P']
-> textures[ level[y][x] ]
Существуют также библиотеки Python, которые уже справятся со всем этим.Один популярный пример - TMX , но есть и несколько других.
Оффтоп, но соответствующее примечание :
Если вы когда-либо видели Roguelike-игра (мой личный фаворит Angband ), они используют буквы в качестве "графических" элементов, например, игрок @
, Дракон d
или D
,им никогда не требовалось использовать причудливую графику, и они сделали великолепную игру, используя только текстовые символы.