这一节,我们的任务是给图形绘制盖子,这个问题分为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)