当前位置:文档之家› 少儿编程分享:手把手教你用Python编写推星星游戏(八)

少儿编程分享:手把手教你用Python编写推星星游戏(八)

少儿编程分享:手把手教你用Python编写推星星游戏(八)
少儿编程分享:手把手教你用Python编写推星星游戏(八)

游戏分享:手把手教你用Python编写推星星

游戏(八)

2017.12.10

这是推星星游戏的最后一期了

希望每个学习了的同学都能制作出你自己的推星星游戏

记得巩固好知识噢~

Drawing the Map绘制地图

535.def drawMap(mapObj,gameStateObj,goals):

536.#将地图绘制为表层对象,包括角色和星星

537.#这个函数无需调用pygame.display.update()

538.#也不用再角落绘制关卡,步数文本。

539.

540.#将是用来绘制方块在上面的单独的表层对象

541.#所以将很容易在DISPLAYSURF表层对象中定位整张地图

542.#首先,需要就地图的宽和长

543.mapSurfWidth=len(mapObj)*TILEWIDTH

544.mapSurfHeight=(len(mapObj[0])-1)*(TILEHEIGHT-TILEFLOORHEIGHT)+TILEHEIGHT

545.mapSurf=pygame.Surface((mapSurfWidth,mapSurfHeight))

546.mapSurf.fill(BGCOLOR)#无填充色开始

drawMap()函数会将整张地图反馈至表层对象。

而地图的大小将从mapObj中计算得出。而在表层对象上绘制的所有东西将在545行创建。一开始,整个表层对象以背景色来绘制。

548.#将方块精灵绘制在表层上

549.for x in range(len(mapObj)):

550.for y in range(len(mapObj[x])):

551.spaceRect=pygame.Rect((x*TILEWIDTH,y*(TILEHEIGHT-TILEFLOORHEIGHT),TILEWIDTH,TILEHEIGHT))

549和550的嵌套for循环将检索地图上所有XY坐标并绘制合适的方块图片在当前坐标上

552.if mapObj[x][y]in TILEMAPPING:

553.baseTile=TILEMAPPING[mapObj[x][y]]

554.elif mapObj[x][y]in OUTSIDEDECOMAPPING:

555.baseTile=TILEMAPPING['']

556.

557.#首先绘制地基和墙

558.mapSurf.blit(baseTile,spaceRect)

559.

baseTile变量将设置为表层方块图片对象中将要绘制在当前XY坐标的方块坐标。如果单字符串储存在OUTSIDEDECOMAPPING字典里,那么TILEMAPPING就用得上了。

560.if mapObj[x][y]in OUTSIDEDECOMAPPING:

561.#D在这个方块上绘制装饰

562.mapSurf.blit(OUTSIDEDECOMAPPING[mapObj[x][y]],spaceRect)

除此之外,如果方块列在OUTSIDEDECOMAPPING字典中,相对应的装饰图片将绘制在当前方块的顶部。

563.elif(x,y)in gameStateObj['stars']:

564.if(x,y)in goals:

565.#星标方块和星星在同一方块上,首先绘制星标方块

566.mapSurf.blit(IMAGESDICT['covered goal'],spaceRect)

567.#T绘制星星

568.mapSurf.blit(IMAGESDICT['star'],spaceRect)

如果在地图上的某个XY坐标上应该有个星星,那么在568行上,这个星星就会在这个坐标上绘制。在完成绘制之前,代码将首先检查是否有星标方块在同一位置,如果有那么先绘制星标方块。

569.elif(x,y)in goals:

570.#绘制星标方块

571.mapSurf.blit(IMAGESDICT['uncovered goal'],spaceRect)

如果地图上这个XY坐标有个星标方块,且没有被玩家或者星星覆盖,那么就将星标方块绘制在顶部。

573.#最后绘制玩家角色

574.if(x,y)==gameStateObj['player']:

575.#currentimage是独特的玩家形象

576.#

577.#

578.mapSurf.blit(PLAYERIMAGES[currentImage],spaceRect)

579.

580.return mapSurf

最后,drawMap()函数将检查玩家是否在这个XY坐标上,如果是那么玩家的图片形象就在方块上绘制。而始于549和550行的580行是在嵌套循环之外,所以当表层对象返回时,整个地图将绘制完毕。

检查关卡是否完成

583.def isLevelFinished(levelObj,gameStateObj):

584."""反馈True如果所有星标方块被星星覆盖"""

585.for goal in levelObj['goals']:

586.if goal not in gameStateObj['stars']:

587.#找到没有被星星覆盖的星标方块

588.return False

589.return True

isLevelFinished()函数建在所有星标方块被星星覆盖时反馈True。一些关卡将有超过星标方块的星星,所以检查星标方块是否被覆盖比检查星星是否比星标方块多更重要。

585行的for循环检查了所有在levelObj[‘GOALS’]里的星标方块坐标,和gameStateObj[‘stars’]里星星的坐标。当代码第一次找到一个没有星星覆盖的星标方块,函数将反馈False。如果每个都被星星覆盖,那么isLevelFinished()反馈True。

592.def terminate():

593.pygame.quit()

594.sys.exit()

terminate函数作用一如既往

597.if__name__=='__main__':

598.main()

在定义了所有函数后,602行将调用main()函数并开始游戏。

恭喜你!完成游戏!

推星星的游戏相对之前又是一个进阶

恭喜你又向游戏大师迈进了一步!

**注:文中代码的行数如中断,则默认该行为空

相关主题
文本预览
相关文档 最新文档