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 游戏,更能帮你快速搭建游戏框架。如果你玩得不过瘾,赶紧动手加入新功能,创造属于你的独特游戏世界!

相关推荐
Otaku love travel1 小时前
实施运维文档
运维·windows·python
测试老哥1 小时前
软件测试之单元测试
自动化测试·软件测试·python·测试工具·职场和发展·单元测试·测试用例
presenttttt2 小时前
用Python和OpenCV从零搭建一个完整的双目视觉系统(六 最终篇)
开发语言·python·opencv·计算机视觉
测试19983 小时前
软件测试之压力测试总结
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·压力测试
李昊哲小课4 小时前
销售数据可视化分析项目
python·信息可视化·数据分析·matplotlib·数据可视化·seaborn
烛阴4 小时前
带参数的Python装饰器原来这么简单,5分钟彻底掌握!
前端·python
全干engineer4 小时前
Flask 入门教程:用 Python 快速搭建你的第一个 Web 应用
后端·python·flask·web
nightunderblackcat4 小时前
新手向:Python网络编程,搭建简易HTTP服务器
网络·python·http
李昊哲小课4 小时前
pandas销售数据分析
人工智能·python·数据挖掘·数据分析·pandas
C嘎嘎嵌入式开发5 小时前
python之set详谈
开发语言·python