Python pygame游戏开发综合实例

点击

上方蓝字

关注我们~

一、准备游戏资源

  • (1)下载透明背景的PNG图片

  • (2)准备一首背景音乐和一个音效文件,都使用MP3格式文件

  • (3)准备支持中文的字体

组织结构为:

二、开始做游戏

(1)导入必须的库

import pygame``import random``import time``from pygame.locals import *

(2)参数设置

APPLEEVENT =  pygame.USEREVENT        # 自定义苹果移动事件``PEACHEVENT =  pygame.USEREVENT + 1    # 自定义桃子移动事件``BANANAEVENT = pygame.USEREVENT + 2    # 自定义香蕉移动事件``SCORE = 0                       # 游戏得分``NUM_PEACH = 0                   # 漏掉的桃子数``NUM_APPLE = 0                   # 漏掉的苹果数``NUM_BANAN = 0                   # 漏掉的香蕉数``WINDOW_SIZE = [400, 600]        # 窗口大小``RED = (255, 0,  0)``GREEN = (0, 255, 0)` `MOKEY_SPEED = 10                # 猴子的速度``   ``pygame.init()``BG_PIC = pygame.image.load("./resource/picture/背景_1.png")     # 背景图片``FONT   = pygame.font.Font("./resource/Fonts/simhei.ttf", 15)   # 文本字体``SOUND  = pygame.mixer.Sound("./resource/music/音效1.mp3")       # 音效``ClOCK  = pygame.time.Clock()                                   # 创建时钟

(3)创建水果精灵

导入图片,并为精灵命名,同时为精灵设置初始属性。水果的运动就是一直向下,直到碰到窗口的下边缘。

class FruitSprite(pygame.sprite.Sprite):`    `"""创建苹果等水果的精灵类"""`    `def __init__(self, filename, name):`        `pygame.sprite.Sprite.__init__(self)`        `self.image = pygame.image.load(filename)    # 导入图片`        `self.rect = self.image.get_rect()           # 获取RECT`        `self.speed = random.randint(3, 10)          # 水果下落速度`        `self.rect.bottom = 0                        # 初始的底部`        `self.rect.x = random.randint(0, WINDOW_SIZE[0] - 60)  # 初始水果的x位置`        `self.name = name` `    def update(self):`        `self.rect.y += self.speed   # 往下落`        `# 下面判断遗漏水果的数量`        `if self.rect.y >= WINDOW_SIZE[1]:`            `if self.name == "苹果":`                `global NUM_APPLE`                `NUM_APPLE += 1`            `if self.name == "桃子":`                `global NUM_PEACH`                `NUM_PEACH += 1`            `if self.name == "香蕉":`                `global NUM_BANAN`                `NUM_BANAN += 1`            `# 到达边缘,那么杀死这个精灵`            `self.kill()

(4)猴子精灵类

游戏初始化时的猴子状态,猴子的动作靠连续监听键盘来控制运动。

class Monkey(pygame.sprite.Sprite):`    `"""猴子精灵"""`    `def __init__(self):`        `pygame.sprite.Sprite.__init__(self)`        `self.image = pygame.image.load('./resource/picture/猴子_1.png')`        `self.rect = self.image.get_rect()`        `self.rect.x = WINDOW_SIZE[0] // 2`        `self.rect.y = 520``   `    `def update(self, Key_pressed):`        `# 连续监听键盘`        `if Key_pressed[K_LEFT]:  # 左箭头`            `self.rect.x -= MOKEY_SPEED`            `self.rect.x = 0 if self.rect.x < 0 else self.rect.x`        `if Key_pressed[K_RIGHT]: # 右箭头`            `self.rect.x += MOKEY_SPEED`            `self.rect.x = WINDOW_SIZE[0]-50 if self.rect.x >= WINDOW_SIZE[0]-50 else self.rect.x

(5)定义几个功能函数

定义分数显示功能,返回渲染的字体文本和文本的Rect:

def show_text():`    `"""显示分数"""`    `score_text = f"""分数:{SCORE} 苹果:{NUM_APPLE} 桃子:{NUM_PEACH} 香蕉:{NUM_BANAN}"""`    `FONT.bold = True`    `render_text = FONT.render(score_text, True, RED)`    `textRect =render_text.get_rect()``    textRect.center = (180, 20)`    `return render_text, textRect

播放背景音乐,参数-1表示循环播放音乐:

def play_music():`    `pygame.mixer.music.load("./resource/music/香椿头.mp3")`    `pygame.mixer.music.play(-1)

定义处理事件的函数。mokey是猴子精灵实例,*args是若干不同的水果精灵:

def deal_event(mokey, *args):`      `for event in pygame.event.get():`          `if event.type == pygame.QUIT: # 退出`              `exit()`          `# 不同的水果事件监测`          `# 对于不同事件创建精灵并添加到对应的精灵组`          `if event.type == APPLEEVENT:`              `apple = FruitSprite('./resource/picture/苹果_1.png', "苹果")`              `args[0].add(apple)`          `if event.type == PEACHEVENT:`              `peach = FruitSprite('./resource/picture/桃子_1.png', "桃子")`              `args[1].add(peach)`          `if event.type == BANANAEVENT:`              `peach = FruitSprite('./resource/picture/香蕉_1.png', "香蕉")`              `args[2].add(peach)`      `# 监听键盘``      Key_pressed = pygame.key.get_pressed()`      `mokey.update(Key_pressed)

定义更新函数。将组内的所有精灵更新然后绘制到屏幕上:

def update_fruitsprites(screen, group):`    `group.update()`    `group.draw(screen)

碰撞检测函数。参数monkey是猴子,group是水果精灵组,sco是碰到不同的水果得到的分数:

def collide(monkey, group, sco):  ``    # 单一精灵与精灵组碰撞`    `crash_result = pygame.sprite.spritecollide(monkey, group, True)`    `for i in crash_result:`        `SOUND.play(0)    # 播放音效`        `global SCORE     # 修改全局变量`        `SCORE += sco

(6)主函数

def main():`    `# 初始化窗口`    `screen = pygame.display.set_mode(WINDOW_SIZE)`    `pygame.display.set_caption("猴子吃水果")`    `time.sleep(1)   # 暂停1秒开始游戏`    `# 开始播放背景音乐`    `play_music()`    `# 创建计时器,以触发不同的水果事件`    `pygame.time.set_timer(APPLEEVENT, 800)`    `pygame.time.set_timer(PEACHEVENT, 1000)`    `pygame.time.set_timer(BANANAEVENT, 2000)`    `# 创建精灵和精灵组`    `monkey = Monkey()    # 猴子`    `apple_group = pygame.sprite.Group() # 苹果组`    `peach_group = pygame.sprite.Group() # 桃子组`    `banna_group = pygame.sprite.Group() # 香蕉组`    `    while True:`        `# 绑定背景图片到屏幕`        `screen.blit(BG_PIC, screen.get_rect())`        `# 绑定猴子到屏幕`        `screen.blit(monkey.image, monkey.rect)`        `# 显示得分信息`        `screen.blit(*show_text())`        `# 处理事件`        `deal_event(monkey, apple_group, peach_group, banna_group)`        `# 将不同的精灵绘制屏幕`        `update_fruitsprites(screen, apple_group)`        `update_fruitsprites(screen, peach_group)`        `update_fruitsprites(screen, banna_group)`        `# 做碰撞检测`        `collide(monkey, apple_group, 1)`        `collide(monkey, peach_group, 2)`        `collide(monkey, banna_group, 3)`        `# 刷新整个屏幕`        `pygame.display.update()`        `# 设置帧率,一般60比较适合`        `ClOCK.tick(60)

(7)调用主函数

if __name__ == '__main__':`    `main()

点击下方安全链接前往获取

CSDN大礼包:《Python入门&进阶学习资源包》免费分享

👉Python实战案例👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

图片

👉Python书籍和视频合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

图片

👉Python副业创收路线👈

图片

这些资料都是非常不错的,朋友们如果有需要《Python学习路线&学习资料》,点击下方安全链接前往获取

CSDN大礼包:《Python入门&进阶学习资源包》免费分享

本文转自网络,如有侵权,请联系删除。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值