目录

一、源代码

二、源代码梳理分析:

(一)代码的主要结构

1、引用需要的模块

2、定义的类

3、定义main()函数:主程序

(二)代码分析收获


最好的学习方法是学习别人的代码,加上自己以前比较喜欢雷电这款游戏,所以就从飞机大战入手了,从网上下的源代码和图片素材,先上源代码,代码所有权归原作者。

一、源代码

import pygame
from pygame.locals import *
from sys import exit
import time
import random#创建子弹类,把子弹的图片转化为图像对象,设定固定的移动速度
class Bullet():def __init__(self,bulletfilename,bulletpos):  #定义初始化,参数是图的文件名和位置self.bulletimg = pygame.image.load(bulletfilename) #图像self.bullet_rect = self.bulletimg.get_rect()#获得rectself.bullet_image = self.bulletimg.subsurface(self.bullet_rect) #生成subsurface对象self.bullet_rect.midbottom = bulletpos  #设置rect位置self.speed = 2 #设置子弹速度def move(self):self.bullet_rect.top -= self.speed   #子弹的运动是不断的以速度值大小减小#    创建玩家飞机类,用面向对象的思想来对待
class play_plane_fly():def __init__(self,play_image_filename,play_pos):self.image = pygame.image.load(play_image_filename)self.plane_rect = self.image.get_rect()self.play_image = self.image.subsurface(self.plane_rect)self.plane_rect.midtop = play_posself.speed = 2#子弹是由玩家飞机发射的,所以创建列表,存储子弹对象,使该列表变为该类的属性self.bullets = [] #子弹空列表self.is_hitted = False #是否被击中#生成函数,完成发射子弹动作,同时将每个子弹对象存在列表中def shoot(self,bullet_filename):bulletobj = Bullet(bullet_filename,self.plane_rect.midtop) #利用Bullet生产self.bullets.append(bulletobj) #加入子弹列表#定义向上移动方法,当飞机移动到边框位置时,无法移动def moveup(self):if self.plane_rect.top <= 0:self.plane_rect.top = 0else:self.plane_rect.top -= self.speed# 定义向下移动方法,当飞机移动到边框位置时,无法移动def movedown(self):if self.plane_rect.top >= 700 - self.plane_rect.height:self.plane_rect.top = 700 - self.plane_rect.heightelse:self.plane_rect.top += self.speed#    向右移动,当飞机移动到边框位置时,无法移动def moveleft(self):if self.plane_rect.left <= -40:self.plane_rect.left = -40else:self.plane_rect.left -= self.speed#    向左移动,当飞机移动到边框位置时,无法移动def moveright(self):if self.plane_rect.left >= 700 - self.plane_rect.width:self.plane_rect.left = 700 - self.plane_rect.widthelse:self.plane_rect.left += self.speed#    生成敌机类,设定固定的移动速度
class Enemy():def __init__(self,enemyfilename,enemypos):self.img = pygame.image.load(enemyfilename)self.enemy_rect = self.img.get_rect()self.enemy_image = self.img.subsurface(self.enemy_rect)self.enemy_rect.midbottom = enemyposself.speed = 1def move(self):self.enemy_rect.bottom += self.speed  #敌机向下运动clock = pygame.time.Clock()
def main():#    初始化文字屏幕pygame.font.init()#    初始化图像屏幕pygame.init()#    设定游戏帧clock.tick(50)#    设定游戏屏幕大小screen = pygame.display.set_mode((660, 700))#    设定游戏名称pygame.display.set_caption('飞机大战')#    加载背景图片,生成图像对象background = pygame.image.load('image/background.png').convert()backgroundsurface = pygame.transform.scale(background,  (660,  700))#    加载游戏结束图片,生成图像对象gameover = pygame.image.load('image/gameover.png').convert()gameoversurface = pygame.transform.scale(gameover,(660,  700))playplanefilename = 'image/hero1.png'planepos = [330,600]player = play_plane_fly(playplanefilename,planepos) #定义play实例bulletfilename = 'image/bullet.png'# 按频率生成子弹,初始化数字为0bullet_frequency = 0enemyfilename = 'image/enemy0.png'#    按频率生成敌机,初始化数字为0enemy_frequency = 0# 定义enemys空列表enemys = []myfont = pygame.font.SysFont("font/Marker Felt.ttf", 40)textImage = myfont.render("Score ", True, (0,0,0))# 初始化得分为0Score = 0# 敌机被子弹击中时的动画,将每张图片的图像对象存在列表中enenys_down = []enemy0_down = pygame.image.load('image/enemy0_down1.png')enemy0_down_rect = enemy0_down.get_rect()enemydown0 = enemy0_down.subsurface(enemy0_down_rect)enenys_down.append(enemydown0)enemy1_down = pygame.image.load('image/enemy0_down2.png')enemy1_down_rect = enemy1_down.get_rect()enemydown1 = enemy1_down.subsurface(enemy1_down_rect)enenys_down.append(enemydown1)enemy2_down = pygame.image.load('image/enemy0_down3.png')enemy2_down_rect = enemy2_down.get_rect()enemydown2 = enemy2_down.subsurface(enemy2_down_rect)enenys_down.append(enemydown2)enemy3_down = pygame.image.load('image/enemy0_down4.png')enemy3_down_rect = enemy3_down.get_rect()enemydown3 = enemy3_down.subsurface(enemy3_down_rect)enenys_down.append(enemydown3)#以上存了四组击中后的图片,实现击中后的飞机爆炸while True:#    动态显示得分score = str(Score)myscore = pygame.font.SysFont("font/Marker Felt.ttf", 40)scoreImage = myscore.render(score, True, (0, 0, 0))# 判断事件,防止卡顿或者意外退出for event in pygame.event.get():if event.type == pygame.QUIT: #退出事件pygame.quit()exit()key_pressed = pygame.key.get_pressed() #接收输入键if key_pressed[K_UP] or key_pressed[K_w]:player.moveup()if key_pressed[K_DOWN] or key_pressed[K_s]:player.movedown()if key_pressed[K_LEFT] or key_pressed[K_a]:player.moveleft()if key_pressed[K_RIGHT] or key_pressed[K_d]:player.moveright()screen.blit(backgroundsurface, (0, 0)) #绑定背景图if not player.is_hitted:  #如果游戏对象没有被击中#    按频率生成子弹# 通过控制30这个数,来控制发射子弹的间隔,循环30次后发射一个子弹if bullet_frequency % 30 == 0:player.shoot(bulletfilename)bullet_frequency += 1if bullet_frequency >= 30:bullet_frequency = 0# print("bullet_frequency is {0}".format(bullet_frequency)) #试验用的,没有实际意义#    让子弹动起来for i in player.bullets:i.move()screen.blit(i.bullet_image,i.bullet_rect)#    当子弹飞出屏幕,删除子弹对象if i.bullet_rect.bottom <= 0:player.bullets.remove(i)  #从列表中删除数据#    按频率生成敌机#原理同子弹频率一样if enemy_frequency % 100 == 0:enemypos = [random.randint(30, 630), 0]enemyplane = Enemy(enemyfilename, enemypos)#将敌机对象添加到列表中enemys.append(enemyplane)enemy_frequency += 1if enemy_frequency >= 100:enemy_frequency = 0#    让敌机动起来for i in enemys:i.move()screen.blit(i.enemy_image,i.enemy_rect)#    当敌机飞出屏幕,删除敌机对象if i.enemy_rect.bottom >= 700:enemys.remove(i)#    遍历子弹对象,判断子弹是否击中敌机for j in player.bullets:#    如果击中,分数增加,同时移除该子弹和敌机对象if pygame.Rect.colliderect(j.bullet_rect,i.enemy_rect):  #运用的是rect对象的检测,测试两个矩形是否重叠Score += 100enemys.remove(i)player.bullets.remove(j)for k in enenys_down:screen.blit(k,i.enemy_rect)#    遍历敌机对象,判断玩家是否和敌机相撞if pygame.Rect.colliderect(player.plane_rect,i.enemy_rect):#    修改is_hitted的值,跳出该层循环player.is_hitted = Truebreakscreen.blit(player.play_image,player.plane_rect)screen.blit(textImage, (0,0))screen.blit(scoreImage, (110, 0))pygame.display.update()#    玩家退出时显示分数和游戏结束else:screen.blit(gameoversurface,(0,0))screen.blit(textImage, (0, 0))screen.blit(scoreImage,  (110, 0))pygame.display.update()time.sleep(2)breakmain()

二、源代码梳理分析:

(一)代码的主要结构

1、引用需要的模块

import pygame
from pygame.locals import *
from sys import exit
import time
import random

2、定义的类

(1)Bullet()-子弹类

需要初始化子弹图像和位置

定义类方法move

(2)play_plane_fly():玩家飞机类

需要初始化飞机图像和位置

定义类方法shoot和四个方面的运动

(3)Enemy():敌机类

需要初始化敌机图像和位置

定义类方法move

3、定义main()函数:主程序

(1)初始化及设置

#    初始化文字屏幕
pygame.font.init()
#    初始化图像屏幕
pygame.init()
#    设定游戏帧
clock.tick(50)
#    设定游戏屏幕大小
screen = pygame.display.set_mode((660, 700))
#    设定游戏名称
pygame.display.set_caption('飞机大战')
#    加载背景图片,生成图像对象
background = pygame.image.load('image/background.png').convert()
backgroundsurface = pygame.transform.scale(background,  (660,  700))
#    加载游戏结束图片,生成图像对象
gameover = pygame.image.load('image/gameover.png').convert()
gameoversurface = pygame.transform.scale(gameover,(660,  700))
#设定飞机参数
playplanefilename = 'image/hero1.png'
planepos = [330,600]
#定义飞机实例
player = play_plane_fly(playplanefilename,planepos) #定义play实例
#设定子弹参数
bulletfilename = 'image/bullet.png'
# 按频率生成子弹,初始化数字为0
bullet_frequency = 0
#设定敌机参数
enemyfilename = 'image/enemy0.png'
#   按频率生成敌机,初始化数字为0
enemy_frequency = 0# 定义enemys空列表
enemys = []#生成字体对象
myfont = pygame.font.SysFont("font/Marker Felt.ttf", 40)
#生成Surface
textImage = myfont.render("Score ", True, (0,0,0))
# 初始化得分为0
Score = 0
# 敌机被子弹击中时的动画,将每张图片的图像对象存在列表中
enenys_down = []
enemy0_down = pygame.image.load('image/enemy0_down1.png')
enemy0_down_rect = enemy0_down.get_rect()
enemydown0 = enemy0_down.subsurface(enemy0_down_rect)
enenys_down.append(enemydown0)
enemy1_down = pygame.image.load('image/enemy0_down2.png')
enemy1_down_rect = enemy1_down.get_rect()
enemydown1 = enemy1_down.subsurface(enemy1_down_rect)
enenys_down.append(enemydown1)
enemy2_down = pygame.image.load('image/enemy0_down3.png')
enemy2_down_rect = enemy2_down.get_rect()
enemydown2 = enemy2_down.subsurface(enemy2_down_rect)
enenys_down.append(enemydown2)
enemy3_down = pygame.image.load('image/enemy0_down4.png')
enemy3_down_rect = enemy3_down.get_rect()
enemydown3 = enemy3_down.subsurface(enemy3_down_rect)
enenys_down.append(enemydown3)
#以上存了四组击中后的图片,实现击中后的飞机爆炸

(2)获取事件并逐个响应

while True:#    动态显示得分score = str(Score)myscore = pygame.font.SysFont("font/Marker Felt.ttf", 40)scoreImage = myscore.render(score, True, (0, 0, 0))# 判断事件,防止卡顿或者意外退出for event in pygame.event.get():if event.type == pygame.QUIT: #退出事件pygame.quit()exit()key_pressed = pygame.key.get_pressed() #接收输入键if key_pressed[K_UP] or key_pressed[K_w]:player.moveup()if key_pressed[K_DOWN] or key_pressed[K_s]:player.movedown()if key_pressed[K_LEFT] or key_pressed[K_a]:player.moveleft()if key_pressed[K_RIGHT] or key_pressed[K_d]:player.moveright()screen.blit(backgroundsurface, (0, 0)) #绑定背景图if not player.is_hitted:  #如果游戏对象没有被击中#    按频率生成子弹# 通过控制30这个数,来控制发射子弹的间隔,循环30次后发射一个子弹if bullet_frequency % 30 == 0:player.shoot(bulletfilename)bullet_frequency += 1if bullet_frequency >= 30:bullet_frequency = 0#    让子弹动起来for i in player.bullets:i.move()screen.blit(i.bullet_image,i.bullet_rect)#    当子弹飞出屏幕,删除子弹对象if i.bullet_rect.bottom <= 0:player.bullets.remove(i)  #从列表中删除数据#    按频率生成敌机#原理同子弹频率一样if enemy_frequency % 100 == 0:enemypos = [random.randint(30, 630), 0]enemyplane = Enemy(enemyfilename, enemypos)#将敌机对象添加到列表中enemys.append(enemyplane)enemy_frequency += 1if enemy_frequency >= 100:enemy_frequency = 0#    让敌机动起来for i in enemys:i.move()screen.blit(i.enemy_image,i.enemy_rect)#    当敌机飞出屏幕,删除敌机对象if i.enemy_rect.bottom >= 700:enemys.remove(i)#    遍历子弹对象,判断子弹是否击中敌机for j in player.bullets:#    如果击中,分数增加,同时移除该子弹和敌机对象if pygame.Rect.colliderect(j.bullet_rect,i.enemy_rect): #运用的是rect对象的检测,测试两个矩形是否重叠Score += 100enemys.remove(i)player.bullets.remove(j)for k in enenys_down:screen.blit(k,i.enemy_rect)#    遍历敌机对象,判断玩家是否和敌机相撞if pygame.Rect.colliderect(player.plane_rect,i.enemy_rect):#    修改is_hitted的值,跳出该层循环player.is_hitted = Truebreakscreen.blit(player.play_image,player.plane_rect)screen.blit(textImage, (0,0))screen.blit(scoreImage, (110, 0))pygame.display.update()#    玩家退出时显示分数和游戏结束else:screen.blit(gameoversurface,(0,0))screen.blit(textImage, (0, 0))screen.blit(scoreImage,  (110, 0))pygame.display.update()time.sleep(2)break

说明:

①接收键盘的输入

key_pressed = pygame.key.get_pressed() #接收输入键

②控制子弹和敌机的发射频率

# 通过控制30这个数,来控制发射子弹的间隔,循环30次后发射一个子弹
if bullet_frequency % 30 == 0:player.shoot(bulletfilename)
bullet_frequency += 1
if bullet_frequency >= 30:bullet_frequency = 0

每次发射频率增加1个数,每30次达到要求,shoot 一次

敌机的频率方法相同

③碰撞检测

通过rect相互间的碰撞检测实现

例如:

if pygame.Rect.colliderect(player.plane_rect,i.enemy_rect):#    修改is_hitted的值,跳出该层循环player.is_hitted = Truebreak

(3)更新和刷新

.....
screen.blit(player.play_image,player.plane_rect)
screen.blit(textImage, (0,0))
screen.blit(scoreImage, (110, 0))
pygame.display.update()

(二)代码分析收获

1、代码充分利用了类和类的方法,大量的减少了代码量,复用性较好。

2、发射频率的控制思路可以借用到其他场合使用。

3、利用了Rect对象的碰撞检测实现飞机、子弹、敌机之间的碰撞,实现的比较好

4、通过enenys_down列表的切换实现敌机爆炸的效果,可借鉴。

python+pygame之飞机大战-第一版源代码分析相关推荐

  1. 雷霆战机9.5全新上线,Python+Pygame开发飞机大战完整游戏项目(附源码)

    项目名称:太空大战 开发环境:Python3.6.4 第三方库:Pygame1.9.6 代码编辑器:Sublime Text 先来看一下游戏画面吧!  游戏画面动态且丰富哦!   需求分析 利用Pyt ...

  2. Python实验,用pygame做飞机大战游戏设计

    飞机大战游戏设计 摘 要:根据课程要求,以及面向对象程序设计的编程思想,在Windows操作系统环境下,运用PyCharm编译程序,以Python语言为开发语言,最终实现飞机大战游戏相应的游戏操作功能 ...

  3. pygame小项目 ~ 3 :Python完成简易飞机大战

    pygame小项目 ~ 3 :Python完成简易飞机大战 子弹 敌机 我方战斗机全部采用图片 子弹击中和战斗机被击中全部采用碰撞检测 游戏的主函数代码 import spite from spite ...

  4. Python游戏之Pygame——太空飞机大战(三)

    上一篇(Python游戏之Pygame--太空飞机大战(二))完成了敌机类以及敌机坠毁时释放包裹类,这一篇将给出英雄战机类和处理.由于英雄战机是由游戏者操控的,所以要处理操控事件,比如往那个方向飞,发 ...

  5. 手把手教学,Python 游戏编程之实现飞机大战(含源代码)

    文章目录 一.游戏设定 1.游戏界面展示和设定 二.实现过程 1.我方飞机 2.敌方飞机 3.定义武器 4.武器补充库 5.主模块 总结: 前言 我想大家都是有玩过类似飞机大战的射击类游戏,也享受目标 ...

  6. python飞机大战功能模块图_python pygame实现飞机大战游戏

    1.引言 1.1 项目背景 python是一种跨平台的计算机程序设计语言.是一个高层次的结合了解释性.编译性.互动性和面向对象的脚本语言.最初被设计用于编写自动化脚本(Shell),随着版本的不断更新 ...

  7. Python游戏之Pygame——太空飞机大战(四)

    上一篇(Python游戏之Pygame--太空飞机大战(三))完成了英雄战机和星空,那么基本上飞机大战的主要元素都已经完成,该是总结成功玩自己游戏的时候了. 哦,差点忘了,Bullet类对于普通子弹和 ...

  8. Python游戏之Pygame——太空飞机大战(二)

    上一篇(Python游戏之Pygame--太空飞机大战(一))文章简单对游戏进行了说明,给出了部分配置文件以及子弹类.下面给出敌机类和方法. 大家直到,飞机必须能非,最好能非直线飞行.因此必须有X_s ...

  9. pygame实现飞机大战游戏

    标题:pygame实现飞机大战游戏 源码链接:我的github地址 一.具体演示 1.怪兽分为小怪,和大怪:大怪可以发射子弹 2.英雄飞机共有10个生命值 3.英雄飞机可以上下左右移动 4.显示了英雄 ...

  10. python入门笔记——飞机大战(极简版、未进行继承优化)

    python入门笔记--飞机大战(极简版.未进行继承优化) import random import pygame# 引用pygame里的模块 from pygame.locals import *# ...

最新文章

  1. 矩阵的卷积核运算(一个简单小例子的讲解)深度学习
  2. 再次献给那些心软的人!!!
  3. java并发框架支持锁包括,jdk1.8锁
  4. 数字图像处理实验三图像增强
  5. Java程序员需要了解的两种服务器设计模型
  6. 无论您的工作职能如何,如何获得功绩
  7. STM32工作笔记005---STM32芯片解读
  8. 计算机三级之嵌入式系统学习笔记2
  9. 38个MySQL数据库的小技巧
  10. Web开发几种常用工具
  11. (转)对冲基金不信中国经济数据,转用卫星监控6000块工业用地
  12. 一位全加器Verilog的三种不同的描述
  13. 计算机二级公共基础知识笔记
  14. 收藏有关信号处理的博客
  15. 考研复试数据库原理课后习题(一)——绪论
  16. window10家庭版安裝docker遇到的問題【已解決】
  17. violate原理和用法
  18. Java程序员的就业方向
  19. Web入门_朽木|学习笔记之第一章-数据库基本知识(1.1-1.7)
  20. 常见光学设计软件的扩展语言简介

热门文章

  1. 用c加加创建c语言项目,如何使用visual studio 2017创建C语言项目
  2. asp.net web压力测试
  3. 算法学习笔记:排序算法
  4. 小马快跑win7激活_更快地激活服务人员
  5. SpringCloud Gateway网关为认证中心和用户微服务构建统一的认证授权入口
  6. [NOI2010] 航空管制 (构反图+拓扑)
  7. 优秀课程案例:使用Scratch制作贪吃蛇大战游戏
  8. 一个简单的显示阴历的日历。
  9. 【MYSQL】【基础知识】【mysql联合主键如何 in查询】
  10. 关于 socket收发数据一样 接收的数据是错误