上个星期弄了好久的打飞机,折磨了我好久,其实上周末都已经做好了,整体的一些大功能已经实现,缺少的就是一些小功能,比如说选关啊,变身啊,超级炸弹啊,本来想加上去,但是又比较花费时间,主要以后我也没有想要去从事游戏这么方面的工作,但是Pygame这个东西是真的好用,里面有各种各样的工具,基本可以满足你的所有需求,我只是用了几个必须的方法,做出来了游戏的雏形,以后有时间的话再慢慢优化吧,不过比较Low的事就是我把素材包给换了,我自己再网上找了图片,自己P了一套素材,整出来一个美少女战士,惊了吧,我自己也惊了,好好的打飞机不好吗?其实原理都一样只是换了一个外壳,废话不多说,先给大家看看效果图。


其实就是都做的是飞机没啥意思,就面向‘肥宅’来一个美少女吧,基本就是这个样子,简单的功能,基本没有什么bug,代码全部写在了一个Py文件中,本来想分开写,然后导入呢,但是有点麻烦,现在我的水平只能达到这样,等以后有能力了,把代码优化一下,我基本都是用类来写的,把代码封装起来,显得简洁一点吧(虽然也不是那么简洁),下面给大家看一下我的代码,一共500多行吧。



总体的代码就是这样,下面给大家看看我每个类里面的代码
每个列表里面放的基本都是图片

# 需求 制作一款全新版本的美少女战士
# 分析思路:图片素材  声音素材
# 1:启动界面
# 背景图片  开始游戏按钮 标题(使用sin(x)可以动画)# 2:游戏界面
#  英雄类:
#      属性:图片 血量 速度 渲染屏幕 初始位置
#      方法:移动 发射子弹 死亡 无敌  碰撞敌机
#  敌人类:
#      属性:图片 血量 速度 初始位置  渲染屏幕
#      方法:移动  死亡
#   子弹类:
#      属性:图片 位置 速度 屏幕
#      方法:移动 碰撞敌机
#   敌机工厂类:负责敌机的产生 敌机的移动
# 3:分数界面
#   历史分数最大值:储存最大值,显示分数import pygame
import sys
import math
import copy
import random
import os'''enemy_imgs = [pygame.image.load('images/enemy1.png'),pygame.image.load('images/enemy2.png'),pygame.image.load('images/enemy3.png'),pygame.image.load('images/enemy4.png'),pygame.image.load('images/enemy5.png')
]
'''
history = 0enemy_list = []
enemy_imgs1 = [pygame.transform.scale((pygame.image.load('images/diren1.png')), (120, 130)),pygame.transform.scale((pygame.image.load('images/diren1baozha1.png')), (120, 130)),pygame.transform.scale((pygame.image.load('images/diren1baozha2.png')), (120, 130)),pygame.transform.scale((pygame.image.load('images/diren1baozha3.png')), (120, 130))
]
enemy_imgs2 = [pygame.transform.scale((pygame.image.load('images/diren2.png')), (80, 85)),pygame.transform.scale((pygame.image.load('images/deren2baozha1.png')), (80, 85)),pygame.transform.scale((pygame.image.load('images/diren2baozha2.png')), (80, 85)),pygame.transform.scale((pygame.image.load('images/diren2baozha3.png')), (80, 85))
]
enemy_imgs3 = [pygame.transform.scale((pygame.image.load('images/diren3.png')), (80, 85)),pygame.transform.scale((pygame.image.load('images/diren3baozha1.png')), (80, 85)),pygame.transform.scale((pygame.image.load('images/diren3baozha2.png')), (80, 85)),pygame.transform.scale((pygame.image.load('images/diren3baozha3.png')), (80, 85))]
enemy_imgs4 = [pygame.transform.scale((pygame.image.load('images/direndaboss.png')), (220, 160)),pygame.transform.scale((pygame.image.load('images/bossbaozha1.png')), (220, 160)),pygame.transform.scale((pygame.image.load('images/bossbaozha2.png')), (220, 160)),pygame.transform.scale((pygame.image.load('images/bossbaozha3.png')), (220, 160)),pygame.transform.scale((pygame.image.load('images/bossbaozha4.png')), (220, 160)),pygame.transform.scale((pygame.image.load('images/bossbaozha5.png')), (220, 160))]bullet_img = [pygame.transform.scale((pygame.image.load('images/bullet2.png')), (36, 34)),pygame.transform.scale((pygame.image.load('images/heartbullet.png')), (36, 34)),pygame.transform.scale((pygame.image.load('images/heartbullet.png')), (36, 34)),
]
bullet_list = []# 加载背景图片
start_bg = [pygame.image.load('images/beijing2.png'),pygame.image.load('images/beijing4.png'),pygame.image.load('images/zitibiaoti5.png'),pygame.image.load('images/starbit.png'),pygame.image.load('images/engbg1.png'),pygame.image.load('images/beijingtu1.png'),pygame.image.load('images/beijingtu2.png')
]
start_star = [pygame.image.load("images/star3.png"),pygame.image.load("images/star2.png"),pygame.image.load("images/star1.png")
]# 开始界面类
class StatPanel:is_inside = Falsedef __init__(self, screen, start_bg=start_bg, start_star=start_star):self.screen = screenself.start_bg = start_bgself.start_star = start_starself.index = 0self.statIndex = 0self.statAddIndex = 0def display(self):self.index += 0.01# 背景图self.screen.blit(self.start_bg[0], (0, 0))self.screen.blit(self.start_bg[5], (10, 520))self.screen.blit(self.start_bg[6], (370, 530))# 文字标题self.screen.blit(self.start_bg[2], (60, 100 + 30 * math.sin(self.index)))# 开始按钮btn = self.screen.blit(self.start_bg[3], (180, 380))# 鼠标是否在按键上方StatPanel.is_inside = btn.collidepoint(pygame.mouse.get_pos())# 三张动图self.statAddIndex += 1if self.statAddIndex == 1000:self.statAddIndex = 0if self.statAddIndex % 7 == 0:self.statIndex += 1if self.statIndex == 3:self.statIndex = 0self.screen.blit(self.start_star[self.statIndex], (random.randint(-40, 400), random.randint(-60, 150)))self.screen.blit(self.start_star[self.statIndex], (random.randint(-40, 400), random.randint(-60, 150)))self.screen.blit(self.start_star[self.statIndex], (random.randint(-40, 400), random.randint(-60, 150)))self.screen.blit(self.start_star[self.statIndex], (random.randint(-40, 400), random.randint(-60, 150)))self.screen.blit(self.start_star[self.statIndex], (random.randint(-40, 400), random.randint(-60, 150)))self.screen.blit(self.start_star[self.statIndex], (random.randint(-40, 400), random.randint(-60, 150)))# 结束界面类
class EndPanel:global fontObj1def __init__(self, screen, start_bg=start_bg, start_star=start_star):self.screen = screen# self.start_bg = start_bg# self.start_star = start_stardef end_panel(self):endbg = pygame.transform.scale(pygame.image.load('images/endbeijing1.png'), (580, 870))self.screen.blit(endbg, (0, 0))def font(self):scoreSurface = fontObj1.render('The score:%s' % Hero.score, True, (255, 125, 125, 0))screen.blit(scoreSurface, (180, 400))hisSurface = fontObj1.render('Highest score in history :%s' % history, True, (255, 125, 125, 0))screen.blit(hisSurface, (170,450))# 音效类
pygame.mixer.init()
sounds = [pygame.mixer.Sound('sound/button.ogg')
]class AllSound:@staticmethoddef play_sounds(sound):if sound != None:sound.play()# 主角类
hero_imgs = [pygame.transform.scale((pygame.image.load('images/hero1.png')), (120, 210)),pygame.transform.scale((pygame.image.load('images/hero2.png')), (120, 210)),pygame.transform.scale((pygame.image.load('images/hero3.png')), (120, 210))]class Hero(pygame.sprite.Sprite):up = Falsedown = Falseleft = Falseright = Falsescore = 0# 属性:图片 位置 血量 速度 屏幕def __init__(self, screen, imgs, pos, hp, speed):self.screen = screenself.imgs = imgsself.image = self.imgs[0]self.rect = self.imgs[0].get_rect()self.rect.topleft = posself.hp = hpself.speed = speedself.indexAdd = 1self.imgIndex = 0def Move(self):# 移动 上下左右if Hero.right:self.rect = self.rect.move(self.speed, 0)if Hero.left:self.rect = self.rect.move(-self.speed, 0)if Hero.down:self.rect = self.rect.move(0, self.speed)if Hero.up:self.rect = self.rect.move(0, -self.speed)# 猪脚动画self.indexAdd += 1if self.indexAdd == 1000:self.indexAdd = 0if self.indexAdd % 97 == 0:self.imgIndex += 1if self.imgIndex == 3:self.imgIndex = 0# 鼠标控制# self.rect.center = pygame.mouse.get_pos()# 约束区域if self.rect.x <= 0:self.rect.x = 0if self.rect.x >= (self.screen.get_width() - self.imgs[0].get_width()):self.rect.x = self.screen.get_width() - self.imgs[0].get_width()if self.rect.y <= 0:self.rect.y = 0if self.rect.y >= (self.screen.get_height() - self.imgs[0].get_height()):self.rect.y = self.screen.get_height() - self.imgs[0].get_height()# 渲染屏幕self.screen.blit(self.imgs[self.imgIndex], self.rect)# 产生子弹if self.indexAdd % 30 == 0:Bullet((self.rect.centerx - (bullet_img[0].get_width() / 2), self.rect.y - 20), 4, self.screen)# 子弹移动for i in bullet_list:if i != None and isinstance(i, Bullet):i.Move()self.Collide()if self.hp <= 0:global isOverHistroyScore.UpdateHistory(Hero.score)isOver = True# 碰撞敌机def Collide(self, target=enemy_list):tempEnemy = pygame.sprite.spritecollideany(self, target, collided=pygame.sprite.collide_mask)if tempEnemy in enemy_list:self.hp -= 1self.rect.topleft = (180, 500)tempEnemy.hp -= 10# 子弹类
class Bullet(pygame.sprite.Sprite):# 属性 :图片 位置 速度 屏幕def __init__(self, pos, speed, screen, img=bullet_img[0]):self.image = imgself.rect = self.image.get_rect()self.rect.topleft = posself.speed = speedself.screen = screenbullet_list.append(self)# 方法:移动,碰撞敌机def Move(self):self.rect = self.rect.move(0, -self.speed)self.screen.blit(self.image, self.rect)if self.rect.y <= -69:if self in bullet_list:bullet_list.remove(self)self.CollideEnemy()# 碰撞敌机def CollideEnemy(self, target=enemy_list):# 第三个参数 打开碰撞遮罩tempEnemy = pygame.sprite.spritecollideany(self, target, collided=pygame.sprite.collide_mask)if tempEnemy and self in bullet_list:bullet_list.remove(self)tempEnemy.hp -= 1# 背景移动类
class BackGround:def __init__(self, img, speed, screen):self.img1 = imgself.img1rect = self.img1.get_rect()self.img2 = copy.copy(self.img1)self.img2rect = self.img2.get_rect()self.img2rect.y = -870self.speed = speedself.screen = screendef Move(self):self.img1rect = self.img1rect.move(0, self.speed)self.img2rect = self.img2rect.move(0, self.speed)if self.img1rect.y >= 880:self.img1rect.y = self.img2rect.y - 870if self.img2rect.y >= 880:self.img2rect.y = self.img1rect.y - 870self.screen.blit(self.img1, self.img1rect)self.screen.blit(self.img2, self.img2rect)# 敌机类
class Enemy(pygame.sprite.Sprite):# 属性 图片 位置 血量 速度 屏幕 标签def __init__(self, img, pos, hp, speed, screen, tag, imgs):self.image = imgself.imgs = imgsself.rect = self.image.get_rect()self.rect.topleft = posself.hp = hpself.speed = speedself.screen = screenself.tag = tagenemy_list.append(self)self.indexAdd = 0self.indexImg = 0# 方法 移动死亡def Move(self):if self.hp <= 0:self.dead()else:self.rect = self.rect.move(0, self.speed)self.screen.blit(self.image, self.rect)# 出画面死亡if self.rect.y > 880:if self in enemy_list and self != None:enemy_list.remove(self)# 死亡def dead(self):global scoreself.indexAdd += 1if self.indexAdd == 1000:self.indexAdd = 0# 播放死亡动画if self.tag == 'enemy0':if self.indexAdd % 7 == 0:self.indexImg += 1if self.indexImg == 3:# 移除列表if self in enemy_list:Hero.score += 3enemy_list.remove(self)if self.tag == 'enemy1':if self.indexAdd % 7 == 0:self.indexImg += 1if self.indexImg == 3:# 移除列表if self in enemy_list:Hero.score += 2enemy_list.remove(self)if self.tag == 'enemy2':if self.indexAdd % 7 == 0:self.indexImg += 1if self.indexImg == 3:# 移除列表if self in enemy_list:Hero.score += 2enemy_list.remove(self)if self.tag == 'enemy3':if self.indexAdd % 7 == 0:self.indexImg += 1if self.indexImg == 5:# 移除列表if self in enemy_list:Hero.score += 5enemy_list.remove(self)# 渲染动画self.screen.blit(self.imgs[self.indexImg], self.rect)# 飞机工厂类a
class EnemyFactor:@staticmethoddef Creat_enemy(screen):r = random.randint(1, 3200)if r < 700:Enemy(enemy_imgs1[0], (random.randint(0, 460), -130), 3, 2, screen, 'enemy0', enemy_imgs1)elif r < 1700:Enemy(enemy_imgs2[0], (random.randint(0, 500), -85), 1, 3, screen, 'enemy1', enemy_imgs2)elif r < 2700:Enemy(enemy_imgs3[0], (random.randint(0, 500), -85), 1, 3, screen, 'enemy2', enemy_imgs3)elif r < 3200:Enemy(enemy_imgs4[0], (random.randint(0, 360), -160), 5, 1, screen, 'enemy3', enemy_imgs4)@staticmethoddef Move():for i in enemy_list:if isinstance(i, Enemy):i.Move()# 历史分数类
class HistroyScore:# 历史分数更新def ReadHistory(path='score.txt'):global historyif os.path.exists(path):with open(path, mode='r', encoding='utf-8')as f_r:history = f_r.read()else:with open(path, mode='w', encoding='utf-8')as f_w:f_w.write('0')def UpdateHistory(score, path='score.txt'):if os.path.exists(path):with open(path, mode='r', encoding='utf-8')as f_r:if int(f_r.read()) <= score:with open(path, mode='w', encoding='utf-8')as f_w:f_w.write(str(score))screen = None# 事件监测
def AllEvent():global screenglobal is_play# 迭代所有事件for i in pygame.event.get():# 判断所有事件是否为 退出if i.type == pygame.QUIT:pygame.quit()sys.exit()if i.type == pygame.MOUSEBUTTONDOWN:if i.button == 1 and StatPanel.is_inside and is_play == False:AllSound.play_sounds(sounds[0])print('开始游戏')HistroyScore.ReadHistory()Hero.score = 0heroObj.hp = 5enemy_list.clear()bullet_list.clear()is_play = Trueif i.type == pygame.KEYDOWN:if i.key == pygame.K_SPACE:for j in enemy_list:j.hp = 0if i.key == pygame.K_ESCAPE:is_play = FalseAllSound.play_sounds(sounds[0])if i.key == pygame.K_w:Hero.up = Trueif i.key == pygame.K_s:Hero.down = Trueif i.key == pygame.K_a:Hero.left = Trueif i.key == pygame.K_d:Hero.right = Trueif i.type == pygame.KEYUP:if i.key == pygame.K_w:Hero.up = Falseif i.key == pygame.K_s:Hero.down = Falseif i.key == pygame.K_a:Hero.left = Falseif i.key == pygame.K_d:Hero.right = Falseif i.type == pygame.USEREVENT + 1 and is_play:EnemyFactor.Creat_enemy(screen)def Main():global heroObjglobal overObjglobal screenglobal is_playglobal isOverglobal fontObj1HistroyScore.ReadHistory()# 第一步初始化pygamepygame.init()# 第二步初始化displaypygame.display.init()# 第三步创建一个窗口屏幕screen = pygame.display.set_mode((580, 870))pygame.display.set_caption('代表月亮消灭你')# 设置缩略图图标icon = pygame.image.load("images/heartbullet.png")pygame.display.set_icon(icon)# 开始界面对类startObj = StatPanel(screen)# 结束对界面类overObj = EndPanel(screen)# 英雄对象heroObj = Hero(screen, hero_imgs, (180, 500), 5, 3)# 字体#运行字体fontObj = pygame.font.Font('ziti/MarkerFelt.ttf', 25)fontObj1 = pygame.font.Font('ziti/MarkerFelt.ttf', 25)# 背景图像bg = pygame.transform.scale(start_bg[4], (580, 870))bgobj = BackGround(bg, 0, screen)# 游戏是否开始is_play = False# 游戏是否结束isOver = False# 背景音乐pygame.mixer.music.load('sound/beijing.ogg')pygame.mixer.music.play(-1)# 设置计时器pygame.time.set_timer(pygame.USEREVENT + 1, 1000)# 第四步 循环计算画面  进行更新显示画面while True:AllEvent()if is_play:if isOver == False:# 游戏运行界面bgobj.Move()heroObj.Move()EnemyFactor.Move()hpSurface = fontObj.render('Hp :', True, (255, 125, 125, 0))screen.blit(hpSurface, (0, 0))scoreSurface = fontObj.render('Score :%s' % Hero.score, True, (255, 125, 125, 0))screen.blit(scoreSurface, (0, 30))hisSurface = fontObj.render('MAX score :%s' % history, True, (255, 125, 125, 0))screen.blit(hisSurface, (0, 60))# 血量显示for i in range(0, heroObj.hp):screen.blit(bullet_img[1], (35 + 35 * i, 0))else:# print('11111111111111111111111111111')overObj.end_panel()overObj.font()else:startObj.display()pygame.display.update()if __name__ == '__main__':Main()

代码写的也比较乱,以后再慢慢整理吧,最近要整理的东西太多了。
下面给大家看看正常的飞机大战素材包:



各种飞机大战,雷霆战机,全民飞机大战的素材包,就等你们来了,心动不如行动,赶快留言吧。

飞机大战项目(源代码(直接用),有效果图,素材包)相关推荐

  1. python飞机大战程序导入_Python飞机大战项目的准备 导入Pygame最全攻略~

    1.导入pygame 首先是导入pygame模块,下面介绍的是pycharm中导入 先建立一个项目 左上角File->Setting->project:飞机大战项目(你自己的文件名字)-& ...

  2. C++的学习心得和知识总结(十六)|基于EasyX实现小甲鱼Python飞机大战项目(C++版)

    目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.小甲鱼Python项目 – 飞机大战 2.本文使用的掩码图生成工具 自动生成遮罩图的程序,点击前往 3.EasyX官方链 ...

  3. Python实现飞机大战-第二部分(附源码、素材、超详细教程)

    飞机大战第二部分 1.前言 2.飞机射击 2.1.添加子弹的相关设置 2.2.创建文件bullet.py 2.3.修改game_functions.py 2.4.修改mian.py 2.5.射击效果 ...

  4. Python 游戏编程之实现飞机大战(含源代码)

    点击上方蓝色小字,关注"涛哥聊Python" 重磅干货,第一时间送达 来自:CSDN,作者:逐梦er 链接:https://zhumenger.blog.csdn.net/arti ...

  5. Python 之 游戏飞机大战项目实现

    项目实战 -- 飞机大战 目标 强化 面向对象 程序设计 体验使用 pygame 模块进行 游戏开发 实战步骤 pygame 快速体验 飞机大战 实战 确认模块 -- pygame pygame 就是 ...

  6. Python学习笔记(飞机大战项目练习)---B站黑马程序员

    学习目标: 完整的一个小项目开发 提示:这里可以添加学习目标 例如: 一周Python入门项目实战知识 学习内容: 0 安装pygame 模块: PS C:\Users\tanyugen\Pychar ...

  7. pygame 制作飞机大战项目

    我在码飞机大战的过程中许多都是参照书本做的,但是又许多不是按照书本做,我看了B站,看了这个论坛里一些大佬的作品,然后也融入了自己逊色的敲码水平,这个作品可以说是集大成.断断续续的学习了一年多也通过这个 ...

  8. [Unity3D]Unity3D游戏开发之飞机大战项目讲解

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比较综合的 ...

  9. Python自学第二十一天——飞机大战项目实践(四)

    作为新手自学Python的第二十一天,技术低微,希望可以通过这种方式督促自己学习. 个人学习环境:python3.9,PyCharm 2021.3.2 (Community Edition) 利用py ...

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

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

最新文章

  1. nas servers
  2. SQL中跨服务器查询
  3. 使用完成端口监控文件目录的例子
  4. 截取全部数值字符并将其转化为数值类型
  5. c语言Wndproc未定义,为什么我的老是未定义
  6. 我的INI 配置文件读写动态库
  7. DebugDiag调试工具
  8. 20165203 实验一 Java开发环境的熟悉
  9. 飞腾腾锐 D2000 荣获数字中国“十大硬核科技”奖
  10. 计算机鼠标双击怎么,讲解电脑鼠标左键单击变双击怎么办
  11. 通信原理 简易AMI码与HDB3码编码方式比较的matlab实现
  12. 可用于近红外光谱数据分析的网上公开数据集
  13. C语言BMP图像的读取、存入、水平镜像、竖直镜像、马赛克模糊处理、灰度二值化处理
  14. 学习笔记——Exploiting Unintended Feature Leakage in Collaborative Learning(协作学习中的非预期特征泄露研究)
  15. 很有意思的几个考验知识广度的问题
  16. Win10将某个软件/文件添加到开始屏幕(磁贴)
  17. CF1603B Moderate Modular Mode
  18. 如何在HTML页面中编写大于号和小于号?(HTML实体)
  19. 联合概率,边际概率和条件概率
  20. [问题]mpu9250+bmp280数据读取

热门文章

  1. 如何根据项目进行PLC选型
  2. axure rp8学习回忆
  3. 微信支付之H5页面WAP端接入
  4. springboot毕设项目作业查重系统i667s(java+VUE+Mybatis+Maven+Mysql)
  5. NB-IOT平台之电信平台FOTA 升级记录
  6. windows win32 API大全
  7. python win32api键盘_Python win32api.keybd_event模拟键盘输入
  8. 2021年“泰迪杯”数据分析技能B题-肥料登记数据分析赛题
  9. 推荐5个优秀的Java开源项目,初学者友好
  10. dev万能头文件_Dev c++ 支持bits/stdc++.h万能头文件吗