如何编写Memory Puzzle游戏
(。・∀・)ノ゙嗨,好久不见我又来更新啦?,上一次我们编写了pie游戏,大致了解了关于pygame开发游戏的一点点甜头,今天我们来回顾一下童年时的游戏,叫做“记忆力翻牌”
如何玩Memory Puzzle游戏
在Memory puzzle游戏中,白色的方块盖住了几个图标,每种图标都有两个。玩家可以在两个方块上点击,看看方块背后的图标是什么。如果图标是一致的,那么,这些方块将保持打开的状态。当游戏板上的所有的方块都打开时,玩家就赢了。为了给玩家一个提示,在游戏每次开始的时候,所有的方块都快速地打开一次,话不多说,直接上图,看到最后有完整代码哟(^U^)ノ~YO。
声明和导入
在程序的顶部,有一些注释,说明了该游戏是什么,谁开发了他,以及用户可以在哪里找到更多的信息,该程序用到了其他模块中的很多函数,因此,他在开始导入了这些模块
import random,pygame,sys
from pygame.locals import*
让源代码更好看一些
还记得吧,在pygame中,颜色是使用从0~255的3个整数的一个元组来表示的。这3个整数分别表示颜色之中的红色、绿色和蓝色的量,因此,这些元素也称为RCB值。在Python中,缩进是需要准确的。
# R G B
GRAY =(100, 100, 100 )
NAVYBLUE=(60, 60, 100 )
WHITE =(255, 255, 255 )
RED =(255, 0, 0 )
GREEN =(0, 255, 0 )
BLUE =(0, 0, 255 )
YELLOW =(255, 255, 0 )
ORANGE =(255, 128, 0 )
PURPLE =(255, 0, 255 )
CYAN =(0, 255, 255 )
确保有足够的图标
为了让游戏程序能够创建每一种可能的颜色和形状的组合而成的图标,我们需要有一个元组来保存所有的这些值,我们必须拥有一个总共有70个方块空间的游戏板(35×2或7×5×2)
ALLCOLORS=(RED,GREEN,BLUE,YELLOW,ORANGE,PURPLE,CYAN)
ALLSHAPES=(DONUT,SQUARE,DIAMOND,LINES,OVAL)
assert len(ALLCOLORS)*len(ALLSHAPES)*2>=BOARDWIDTH*BOARDHEIGHT,"Board is too big for the number of shapes/colors defined."
数据结构和2D列表
getRandomizedBoard()函数返回了一个数据结构,表示游戏板的状态。generateRevealedBoxesData()函数返回了一个数据结构,分别表示哪个方块被盖住了。这些函数的返回值是2D列表,或者说是列表的列表。
mainBoard=getRandomizedBoard()
revealedBoxes=generateRevealedBoxesData(False)
“开始游戏”动画
使用值None设置了一个名为firstSelection的变量,当玩家点击游戏板上的一个图标的时候,程序需要纪律这是在游戏板上点击的成对的图标中的第一个还是第二个。
firstSelection=None# stores the(x,y) of the first box clicked.
DISPLAYSURF.fill(BGCOLOR)
startGameAnimation(mainBoard)
处理第一次点击的方块
在执行进入到游戏循环之前,firstSelection变量设置为None。我们的程序会将此解释为没有方块被点击。if语句检查两个图标的形状或颜色是否一样,如果不一致,那么,我们将会调用pygame.time.wait(1000),暂停游戏1000毫秒,从而使得玩家能够注意到这两个图标的不一样,然后,为两个方块播放”盖住“的动画。
if firstSelection == None: # the current box was the first box clicked
firstSelection = (boxx,boxy)
else: # the current box was the secend box clicked
# Check if there is a match between the two icons.
icon1shape, icon1color=getShapeAndColor(mainBoard,firstSelection[0],firstSelection[1])
icon2shape, icon2color=getShapeAndColor(mainBoard,boxx,boxy)
if icon1shape != icon2shape or icon1color != icon2color:
# Icons don't match.Re-cover up both selections.
pygame.time.wait(1000) # 1000 milliseconds = 1 sec
coverBoxesAnimation(mainBoard,[(firstSelection[0],firstSelection[1]),(boxx,boxy)])
revealedBoxes[firstSelection[0]][firstSelection[1]]=False
revealedBoxes[boxx][boxy]=False
揭开和盖住成组的方块
首先,我们绘制了游戏板。由于coveredBoxes中的每一个值都设置为False,这次对drawBoard()调用最终只是绘制了盖住的白色方块。
drawBoard(board, coveredBoxes)
for boxGroup in boxGroups:
revealBoxesAnimation(board, boxGroup)
coverBoxesAnimation(board, boxGroup)
“游戏获胜”动画
当玩家通过匹配游戏板上的每一对图标而揭开了所有的方块的时候,我们想要通过闪烁的背景颜色来祝贺他们。这个for循环将会用变量color1中的颜色来绘制背景颜色,然后在其上绘制游戏板。
def gameWonAnimation(board):
# flash the backgroup color when the player has won
coveredBoxes = generateRevealedBoxesData(True)
color1 = LIGHTBGCOLOR
color2 = BGCOLOR
for i in range(13):
color1, color2 = color2, color1 # swap colors
DISPLAYSURF.fill(color1)
drawBoard(board, coveredBoxes