Python 使用Pygame库实现复杂逃跑吧少年游戏:游戏初始化、玩家和敌人的动画效果、碰撞检测和游戏结束界面等

介绍

本项目是使用 Python 编程语言和 Pygame 库实现的逃跑吧少年游戏。该游戏有两个角色:玩家和敌人。玩家需要躲避敌人并尽可能长时间地生存下去。本项目将会分为以下几个模块:

  1. 游戏初始化
  2. 玩家和敌人的动画效果
  3. 碰撞检测
  4. 游戏主循环
  5. 结束界面

环境设置

在开始编写代码之前,我们需要安装 Python 和 Pygame 库。请按照以下步骤进行设置:

  1. 安装 Python 3
  2. 打开控制台,输入以下命令以安装 Pygame 库:
pip install pygame

项目分布

本项目将会分为以下几个文件:

  • main.py:游戏主程序
  • player.py:玩家类
  • enemy.py:敌人类

代码实现

1. 游戏初始化

import pygame
from player import Player
from enemy import Enemy

pygame.init()

WIDTH = 800
HEIGHT = 600
FPS = 60

screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("逃跑吧少年")

clock = pygame.time.Clock()

在这段代码中,我们首先导入必要的模块。然后,我们初始化 Pygame 并设置游戏窗口的宽度、高度和帧率。接着,我们创建一个名为 screen 的游戏窗口,并设置窗口标题为“逃跑吧少年”。最后,我们创建一个名为 clock 的 Pygame 时钟对象。

2. 玩家和敌人的动画效果

player = Player(WIDTH / 2, HEIGHT / 2)
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()

all_sprites.add(player)

for i in range(8):
    enemy = Enemy()
    all_sprites.add(enemy)
    enemies.add(enemy)

在这段代码中,我们首先创建了一个名为 player 的 Player 对象,并将其添加到 all_sprites 组中。然后,我们创建了 8 个 Enemy 对象,并将它们添加到 all_spritesenemies 组中。

running = True
while running:
    clock.tick(FPS)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    all_sprites.update()

    hits = pygame.sprite.spritecollide(player, enemies, False)
    if hits:
        running = False

    screen.fill((0, 0, 0))
    all_sprites.draw(screen)

    pygame.display.flip()

在这段代码中,我们首先设置一个名为 running 的变量。然后,我们开始循环,直到 running 变量为 False。在每次循环中,我们首先使用 clock.tick(FPS) 来控制游戏帧率。然后,我们处理 Pygame 中的所有事件,如果用户单击关闭按钮,则将 running 变量设置为 False。

接着,我们更新 all_sprites 组中的所有对象。然后,我们使用 pygame.sprite.spritecollide() 函数来检测玩家是否与任何敌人相撞。如果玩家与敌人相撞,则将 running 变量设置为 False。

然后,我们清空屏幕并将 all_sprites 组中的所有对象绘制到屏幕上。最后,我们调用 pygame.display.flip() 来更新屏幕。

5. 结束界面

font_name = pygame.font.match_font('arial')
def draw_text(surf, text, size, x, y):
    font = pygame.font.Font(font_name, size)
    text_surface = font.render(text, True, (255, 255, 255))
    text_rect = text_surface.get_rect()
    text_rect.midtop = (x, y)
    surf.blit(text_surface, text_rect)

while True:
    screen.fill((0, 0, 0))
    draw_text(screen, "游戏结束", 64, WIDTH / 2, HEIGHT / 4)
    draw_text(screen, "得分:{}".format(player.score), 28, WIDTH / 2, HEIGHT / 2)
    draw_text(screen, "按 Q 退出", 22, WIDTH / 2, HEIGHT * 3 / 4)
    pygame.display.flip()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
                pygame.quit()
                sys.exit()

在这段代码中,我们首先定义一个名为 draw_text() 的函数,用于在屏幕上绘制文本。然后,我们开始循环,直到用户单击关闭按钮或按下 Q 键。

在每次循环中,我们首先清空屏幕并绘制“游戏结束”、“得分”和“按 Q 退出”等文本。然后,我们调用 pygame.display.flip() 来更新屏幕。

接着,我们处理 Pygame 中的所有事件。如果用户单击关闭按钮,则退出游戏。如果用户按下 Q 键,则退出游戏。

全部代码

main.py

import pygame
from player import Player
from enemy import Enemy

pygame.init()

WIDTH = 800
HEIGHT = 600
FPS = 60

screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("逃跑吧少年")

clock = pygame.time.Clock()

player = Player(WIDTH / 2, HEIGHT / 2)
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()

all_sprites.add(player)

for i in range(8):
    enemy = Enemy()
    all_sprites.add(enemy)
    enemies.add(enemy)

running = True
while running:
    clock.tick(FPS)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    all_sprites.update()

    hits = pygame.sprite.spritecollide(player, enemies, False)
    if hits:
        running = False

    screen.fill((0, 0, 0))
    all_sprites.draw(screen)

    pygame.display.flip()

font_name = pygame.font.match_font('arial')
def draw_text(surf, text, size, x, y):
    font = pygame.font.Font(font_name, size)
    text_surface = font.render(text, True, (255, 255, 255))
    text_rect = text_surface.get_rect()
    text_rect.midtop = (x, y)
    surf.blit(text_surface, text_rect)

while True:
    screen.fill((0, 0, 0))
    draw_text(screen, "游戏结束", 64, WIDTH / 2, HEIGHT / 4)
    draw_text(screen, "得分:{}".format(player.score), 28, WIDTH / 2, HEIGHT / 2)
    draw_text(screen, "按 Q 退出", 22, WIDTH / 2, HEIGHT * 3 / 4)
    pygame.display.flip()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_q:
                pygame.quit()
                sys.exit()

player.py

import pygame

PLAYER_SPEED = 5

class Player(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((50, 50))
        self.image.fill((255, 255, 0))
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
        self.score = 0

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT]:
            self.rect.x -= PLAYER_SPEED
        if keys[pygame.K_RIGHT]:
            self.rect.x += PLAYER_SPEED
        if keys[pygame.K_UP]:
            self.rect.y -= PLAYER_SPEED
        if keys[pygame.K_DOWN]:
            self.rect.y += PLAYER_SPEED

        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.right > 800:
            self.rect.right = 800
        if self.rect.top < 0:
            self.rect.top = 0
        if self.rect.bottom > 600:
            self.rect.bottom = 600

        self.score += 1

enemy.py

import pygame
import random

ENEMY_SPEED = 3

class Enemy(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill((255, 0, 0))
        self.rect = self.image.get_rect()
        self.rect.x = random.randrange(0, 800 - self.rect.width)
        self.rect.y = random.randrange(-100, -40)
        self.speedy = random.randrange(1, ENEMY_SPEED)

    def update(self):
        self.rect.y += self.speedy
        if self.rect.top > 600 + 10:
            self.rect.x = random.randrange(0, 800 - self.rect.width)
            self.rect.y = random.randrange(-100, -40)
            self.speedy = random.randrange(1, ENEMY_SPEED)

总结

本项目使用 Python 编程语言和 Pygame 库实现了一个简单但功能强大的逃跑吧少年游戏。我们分别介绍了游戏初始化、玩家和敌人的动画效果、碰撞检测和游戏结束界面等模块的实现方法。

扩展复杂的功能

  1. 动态难度调整:可以根据玩家的表现和游戏时间来调整敌人的速度、数量或行为模式,增加游戏的挑战性。

  2. 收集物品:可以在游戏中添加一些收集物品,例如宝石或道具,玩家可以通过接触它们来增加得分或获得特殊能力。

  3. 关卡系统:可以设计多个关卡,每个关卡具有不同的地图布局、敌人设置和目标,玩家需要逐个完成关卡才能进入下一关。

  4. 能力升级:可以为玩家添加一个能力升级系统,通过击败敌人或收集物品来获取经验值,然后用于提升玩家的属性或解锁新的技能。

  5. 多人模式:可以实现多人对战模式,允许多个玩家同时参与游戏,他们可以相互竞争或合作。

通过专栏《专栏Python实现复杂小游戏源码教程》(点击可跳转)进一步了解扩展游戏的功能

  • 22
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序熊.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值