摘要
本设计题目为飞机大战小游戏。玩家可以通过方向键和空格键来操作飞机,并对敌人的飞机来发射子弹进行攻击以获取相应的分数来赢取。
1.引言
本论文介绍飞机大战小游戏设计过程所使用方法和需解决问题。本设计题目是关于游戏方面,故使用pygame模块来进行实现。本论文将介绍设计过程所解决的各个问题及其实现原理。
2. 系统结构
飞机大战小游戏设计
图1 系统结构框架图
3. 实现代码
第一步加入pygame模块并初始化界面
import pygame
import random
import math

初始化界面设定游戏窗口大小和名称
pygame.init()
screen=pygame.display.set_mode((800,600))
pygame.display.set_caption(‘飞机大战’)
通过pygame.load载入背景图片
icon=pygame.image.load(‘plant.png’)
pygame.display.set_icon(icon)
bjImg =pygame.image.load(‘bj.png’)

通过pygame.muxer载入背景音乐
pygame.mixer.music.load(‘bj.mp3’)
pygame.mixer.music.play(-1)

当页面初始化完毕开始设计飞机,以pygame.load载入飞机图片,设计飞机初始坐标及移动速度。
plantImg=pygame.image.load(‘plant.png’)
plantX=400 #飞机x坐标
plantY=500 #飞机y坐标
plantStep=0

接下来设计飞机移动方法,只设计飞机能在x轴通过x轴坐标变化来移动飞机
def move_plant():
global plantX
plantX+=plantStep

最后设定飞机的出界问题,当飞机的x坐标大于窗口最大坐标及小于最小坐标时赋值其等于最大或最小坐标,即可防止飞机出界
if plantX>707:
plantX=707
if plantX<0:
plantX=0

完成飞机设计后是敌人ufo的设计,设计敌人ufo数量为8
#ufo
number_of_ufos=8

接下来创建ufo类,在开头载入random随机模块,接着载入ufo图片,设定ufo的x,y轴坐标及移动速度的随机范围
class Ufo():
def init(self):
self.img = pygame.image.load(‘ufo.png’)
self.x=random.randint(200,600)
self.y=random.randint(50,200)
self.step=random.randint(1,3)#ufo移动速度
设计当子弹击中后再次重新对ufo坐标进行随机
def reset(self):
self.x=random.randint(200,600)
self.y=random.randint(50,150)

接着循环相应ufo数量进行ufo的创建
ufos = []
for i in range(number_of_ufos):
ufos.append(Ufo())

完成ufo类的创建后开始设计ufo的显示方法
def show_ufo():
global is_over #游戏是否结束检测
for e in ufos:
screen.blit(e.img,(e.x,e.y))#绘制ufo形象及其坐标
e.x += e.step #ufo 的x轴变化递加所设定速度
if(e.x>750 or e.x<0): #当ufo的x坐标达到窗口边际时将其反向
e.step *=-1 #并增加y轴坐标以实现防出界及下沉功能
e.y+=40
if e.y >500: #设定游戏结束,当ufo的y轴坐标到达窗口
is_over =True #底部时,判定变量变为True,清空所有ufo
ufos.clear()

创建完敌人ufo相应功能后接下来创建子弹类。载入子弹图片,设定子弹的移动速度,及其初始坐标,初始坐标为飞机坐标加上适合坐标以实现子弹从飞机中部出现的功能。
class Zidan():
def init(self):
self.img = pygame.image.load(‘zidan.png’)
self.x=plantX +30
self.y=plantY+10
self.step=10 #子弹移动速度
接下来设计子弹与ufo的撞击功能
def hit(self):
global score #对分数的计算
创建循环,当子弹与ufo的坐标距离小于30时,移除子弹,并对ufo进行重新随机坐标,并增加相应分数
for e in ufos:
if(distance(self.x,self.y,e.x,e.y)<30):
zidans.remove(self)
e.reset()
score +=100

zidans =[]

创建子弹显示方法
def show_zidans():
创建循环,绘制子弹的图片及其坐标,检测子弹的撞击,设定子弹y轴的变化来实现子弹的上升功能,当子弹到达窗口顶部时,移除子弹。
for z in zidans:
screen.blit(z.img,(z.x,z.y)
z.hit()
z.y -= z.step
if z.y <0:
zidans.remove(z)

设计距离方法,在开头载入math模块。通过欧几里得方法计算出子弹与ufo间距离。
def distance(zx,zy,ex,ey):
a=zx -ex
b=zy -ey
return math.sqrt(aa + bb)

接下来实现分数功能。初始分数为0,用pygame.Font载入自带字体,设定字体大小
score =0
font=pygame.font.Font(‘freesansbold.ttf’,32)
设计分数显示方法,设定文本内容及字体颜色,并绘制分数
def show_score():
text=f"score:{score}"
score_render =font.render(text,True,(255,255,255))
screen.blit(score_render,(10,10))

最后设计游戏结束功能,创建检测游戏是否结束的变量并初始为False,载入字体设定字体大小。
is_over=False
over_font =pygame.font.Font(‘freesansbold.ttf’,64)
设计检测游戏是否结束方法
def check_is_over():
判定游戏结束时显示Game Over的文本内容
if is_over:
text=“Game Over”
显示文本内容并设计字体颜色
render =over_font.render(text,True,(255,0,0))
在窗口中间坐标处绘制。
screen.blit(render,(200,250))

当一切设计完成后实现游戏主循环
running= True #创建一个变量
while running: #创建循环
screen.blit(bjImg,(0,0)) #绘制背景图片
show_score() #调用显示分数的方法
for event in pygame.event.get(): #创建一个获取事件的循环
if event.type==pygame.QUIT: #当事件为pygame常量的退出时,变量
running =False 变为False,即可退出游戏主循环

设计判断当事件为键盘按下
if event.typepygame.KEYDOWN:
判断按下为右方向键时,飞机坐标增加3
if event.key
pygame.K_RIGHT:
plantStep=3
判断按下为左方向键时,飞机坐标减少3
elif event.key==pygame.K_LEFT:
plantStep=-3
判断按下为空格键时,创建子弹
elif event.key pygame.K_SPACE:
zidans.append(Zidan())
判断事件为松开按键时,飞机移动速度为0
if event.type
pygame.KEYUP:
plantStep=0
绘制飞机
screen.blit(plantImg,(plantX,plantY))
move_plant() 调用飞机移动方法
show_ufo() 调用ufo显示方法
show_zidans() 调用子弹显示方法
check_is_over() 调用检测游戏是否结束方法
pygame.display.update() 进行界面更新
4. 实验。
飞机大战小游戏设计
图2.显示窗口
飞机大战小游戏设计
图3.显示分数
飞机大战小游戏设计
图4.游戏结束
飞机大战小游戏设计
图5.发射子弹

飞机大战小游戏设计
图6.移动飞机
5. 总结和展望
实现了发射子弹连发的功能,但是发射子弹过多降低游戏难度,应该实现三连发或者两连发可提升游戏可玩性。
单一的游戏背景音乐会让人疲劳,没有实现多种背景音乐的随机。
敌人太过单一,未实现需多发子弹解决的敌人,游戏趣味及挑战性偏低
参考文献:
[1] https://www.bilibili.com/video/BV1i741137rM?p=1

相关文章: