首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中,类似字符的列表映射是如何工作的?

在Python中,类似字符的列表映射是如何工作的?
EN

Stack Overflow用户
提问于 2019-02-10 21:42:44
回答 1查看 77关注 0票数 1

列表图是如何工作的?我看到他们长得像这样

代码语言:javascript
运行
复制
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",]

我也见过这样的多维数组。我知道我们迭代了它们,但是我们到底是如何使它们出现在我们的游戏中的,它们在游戏开发社区中是如何被真正调用的呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-10 22:29:52

正如你所说的“列表地图”,只是一个2D地图,每个符号/字母在屏幕上代表一个不同的瓷砖纹理。地图中的每一行都定义了屏幕上的一行。

下面的代码从问题中获取数组/列表,并将其作为砖瓦或草瓦绘制到屏幕上。纹理来自https://opengameart.org。基本上,当调用drawMap()函数时,双循环在级别字符串上迭代,绘制由32x32个图形位图组成的网格,每个字母都会发生变化。

剩下的代码只是处理窗口的基本打开、箭头键输入和窗口的调整大小。

代码语言:javascript
运行
复制
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游戏 (我个人最喜欢的是英吉利带 ),他们会用字母作为“图形”元素,比如玩家是@,龙是dD,他们从来不需要使用花哨的图形,并且用文字符号做了一个很棒的游戏。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54621372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档