飞机大战项目(源代码(直接用),有效果图,素材包)
上个星期弄了好久的打飞机,折磨了我好久,其实上周末都已经做好了,整体的一些大功能已经实现,缺少的就是一些小功能,比如说选关啊,变身啊,超级炸弹啊,本来想加上去,但是又比较花费时间,主要以后我也没有想要去从事游戏这么方面的工作,但是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()
代码写的也比较乱,以后再慢慢整理吧,最近要整理的东西太多了。
下面给大家看看正常的飞机大战素材包:
各种飞机大战,雷霆战机,全民飞机大战的素材包,就等你们来了,心动不如行动,赶快留言吧。
飞机大战项目(源代码(直接用),有效果图,素材包)相关推荐
- python飞机大战程序导入_Python飞机大战项目的准备 导入Pygame最全攻略~
1.导入pygame 首先是导入pygame模块,下面介绍的是pycharm中导入 先建立一个项目 左上角File->Setting->project:飞机大战项目(你自己的文件名字)-& ...
- C++的学习心得和知识总结(十六)|基于EasyX实现小甲鱼Python飞机大战项目(C++版)
目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.小甲鱼Python项目 – 飞机大战 2.本文使用的掩码图生成工具 自动生成遮罩图的程序,点击前往 3.EasyX官方链 ...
- Python实现飞机大战-第二部分(附源码、素材、超详细教程)
飞机大战第二部分 1.前言 2.飞机射击 2.1.添加子弹的相关设置 2.2.创建文件bullet.py 2.3.修改game_functions.py 2.4.修改mian.py 2.5.射击效果 ...
- Python 游戏编程之实现飞机大战(含源代码)
点击上方蓝色小字,关注"涛哥聊Python" 重磅干货,第一时间送达 来自:CSDN,作者:逐梦er 链接:https://zhumenger.blog.csdn.net/arti ...
- Python 之 游戏飞机大战项目实现
项目实战 -- 飞机大战 目标 强化 面向对象 程序设计 体验使用 pygame 模块进行 游戏开发 实战步骤 pygame 快速体验 飞机大战 实战 确认模块 -- pygame pygame 就是 ...
- Python学习笔记(飞机大战项目练习)---B站黑马程序员
学习目标: 完整的一个小项目开发 提示:这里可以添加学习目标 例如: 一周Python入门项目实战知识 学习内容: 0 安装pygame 模块: PS C:\Users\tanyugen\Pychar ...
- pygame 制作飞机大战项目
我在码飞机大战的过程中许多都是参照书本做的,但是又许多不是按照书本做,我看了B站,看了这个论坛里一些大佬的作品,然后也融入了自己逊色的敲码水平,这个作品可以说是集大成.断断续续的学习了一年多也通过这个 ...
- [Unity3D]Unity3D游戏开发之飞机大战项目讲解
大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比较综合的 ...
- Python自学第二十一天——飞机大战项目实践(四)
作为新手自学Python的第二十一天,技术低微,希望可以通过这种方式督促自己学习. 个人学习环境:python3.9,PyCharm 2021.3.2 (Community Edition) 利用py ...
- 手把手教学,Python 游戏编程之实现飞机大战(含源代码)
文章目录 一.游戏设定 1.游戏界面展示和设定 二.实现过程 1.我方飞机 2.敌方飞机 3.定义武器 4.武器补充库 5.主模块 总结: 前言 我想大家都是有玩过类似飞机大战的射击类游戏,也享受目标 ...
最新文章
- nas servers
- SQL中跨服务器查询
- 使用完成端口监控文件目录的例子
- 截取全部数值字符并将其转化为数值类型
- c语言Wndproc未定义,为什么我的老是未定义
- 我的INI 配置文件读写动态库
- DebugDiag调试工具
- 20165203 实验一 Java开发环境的熟悉
- 飞腾腾锐 D2000 荣获数字中国“十大硬核科技”奖
- 计算机鼠标双击怎么,讲解电脑鼠标左键单击变双击怎么办
- 通信原理 简易AMI码与HDB3码编码方式比较的matlab实现
- 可用于近红外光谱数据分析的网上公开数据集
- C语言BMP图像的读取、存入、水平镜像、竖直镜像、马赛克模糊处理、灰度二值化处理
- 学习笔记——Exploiting Unintended Feature Leakage in Collaborative Learning(协作学习中的非预期特征泄露研究)
- 很有意思的几个考验知识广度的问题
- Win10将某个软件/文件添加到开始屏幕(磁贴)
- CF1603B Moderate Modular Mode
- 如何在HTML页面中编写大于号和小于号?(HTML实体)
- 联合概率,边际概率和条件概率
- [问题]mpu9250+bmp280数据读取
热门文章
- 如何根据项目进行PLC选型
- axure rp8学习回忆
- 微信支付之H5页面WAP端接入
- springboot毕设项目作业查重系统i667s(java+VUE+Mybatis+Maven+Mysql)
- NB-IOT平台之电信平台FOTA 升级记录
- windows win32 API大全
- python win32api键盘_Python win32api.keybd_event模拟键盘输入
- 2021年“泰迪杯”数据分析技能B题-肥料登记数据分析赛题
- 推荐5个优秀的Java开源项目,初学者友好
- dev万能头文件_Dev c++ 支持bits/stdc++.h万能头文件吗