python【期末作业】

打飞机小游戏

  • 摘要
  • 1.引言
    • 1.1 背景及意义
    • 1.2 相关研究
    • 1.3 实现功能
  • 2.系统结构
    • 2.1 结构
    • 2.2 功能原理
  • 3.实现代码
  • 4.实验结果
  • 5.总结和展望

摘要

这款游戏的名字叫《打飞机》,是使用Python开发的飞行射击类游戏.Python是一种面向对象的解释型计算机程序设计语言,具有简单易学,可移植,可拓展等特点.并且拥有丰富的资源.在图形处理,数字处理,网络编程等方面有广泛用途.这个游戏利用了Python的pygame模块,射击子弹,飞机类的相关方法和属性,进行了背景贴图,实现了打飞机游戏的功能.
关键字: Python,pygame,面向对象,飞机。

1.引言

1.1 背景及意义

当今社会是一个信息社会.自从世界上第一台计算机问世以来,计算机行业飞速发展.随着以全球信息网络普及和全球信息共享为标志的”全球信息网络革命”的蓬勃兴起,计算机变成了人们生活中必不可少的一部分。
过去,人们主要是借助电影,电视,音乐等方式来娱乐.而今天,以游戏为代表的电子娱乐正成为主流娱乐方式.因为CPU以及显卡等设备的高速发展,为人们开发出更加炫目多彩的游戏提供了可能.目前纷繁复杂的游戏软件比比皆是,无论在线的网络游戏还是桌面游戏,二维的还是三维立体空间的,多由单机版游戏孕育而来.学习简单的单机版游戏的制作,有利于初学者了解游戏制作的理念。

1.2 相关研究

96,97年的国产游戏产品是单机版的游戏,在当时的市场是虽然品质和档次不如外来产品,但也占有一定的市场,例如<仙剑奇侠传>,<三国志>等系列带有鲜明中国特色与气息的游戏在市场上掀起了一波高潮.1998年联众与中国游戏中心等老牌的游戏平台的推出标志着电脑游戏在中国的开荒与生根.但是到了1999年没有形成主流产品的情况下,政策不明朗,包括开发资金出现问题等原因国产游戏开始走下坡路.一直到了2000年,网络游戏问世并且很快流行起来,我国的游戏行业才有渐渐的复苏.但是由于投入差距太大,起步晚等原因与外国游戏相对而言并没有竞争力.
时至今日,网络游戏走入盛世,成为了大部分人休闲娱乐的主要修为.国内网易,腾讯,九城,完美等公司百花齐放,国产网游渐渐走入国际市场,而且基于网络的发展真正实现了网络全球化,网络游戏也是遍布全球,全球同玩一款游戏的现象比比皆是.大量海外游戏走入中国市场,电脑游戏百花纷呈,随着经济的进步,计算机科技的发展,这一现象将愈演愈烈。

1.3 实现功能

本项目主要完成一种基于Python开发的一款单机游戏.项目研究的具体任务包括:
(1) 创建一个pygame窗口;
(2) 实现图标、背景图及其他图;
(3) 实现玩家飞机移动功能;
(4) 实现玩家飞机发射子弹的功能;
(5) 实现敌机随机出现并逐渐下落的功能;
(6) 实现子弹和敌机的碰撞检测;
(7) 实现敌机中弹消失;
(8) 实现分数、音效。

2.系统结构

2.1 结构

python【期末作业】_第1张图片
图 2-1 结构图
相关模块
pygame、random、math

2.2 功能原理

1、 创建一个pygame窗口:pygame.init()、screen.blit、pygame.display;
2、 实现图标、背景图及其他图:pygame.image.load;
3、 实现玩家飞机移动功能:通过控制键盘事件来控制飞机坐标;
4、 实现玩家飞机发射子弹的功能:通过控制键盘事件来控制子弹坐标;
5、 实现敌机随机出现并逐渐下落的功能:random.randint
6、 实现子弹和敌机的碰撞检测:通过勾股定理判断子弹与敌机中心点的距离;
7、 实现敌机中弹消失并出现新的敌机:random.randint重置位置
8、实现分数、音效:pygame.font 、pygame.mixer.music。

3.实现代码

import pygame
import random
import math

#初始化界面
pygame.init()
screen = pygame.display.set_mode((800,600))#屏幕大小
pygame.display.set_caption('狗蛋打飞机')#标题
icon = pygame.image.load('ufo.png')#获取图标
pygame.display.set_icon(icon)#载入图标
bgImg = pygame.image.load('bg.png')#获取背景图

#添加音效
pygame.mixer.music.load('bg.wav')
pygame.mixer.music.play(-1)#单曲循环
#添加射中音效
bong_sound = pygame.mixer.Sound('exp.wav')

#飞机
playerImg = pygame.image.load('player.png')#获取玩家飞机图
playerX = 400  #飞机横坐标
playerY = 500  #飞机纵坐标
playerStep = 0  #飞机移动速度

#分数
score = 0
font = pygame.font.Font('freesansbold.ttf',32)
def show_score():
    text = f"Score:{score}"
    score_render = font.render(text, True, (0, 255, 0))
    screen.blit(score_render, (10, 10))

#游戏结束
is_over = False
over_font = pygame.font.Font('freesansbold.ttf',64)
def check_is_over():
    if is_over:
        text = "Game Over"
        score_render = over_font.render(text, True, (255, 0, 0))
        screen.blit(score_render, (250, 200))

#敌机
number_of_enemies = 6#敌机数

#敌机类
class Enemy():
    def __init__(self):
        self.img = pygame.image.load('enemy.png')#获取敌机图
        self.x = random.randint(200, 600)
        self.y = random.randint(50, 200)
        self.step = random.randint(1, 4)#敌机移动速度

	#当被射中时,恢复位置
    def reset(self):
        self.x = random.randint(200, 600)
        self.y = random.randint(50, 150)
        
enemies = []#保存所有的敌机
for i in range(number_of_enemies):
    enemies.append(Enemy())


#子弹类
class Bullet():
    def __init__(self):
        self.img = pygame.image.load('bullet.png')#获取子弹图
        self.x = playerX + 16
        self.y = playerY + 10
        self.step = 4 #子弹移动速度

	#击中
    def hit(self):
        global score
        for e in enemies:
            if(distance(self.x, self.y ,e.x, e.y) < 30):
                #射中
                bong_sound.play()
                bullets.remove(self)
                e.reset()
                score += 1
            
bullets = [] #保存现有的子弹


#显示敌机,并实现移动和下沉
def show_enemy():
    global is_over
    for e in enemies:
        screen.blit(e.img,(e.x, e.y))
        e.x += e.step
        #防止敌机出界
        if(e.x > 736 or e.x < 0):
            e.step *= -1
            e.y += 30  #敌机下沉
            if e.y > 450:
                is_over = True
                enemies.clear()

#显示玩家飞机
def move_player():
    global playerX
    playerX += playerStep #移动飞机
    #防止飞机出界
    if playerX > 736:
        playerX = 736
    if playerX < 0:
        playerX = 0


#显示并移动子弹
def show_bullets():
    for b in bullets:
        screen.blit(b.img,(b.x, b.y))
        b.hit()#调用击中
        b.y -= b.step #移动子弹
        #子弹触界消失
        if b.y < 0:
            bullets.remove(b)


#检测两个点之间的距离
def distance(bx, by, ex, ey):
    a = bx - ex
    b = by - ey
    return math.sqrt(a ** 2 + b ** 2)



#游戏主循环
while True:
    screen.blit(bgImg,(0,0))#显示背景图
    show_score()#显示分数
    
	for event in pygame.event.get():#事件
        #退出
        if event.type == pygame.QUIT:
            pygame.quit()
            
	#通过键盘事件控制飞机的移动
        if event.type == pygame.KEYDOWN:#按下就移动
            if event.key == pygame.K_RIGHT:
                playerStep = 5
            elif event.key == pygame.K_LEFT:
                playerStep = -5
            elif event.key == pygame.K_SPACE:
                #创建一颗子弹
                bullets.append(Bullet())
                
    if event.type == pygame.KEYUP:#松开就停下
            playerStep = 0
            
	screen.blit(playerImg,(playerX, playerY))#显示玩家飞机
    
 	move_player()#移动玩家
    show_enemy()#显示敌机
    show_bullets()#显示子弹
    check_is_over()#显示游戏结束

	pygame.display.update()  #更新界面

4.实验结果

python【期末作业】_第2张图片
python【期末作业】_第3张图片
python【期末作业】_第4张图片

5.总结和展望

基于Python的打飞机游戏是采用python语言及其pygame模块开发完成的.本项目实现了游戏流程中的所有功能,界面布局更加人性化,并有着良好的可扩展性.
这次项目设计开发为今后的学习和工作产生了积极的意义.由于还是初学者,在项目设计中还有欠缺和考虑不周的地方.游戏还有待进一步研究和改善。

你可能感兴趣的:(python,pygame)