介绍
本项目是使用 Python 编程语言和 Pygame 库实现的逃跑吧少年游戏。该游戏有两个角色:玩家和敌人。玩家需要躲避敌人并尽可能长时间地生存下去。本项目将会分为以下几个模块:
- 游戏初始化
- 玩家和敌人的动画效果
- 碰撞检测
- 游戏主循环
- 结束界面
环境设置
在开始编写代码之前,我们需要安装 Python 和 Pygame 库。请按照以下步骤进行设置:
- 安装 Python 3
- 打开控制台,输入以下命令以安装 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_sprites
和 enemies
组中。
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 库实现了一个简单但功能强大的逃跑吧少年游戏。我们分别介绍了游戏初始化、玩家和敌人的动画效果、碰撞检测和游戏结束界面等模块的实现方法。
扩展复杂的功能
-
动态难度调整:可以根据玩家的表现和游戏时间来调整敌人的速度、数量或行为模式,增加游戏的挑战性。
-
收集物品:可以在游戏中添加一些收集物品,例如宝石或道具,玩家可以通过接触它们来增加得分或获得特殊能力。
-
关卡系统:可以设计多个关卡,每个关卡具有不同的地图布局、敌人设置和目标,玩家需要逐个完成关卡才能进入下一关。
-
能力升级:可以为玩家添加一个能力升级系统,通过击败敌人或收集物品来获取经验值,然后用于提升玩家的属性或解锁新的技能。
-
多人模式:可以实现多人对战模式,允许多个玩家同时参与游戏,他们可以相互竞争或合作。
通过专栏《专栏Python实现复杂小游戏源码教程》(点击可跳转)进一步了解扩展游戏的功能