Pygame(三)游戏编程,第三弹——完整小游戏上线了

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/suoyue_py/article/details/99286876

话不多说先上图:
在这里插入图片描述
游戏操作与规则:
运行程序–>出现游戏预告页面–>按任意键开始游戏
键盘W/A/S/D键和方向键均为控制角色的移动键;
+/-号键为角色大小的缩放键,空格键还原原始大小;
按住鼠标为加速操作,放开鼠标为恢复原速;
Esc键退出程序
通过移动角色来吃"汤圆"获得分数,“汤圆"随机产生,一个"汤圆"为50分,10000分则通关;程序不时会有"病毒"从上如下来产生威胁,碰到"病毒"游戏结束,“病毒只会在屏幕的2/3的位置产生和消失,即屏幕底部的1/3部分为安全区域”,游戏通关除了分数达到10000分外,还有个最短时间显示评比;即:不仅要确保"不被’病毒’感染”,还要在最短时间内达到10000分。
游戏结束界面–>按任意键重新开始游戏
在这里插入图片描述
该游戏是基于前两篇来完成的,若有不清楚之处请前往查看
pygame(一)首发
pygame(二)承上启下
pygame(三)此小系列游戏完结,下面是核心代码块的讲解

1.音效

没有音效的游戏是枯燥无味的,在此为游戏添加附有灵魂的音效

# 创建背景音乐
pygame.mixer.music.load('background.wav')     
pygame.mixer.music.play(-1, 0.0)          
#创建碰撞时响应的音乐
pickUpSound = pygame.mixer.Sound('pickup.wav')
musicPlaying = True
#创建游戏结束时响应的音乐
gameOverSound = pygame.mixer.Sound('gameover.wav')
#创建游戏通关时响应的音乐
gameWinSound = pygame.mixer.Sound('gamewin.wav')    

pygame.mixer.music 用于控制流式音频的pygame模块

  • .load()方法加载音乐
  • .play()方法播放音乐,参数1:控制播放重复的次数,-1为无限循环;参数2:控制歌曲开始播放的音乐中的位置,若无法设置起始位置,则传递一个startpos会引发
  • .stop()方法停止播放音乐
2.字体
drawfont = pygame.font.SysFont("arila",48)     #定义开始界面字体
font = pygame.font.SysFont(None,28)     #定义显示字体

pygame.font 用于加载和渲染字体的pygame模块
.SysFont 从系统字体创建一个Font对象,包括字体和字体大小两个参数,若不指定字体(None),则会自动匹配系统默认字体
在python的Shell界面输入可查询系统所适用的所有字体:

import pygame
pygame.font.get_fonts()

获得所有可用的字体小号
在这里插入图片描述

3.时间

python对于时间的操作有time和datetime两个包,time包用于获取时间戳或者具体的某个参数;datetime用于用于显示时间或时间间隔,此处使用datetime来记录游戏所用的时间。
头部导入datetime包,游戏开始处设置begin_time记录游戏开始时间,游戏结束处设置end_time记录游戏结束时间,dur_time记录游戏过程所用时间。

import datetime
begin_time = datetime.datetime.now()    #游戏开始时间
end_time = datetime.datetime.now()       #结束时间
dur_time = end_time - begin_time    #所用时间
4."汤圆"食物来了
#"汤圆"食物设定初始化
foodImage = pygame.image.load("food.png")
foods = []
foodCounter = 0
NEWFOOD = 40

头部导入random包,调用random.randint()方法产生随机数

#食物的随机生成
foodCounter += 1
if foodCounter >= NEWFOOD:
    # 添加新的食物
    foodCounter = 0
    foods.append(pygame.Rect(random.randint(0, WIDTH - 20), random.randint(0, HEIGHT - 20), 20, 20))
#碰撞检测
for food in foods[:]:
    if position.colliderect(food):
        foods.remove(food)
        score += 50       #初始化得分
        if musicPlaying:
            pickUpSound.play()
if score > 10000:           #得分大于10000分且未中病毒为通关
    end_time = datetime.datetime.now()
    min_Time = end_time - begin_time
    two_time += 1
    if two_time>1:
        if time < min_Time:
            min_Time = time
    gameWinSound.play()
    break
# 绘制食物
for food in foods:
    screen.blit(foodImage, food)

碰撞检测:pygame.Rect.colliderect()
测试两个矩形是否重叠
colliderect(Rect) - > bool
如果任一矩形的任何部分重叠(顶部+底部或左侧+右侧边缘除外),则返回true。

5."病毒"感染来了
#病毒设定
baddieImage = pygame.image.load('baddie.png')
baddies = []
baddieAddCounter = 0
over = 0    #设置中病毒
baddieAddCounter += 1       #增加新的敌人
if baddieAddCounter == 200:  #控制增加的病毒数量
    baddieAddCounter = 0
    baddieSize = random.randint(10,40)      #随机生成病毒的大小范围
    newBaddie = {'rect':pygame.Rect(random.randint(0,WIDTH - baddieSize),\
                                    0 - baddieSize,baddieSize,baddieSize),\
                 'speed':random.randint(1,3),\
                 'surface':pygame.transform.scale(baddieImage,(baddieSize,baddieSize)),\
                 }
    baddies.append(newBaddie)
for b in baddies:
    b['rect'].move_ip(0,b['speed'])                
#删除病毒
for b in baddies[:]:
    if b['rect'].top > (HEIGHT/1.5):
        baddies.remove(b)
#碰撞检测
for b in baddies:
    if position.colliderect(b['rect']):
        baddies.remove(b)
        over = 1
if over == 1:
    gameOverSound.play()
    break
#绘制病毒
for b in baddies:
    screen.blit(b['surface'],b['rect'])
6.登陆游戏前的预告界面

到此一个差不多完整的小游戏基本完成,对此,再加一个登陆游戏前的界面,以示预告,效果图:
在这里插入图片描述

TEXTCOLOR = (0,0,0)     #文本颜色
BG = (255,255,255)      #设置开始页面背景颜色
drawfont = pygame.font.SysFont("arila",48)     #定义开始界面字体
font = pygame.font.SysFont(None,28)     #定义显示字体

#定义terminate()函数:终止程序
def terminate():
    pygame.quit()
    exit()
#定义waitForPlayerToPressKey()函数:暂停程序
def waitForPlayerToPressKey():
    while True:
        for event in pygame.event.get():
            if event.type == QUIT:
                terminate()
            if event.type == KEYDOWN:
                if event.key == K_ESCAPE:
                    terminate()
                return     
#定义drawText()函数将文本绘制到窗口
def drawText(text,font,surface,x,y):
    textobj = font.render(text,1,TEXTCOLOR)
    textrect = textobj.get_rect()
    textrect.topleft = (x,y)
    surface.blit(textobj,textrect)
#显示开始界面
screen.fill(BG)     #开始界面背景
drawText('GHOST',drawfont,screen,(WIDTH / 3)+40,(HEIGHT / 3))       #开始界面显示文本
drawText('Press a key to start...',drawfont,screen,(WIDTH / 3) - 50,(HEIGHT / 3) + 50)
pygame.display.update()
waitForPlayerToPressKey()

游戏显示得分和所用最快时间:

drawText('Score:%s' %(score),font,screen,10,5)
drawText('Minimum time:%s' %(min_Time),font,screen,10,25)        #通关的最少使用时间
7.游戏结束界面

效果图:
在这里插入图片描述
前面相关函数已定义好,此处直接调用即可

drawText('GAME OVER',drawfont,screen,(WIDTH / 3),(HEIGHT / 3))
drawText('User time:%s' %(dur_time),drawfont,screen,(WIDTH / 3)-80,(HEIGHT / 3)+50)
drawText('Press a key to play again.',drawfont,screen,(WIDTH / 3)-80,(HEIGHT / 3)+100)
8.总结

到此pygame小系列结束,回过头来复习一下都涉及到了那些内容:
pygame(一)首发 :
pygame的surface对象,QUIT事件,blit方法,set_mode()方法,convert()方法,rect()方法以及flip()和update()刷新操作
pygame(二)承上启下
鼠标/键盘事件,transfore方法
pygame(三)完结:音效、字体、时间、碰撞检测

自学:pygame官网文档

适时更新请关注微信公众“百里锁钥”,公众号后台回复“pygame第三弹”获取程序源码、图片和打包后的可执行文件

猜你喜欢

转载自blog.csdn.net/suoyue_py/article/details/99286876