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

相关推荐
箬敏伊儿8 分钟前
打包好的jar包,如何部署在服务器?——详细教程
java·服务器·python·jar
学步_技术12 分钟前
Python编码系列—Python建造者模式:构建复杂对象的优雅之道
开发语言·python·建造者模式
项目笔记与工具库17 分钟前
Java并发工具类详解:CountDownLatch与CyclicBarrier
java·开发语言·python
亿牛云爬虫专家1 小时前
如何通过subprocess在数据采集中执行外部命令 —以微博为例
爬虫·python·数据采集·多线程·代理ip·subprocess·微博
敲代码不忘补水1 小时前
Python Pickle 与 JSON 序列化详解:存储、反序列化与对比
开发语言·python·json
西农小陈3 小时前
python-字符排列问题
数据结构·python·算法
测试19983 小时前
使用Selenium进行网页自动化
自动化测试·软件测试·python·selenium·测试工具·自动化·测试用例
小黄酥3 小时前
Python学习笔记--模块
笔记·python·学习
UvwxyZ6663 小时前
python日志记录与命令行交互
开发语言·python
TechQuester3 小时前
OpenAI 刚刚推出 o1 大模型!!突破LLM极限
人工智能·python·gpt·算法·chatgpt