在《Pygame实现记忆拼图游戏5》中实现了绘制图案背面的功能,接下来实现绘制图案正面的功能,即绘制35个图案。
1 获取图案信息
在《Pygame实现记忆拼图游戏1》中提到,要绘制的35个图案是由不同颜色和形状组成的,因此,在绘制图案之前,要获取图案的颜色和形状。通过自定义函数getShapeAndColor()来实现该功能,代码如图1所示。
图1 getShapeAndColor()函数的代码
其中,getShapeAndColor()函数的第一个参数board表示《Pygame实现记忆拼图游戏3》中提到的getRandomizedBoard(),随机生成的70个图案,board中包含10个元素,每个元素又包含7个子元素,每个子元素包含了元素的颜色和形状信息;getShapeAndColor()函数的第二个和第三个参数分别表示图案的列数和行数;第73行代码根据图案的行数和列数得到该图案的颜色和形状,其中第一个元素表示形状,第二个元素表示颜色。通过调试代码,调用getShapeAndColor()函数得到第2行1列图案的形状和颜色,如图2所示。
图2 调试代码得到的结果
2 根据行列数、形状和颜色绘制图案
在根据行列数获取到图案的形状和颜色后,就可以根据行列数、形状和颜色绘制图案了。
2.1 根据行列数获取图案位置
在《Pygame实现记忆拼图游戏1》,游戏中用到形状有5种,颜色有7种,因此通过自定义函数drawIcon()分别绘制5种形状的图案,代码如图3所示。
图3 drawIcon()函数的代码
其中,drawIcon()的shape和color参数表示图案的形状和颜色,boxx和boxy表示图案所处的列数和行数;第75-76行代码定义了表示图案边长一半和四分之一长度的变量half和quarter;第78行代码调用《Pygame实现记忆拼图游戏4》中提到的leftTopCoordsOfBox()函数根据列数和行数得到图案左上角的坐标left和top,即图案的位置。
2.2 绘制圆环
如果图案的形状是圆环,则使用图4所示的代码进行绘制。
图4 绘制圆环的代码
圆环的图案如图5所示。
图5 圆环的图案
第79行代码判断图案的形状是否是圆环,从图5中可以看出,绘制圆环的过程就是绘制两个同心圆,半径比较大的同心圆绘制成红色(指定颜色),半径比较小的圆绘制为背景色,就可以达到圆环的效果。因此,第80-81行代码的作用就是通过pygame.draw.circle()函数绘制半径比较大的圆,该函数的DISPLAYSURF表示游戏代码中创建的游戏窗口;color表示圆的颜色;left+harf和top+half表示圆心的坐标,正好位于图案的中心位置;half-5表示圆的半径;第82-83行代码绘制半径比较小的圆,BGCOLOR表示背景色。
2.3 绘制正方形
如果图案的形状是正方形,则使用图6所示的代码进行绘制。
图6 绘制正方形的代码
正方形的图案如图7所示。
图7 正方形图案
从图7中可以看出,正方形的左上角坐标距离图案左上角坐标left和top大概quarter个单位,正方形的编程是图案边长的一半,因此,在图6中第86行将正方形左上角的坐标设置为left+quarter和top+quarter,将正方形的边长设置为BOXSIZE-half。
2.4 绘制菱形
如果图案的形状是菱形,则使用图8所示的代码进行绘制。
图8 绘制菱形的代码
菱形的图案如图9所示。
图9 菱形图案
图8中第87行代码判断图案形状是否是菱形,如果是,则第88行代码调用pygame.draw.polygon()函数绘制菱形,第89行表示菱形上方顶点的坐标;第90行表示菱形右端顶点的坐标;第91行表示菱形下方顶点的坐标;第92行表示菱形左侧顶点的坐标。可以通过图9来确定这四个顶点的坐标。