Pygame101

001 Memory Puzzle - step6 绘制盖子

2019-08-19  本文已影响0人  爱学习的洋仔
绘制盖子

这一节,我们的任务是给图形绘制盖子,这个问题分为2个部分:

  1. 如何判断一个图形组里的哪个图形需要盖子
  2. 如何绘制盖子

先来看第一个问题:如何判断一个图形组里的哪个图形需要盖子

在游戏开始时, 所有的图形都有盖子, 随着玩家的操作, 有些图形对被找到, 盖子被打开, 这就需要一直记录每个位置的盖子信息, 我们通过一个和图形组对应的二维数组来完成, 二维数组记录了一些布尔值, 如果是True, 就是盖子被打开, 如果是False就需要盖子。
在游戏开始时,我们使用一个函数来产生盖子信息:

def generateRevealedBoxesData(val):
    revealedBoxes = []
    for i in range(BOARD_WIDTH):
        revealedBoxes.append([val] * BOARD_HEIGHT)
    return revealedBoxes

通过使用 revealedBoxes = generateRevealedBoxesData(False) 命令, 就可以在游戏开始时创建一个所有盖子都盖上的状态, 然后在游戏中, 可以修改某个盖子的状态: revealedBoxes[boxx][boxy] = True

下面是第二个问题:如何绘制盖子

首先,我们定义盖子颜色为白色:
BOXCOLOR = WHITE # 定义盖子颜色为白色
然后,我们根据图形的行列位置找到它的屏幕坐标
left, top = leftTopCoordsOfBox(boxx, boxy)
最后,我们使用pygame.draw.rect来绘制盖子
pygame.draw.rect(displaysurf, BOXCOLOR, (left, top, BOXSIZE, BOXSIZE))


有了包含是否需要绘制盖子的二维数组,知道了如何绘制盖子,我们要修改之前创建的drawBoard函数,使它可以根据数组信息绘制盖子/图形:

def drawBoard(displaysurf, board, revealed):
    # 根据信息绘制图形/盖子
    for boxx in range(BOARD_WIDTH):
        for boxy in range(BOARD_HEIGHT):
            left, top = leftTopCoordsOfBox(boxx, boxy)
            if not revealed[boxx][boxy]:    # 在这里进行判断,是否需要绘制盖子
                pygame.draw.rect(displaysurf, BOXCOLOR, (left, top, BOXSIZE, BOXSIZE))
            else:
                shape, color = getShapeAndColor(board, boxx, boxy)
                drawIcon(displaysurf, shape, color, boxx, boxy)

最后,修改mian函数,进行测试:

def main():
    pygame.init()
    fpsclock = pygame.time.Clock()
    displaysurf = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))

    pygame.display.set_caption("Memory Game")

    displaysurf.fill(BGCOLOR)

    board = getRandomizedBoard()
    # 创建包含盖子信息的二维数组
    revealedBoxes = generateRevealedBoxesData(False)

    while True:
        displaysurf.fill(BGCOLOR)
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()
                sys.exit()

        drawBoard(displaysurf, board, revealedBoxes)

        pygame.display.update()
        fpsclock.tick(FPS)
上一篇下一篇

猜你喜欢

热点阅读