Python 游戏开发:用 Pygame 打造你的“飞船大战UFO”!

想象一下,一个安静的夜晚,你正在电脑前敲打键盘,忽然脑中灵光一现:"我要开发一个游戏!" 不用3D建模?不用复杂算法?对,今天我来教你用 Pygame 轻松实现一个"飞船大战 UFO"的小游戏!说到做到,快来看看这段代码!

飞船、UFO和导弹,三者为何?

在这个小游戏中,你将扮演一位英勇的飞船指挥官,驾驶飞船左右腾挪,上下翻飞,目标很简单:打下那些可恶的 UFO。顺便说一句,千万别让飞船撞上 UFO,游戏可就要 Game Over 了。

代码导览

首先,咱们得让 Pygame 打响开局的第一炮。

复制代码
import pygame
import random
import sys

pygame.init()

像大厨准备食材一样,Pygame 的初始化就相当于准备锅碗瓢盆,做游戏当然少不了这一步。

进入游戏世界

复制代码
SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

这是我们的战场!800x600像素的游戏窗口------一块任由飞船和UFO"斗智斗勇"的画布。

接着,我们要往战场上添加"演员"------飞船、UFO和导弹。

复制代码
spaceship = pygame.image.load('images/spaceship.png')
ufo = pygame.image.load('images/ufo.png')
missiles = [pygame.image.load('images/missile.png')]

这些都是图片文件,飞船、UFO、导弹一应俱全。代码没放错地方吧?请确认你的 images 目录下有这些图片,否则游戏可要"罢工"了。

UFO的神秘现身

复制代码
def create_ufo():
    new_ufo_rect = ufo.get_rect(midtop = (random.randint(0, SCREEN_WIDTH), 0))
    return new_ufo_rect

随机生成的 UFO 就像从天而降的惊喜(或者惊吓),它们的出现全靠随机数决定。1%的概率听起来不大?别急,游戏节奏感要慢慢来,保你心跳加速!

UFO的舞蹈

复制代码
UFO_SPEED_PX_PER_SECOND = SCREEN_HEIGHT / 5
ufo_speed_per_frame = UFO_SPEED_PX_PER_SECOND / 60

为了让游戏更真实,这里设置了 UFO 下移的速度,每秒移动屏幕的五分之一,别小看这些 UFO,它们可是一直在移动的目标!

飞船 VS UFO

复制代码
def collision(rects1, rects2):
    for rect1 in rects1:
        if rect1.collidelist(rects2) > -1:
            rects1.remove(rect1)
            rects2.remove(rects2[rect1.collidelist(rects2)])
            return True
    return False

你可能会问:"碰撞检测怎么搞?" 别担心,这里已经用简单的 collidelist 函数解决了。只要导弹和 UFO 碰撞,游戏就会有让你满意的"爆炸"效果。

飞船操作

复制代码
keys = pygame.key.get_pressed()
if keys[pygame.K_UP] and spaceship_rect.top > 0:
    spaceship_rect.move_ip(0, -SPACESHIP_SPEED)
# 其他方向类似处理

操作飞船简单直接,用键盘的上下左右键来操控飞船,手感贼棒,快感拉满!

游戏结束

复制代码
over_text = font.render('Game Over', True, (255, 255, 255))
screen.blit(over_text, (SCREEN_WIDTH//2 - over_text.get_width()//2, SCREEN_HEIGHT//2 - over_text.get_height()//2))

当飞船不幸被UFO撞毁,游戏结束。屏幕中央会显示"Game Over",你可以在静静等待3秒后沉思------"我下次能得更高分吗?"

吸引读者的小彩蛋

提示一:飞船太慢?

你可以调大 SPACESHIP_SPEED,让飞船如离弦之箭般飞速移动,操作感也会提升!

提示二:UFO太简单?

把 UFO 的移动速度调快,让它们飞得更疯,你的飞船才更有挑战!

完整代码如下:

复制代码
import pygame
import random
import sys

# 初始化pygame
pygame.init()
import os
os.chdir(os.path.dirname(__file__))
# 设置游戏窗口的大小
SCREEN_WIDTH, SCREEN_HEIGHT = 800, 600
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))

# 加载游戏图像
spaceship = pygame.image.load('images/spaceship.png')
ufo = pygame.image.load('images/ufo.png')
missiles = [pygame.image.load('images/missile.png') ]

# 设置游戏对象
spaceship_rect = spaceship.get_rect(midbottom = (SCREEN_WIDTH//2, SCREEN_HEIGHT))
ufo_rects = []
missile_rects = []
score = 0

font = pygame.font.Font(None, 36) # 设置得分的字体

def create_ufo():
    '''生成一个新的UFO'''
    new_ufo_rect = ufo.get_rect(midtop = (random.randint(0, SCREEN_WIDTH), 0))
    return new_ufo_rect
# 速度设置,每秒下移的像素
UFO_SPEED_PX_PER_SECOND = SCREEN_HEIGHT / 5
# 每帧下移的像素,这里假设每秒60帧
ufo_speed_per_frame = UFO_SPEED_PX_PER_SECOND / 60

def move_ufos(rects):
    '''移动所有的UFO'''
    for rect in rects:
        rect.move_ip(0, ufo_speed_per_frame)
    return rects


def remove_ufo(rects):
    '''删除出界的UFO'''
    for rect in rects:
        if rect.bottom > SCREEN_HEIGHT:
            rects.remove(rect)
    return rects

def move_missiles(rects):
    '''移动所有的导弹'''
    for rect in rects:
        rect.move_ip(0, -5)
    return rects

def remove_missiles(rects):
    '''删除出界的导弹'''
    for rect in rects:
        if rect.top < 0:
            rects.remove(rect)
    return rects

def collision(rects1, rects2):
    '''检测碰撞'''
    for rect1 in rects1:
        if rect1.collidelist(rects2) > -1:
            rects1.remove(rect1)
            rects2.remove(rects2[rect1.collidelist(rects2)])
            return True
    return False

 
# 设置飞船移动速度
SPACESHIP_SPEED = 1
explode_sound = pygame.mixer.Sound('explode.mp3')
# 游戏主循环
while True:
    for event in pygame.event.get():
        # 如果退出游戏
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

        # 如果按下空格键,发射导弹
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_SPACE: 
                missile_rect = missiles[0].get_rect(midtop = spaceship_rect.midtop)
                missile_rects.append(missile_rect)

    keys = pygame.key.get_pressed()
    if keys[pygame.K_UP] and spaceship_rect.top > 0: # 上键,飞船向上
        spaceship_rect.move_ip(0, -SPACESHIP_SPEED)
    if keys[pygame.K_DOWN] and spaceship_rect.bottom < SCREEN_HEIGHT: # 下键,飞船向下
        spaceship_rect.move_ip(0, SPACESHIP_SPEED)
    if keys[pygame.K_LEFT] and spaceship_rect.left > 0: # 左键,飞船向左
        spaceship_rect.move_ip(-SPACESHIP_SPEED, 0)
    if keys[pygame.K_RIGHT] and spaceship_rect.right < SCREEN_WIDTH: # 右键,飞船向右
        spaceship_rect.move_ip(SPACESHIP_SPEED, 0)

    # UFO的生成
    if random.randint(1, 100) == 1: # 1%的概率生成新的UFO
        ufo_rects.append(create_ufo())

    # 移动和删除UFO
    ufo_rects = move_ufos(ufo_rects)
    ufo_rects = remove_ufo(ufo_rects)

    # 移动和删除导弹
    missile_rects = move_missiles(missile_rects)
    missile_rects = remove_missiles(missile_rects)

    # 碰撞检测
    if collision(missile_rects, ufo_rects): # 如果导弹击中UFO
        score += 1 # 分数加1
        explode_sound.play() # 播放音效

    if spaceship_rect.collidelist(ufo_rects) > -1: # 如果飞船与UFO碰撞
        break # 游戏结束
  
    # 清空屏幕
    screen.fill((0, 0, 0))

    # 绘制得分
    score_text = font.render('Score: {}'.format(score), True, (255, 255, 255))
    screen.blit(score_text, (10, 10))

    # 绘制飞船
    screen.blit(spaceship, spaceship_rect)

    # 绘制UFO
    for rect in ufo_rects:
        screen.blit(ufo, rect)

    # 绘制导弹
    for rect in missile_rects:
        screen.blit(missiles[0], rect)
   

    # 更新屏幕
    pygame.display.update()

# 游戏结束
over_text = font.render('Game Over', True, (255, 255, 255))
screen.blit(over_text, (SCREEN_WIDTH//2 - over_text.get_width()//2, SCREEN_HEIGHT//2 - over_text.get_height()//2))
pygame.display.update()

pygame.time.wait(3000)
pygame.quit()
sys.exit()

总结

通过这个小游戏,你是不是已经对 Pygame 的强大有了初步了解?其实 Pygame 不仅能实现 2D 游戏,更能帮你快速搭建游戏框架。如果你玩得不过瘾,赶紧动手加入新功能,创造属于你的独特游戏世界!

相关推荐
酷飞飞6 小时前
Python网络与多任务编程:TCP/UDP实战指南
网络·python·tcp/ip
数字化顾问7 小时前
Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测
python
学生信的大叔8 小时前
【Python自动化】Ubuntu24.04配置Selenium并测试
python·selenium·自动化
诗句藏于尽头9 小时前
Django模型与数据库表映射的两种方式
数据库·python·django
智数研析社9 小时前
9120 部 TMDb 高分电影数据集 | 7 列全维度指标 (评分 / 热度 / 剧情)+API 权威源 | 电影趋势分析 / 推荐系统 / NLP 建模用
大数据·人工智能·python·深度学习·数据分析·数据集·数据清洗
扯淡的闲人9 小时前
多语言编码Agent解决方案(5)-IntelliJ插件实现
开发语言·python
moxiaoran575310 小时前
Flask学习笔记(一)
后端·python·flask
yzx99101310 小时前
接口协议全解析:从HTTP到gRPC,如何选择适合你的通信方案?
网络·人工智能·网络协议·flask·pygame
秋氘渔10 小时前
迭代器和生成器的区别与联系
python·迭代器·生成器·可迭代对象
Gu_shiwww10 小时前
数据结构8——双向链表
c语言·数据结构·python·链表·小白初步