想象一下,一个安静的夜晚,你正在电脑前敲打键盘,忽然脑中灵光一现:"我要开发一个游戏!" 不用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 游戏,更能帮你快速搭建游戏框架。如果你玩得不过瘾,赶紧动手加入新功能,创造属于你的独特游戏世界!