Python实战案例:使用Pygame开发游戏翻牌子(上)

  • Post author:
  • Post category:python


Python实战案例:使用Pygame开发游戏翻牌子(上)

一、翻牌子游戏介绍

翻牌子的原意是古代皇帝在晚上就寝时从三千佳丽中选择的某个女子,这里将它改版成对对碰。如果翻开第一张牌子后面的女子,再翻开第二张牌子后面的女子,如果两张牌子后面的女子是同一个女子,两张牌子就消失,如果两张牌子后面不是同一个女子,前一张牌子翻过去,后一张牌子仍然保持着显示被选女子的状态。

游戏过程如下图所示最开始游戏的初始状态。

紧接着如下所示把图中的某一个牌子翻开。

接下来继续翻开如图所示中的第二张某一个牌子,两个不同的图像,就会保持第二张牌子的图像。

接下来继续翻开如图所示中的第二张某一个牌子,两个是相同的图像,就会两张牌子同时消失。

python需要的第三方模块安装

下面具体来说其开发过程。

这个游戏需要使用Python中的pygame模块,所以需要安装pygame模块,可以使用如下命令进行安装。

pip3 install pygame

安装完pygame模块后就可以使用pygame模块进行开发了。

三、游戏背景显示

游戏首先需要调用pygame模块显示游戏窗口,并在游戏窗口中显示出游戏的背景。

使用pygame开发的基本思路是先导入pygame模块,然后调用pygame中的init()方法对游戏进行初始化,这是使用pygame开发游戏必须的步骤,只有执行了pygame模块中的初始化方法后才能更好地使用pygame中的各种方法为我们服务。可以这样理解,电脑在使用pygame时有一个强迫症,需要检查一遍这个工具包是否完整,能否正常提供帮助。而这个检查的动作,就是pygame.init()。接着就可以使用pygame.set_mode()设置游戏窗口的大小,也就是执行这个游戏程序后windows桌面显示的窗口程序的大小。显示完窗口后,就需要把图像做为背景显示到这个窗口里面去,需要使用blit()方法在窗口中放置一个图像,blit方法有两个参数,第一个参数是放置的图像数据,第二个参数是图像的位置,这个参数使用横纵坐标值(x,y)形成的元组类型数据。需要放置的那个图像数据可以使用pygame.image.load()方法去加载这个图像即可完成。

其完成方法的具体流程如图所示。

其对应的代码如下。

import pygame
pygame.init()
screen=pygame.display.set_mode((1450,736))
bk=pygame.image.load("images/hougong.jpg")
screen.blit(bk,(0,0))

运行这段代码,会出现如下内容。

从图像中看,没有看到任何图像内容,而且这个窗口还会一闪而过,这是由于pygame的窗口显示后就程序结束了,这么短的时间是看不到图像的,需要使用while True死循环一直保持这种窗口的更新,也就是在while True方法中调用pygame.display.update()方法使窗口一直更新,而这个图像会一直在窗口中显示出来。也就是将代码进行如下改写。

import pygame
pygame.init()
screen=pygame.display.set_mode((1450,736))
bk=pygame.image.load("images/hougong.jpg")
screen.blit(bk,(0,0))
while True:
    pygame.display.update()

上述代码运行成功后,显示如下结果。

从运行结果可以看出,背景图像已经被显示出来,但是要注意,这样的窗口在移动或关闭时,都会发生“窗口未响应”或“python程序错误”的内容。如果要调整这样的错误,就需要在while True循环体中加入事件判断的函数,判断是否有用户点击了关闭按钮,如果监控到用户点击到关闭按钮,就正常执行pygame的退出功能。将代码程序再做修改。代码如下。

import pygame
pygame.init()
screen=pygame.display.set_mode((1450,736))
bk=pygame.image.load("images/hougong.jpg")
screen.blit(bk,(0,0))
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.exit()
    pygame.display.update()

这段代码中pygame.event.get()实现了pygame模块中各种事件的捕获,这里捕获的事件可能有鼠标事件,可能有键盘事件等等,因此使用for循环来遍历get到的所有事件,后面进行翻牌子的点击时候还是需要鼠标事件的参与的,这里捕捉了事件中的一种类型:退出事件,event.type就是能够体现捕捉到pygame事件的各种类型,pygame.QUIT就是退出事件的信号。event.type==pygame.QUIT就是把捕捉的pygame事件进行对比,如果是pygame.QUIT退出事件,就执行pygame.exit()事件,退出pygame的功能,关闭正在显示的pygame窗口。

这样运行的结果如图所示。

从图像中看,就是打开了一个pygame 窗口,并始终显示一个背景图像。

用pygame开发游戏的最开始需要的步骤就可以概括成下图所示。

四、游戏界面布局的搭建

游戏窗口显示成功后,就可以在这个背景窗口中添加要翻的牌子了。这个游戏的界面也就是一个古色古香的背景图片窗口中显示各种佳丽的牌子背面。牌子背面的图片文件back.png。也就是在固定的坐标位置上显示背景图片文件,形成2行5列的平铺效果。x轴的坐标可以以200为分隔区间,偏移100个像素去显示一张牌,这样图像显示的x轴坐标可以使用式子x=i%5*200+100来表示。纵向只有2排,y轴可以使用5和250两个坐标点,用式子y+=250来表示。当显示牌子的数目超过5个的时候,就用下一行来继续显示牌子。可以用y轴对5这个数字取余,如果取余的结果为0时就可以在下一行显示,但y不能为0,如果y为0时需要显示第一行。把这个特例排除掉,这样y轴坐标的计算是需要一个if表达式来限定,表达式是i%5==0 and y!=0,用and连接的目的是and左右两边的条件都满足才正确。这里一共需要显示10幅图像,可以for循环迭代10次,利用前面对x,y坐标的分析公式,最终在对应的坐标位置显示背景图像即可。

这样代码修改如下。

import pygame
pygame.init()
screen=pygame.display.set_mode((1450,736))
bk=pygame.image.load("images/hougong.jpg")
screen.blit(bk,(0,0))
y=5
for i in range(10):
    if i%5==0 and y!=0:
        y+=250
    img1=pygame.image.load("images/back.png")
    x=i%5*200+100
    screen.blit(img1,(x,y))
while True:
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.exit()
    pygame.display.update()

运行程序后,翻牌子的游戏界面就搭建完毕,结果如图所示。

代码的github地址:

https://github.com/wawacode/turn_over_card



版权声明:本文为play_big_knife原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。