当前位置: 首页 > news >正文

Python利用pygame实现飞机大战游戏

文章目录:

一:运行效果

1.演示

2.思路和功能

二:代码

文件架构

Demo


必备知识:python图形化编程pygame游戏模块

一:运行效果

1.演示

效果图◕‿◕✌✌✌

Python利用pygame实现飞机大战游戏运行演示


参考:【Python游戏】1小时开发飞机大战游戏-Pygame版本(1小时40分钟)

博主提取资源: 提取码  p6mk

2.思路和功能

通过方向键移动飞机,按空格键射出子弹,击毁迎面而来的敌机获取积分在主循环内调用封装的函数对象

二:代码

文件架构

Demo

import pygame		#pip install pygame
import random		#随机
import math 		#引入数学模块#------------------------------------------------------------------#初始化界面
pygame.init()
screen = pygame.display.set_mode((800, 600))		#屏幕宽和高
pygame.display.set_caption('飞机大战')				#设置标题
# 引入UFO游戏左上角的游戏图标图片
icon = pygame.image.load('ufo.png')					#外部加载图像
pygame.display.set_icon(icon)						#设置左上角的游戏图标,图标尺寸大小为32*32
# 背景图片
bgImg = pygame.image.load('bg.png')
#------------------------------------------------------------------#初始化界面#------------------------------------------------------------------#添加音乐音效
#背景音乐
pygame.mixer.music.load('bg.wav')
pygame.mixer.music.play(-1) #单曲循环
#射中音效
bao_sound = pygame.mixer.Sound('exp.wav')
#------------------------------------------------------------------#添加音乐音效#------------------------------------------------------------------#引入飞机图片
playerImg = pygame.image.load('player.png')
playerX = 400 	#玩家的X坐标
playerY = 500 	#玩家的Y坐标
playerStep = 0 	#玩家移动的速度
#------------------------------------------------------------------#引入飞机图片#------------------------------------------------------------------#分数
# 初始化分数
score = 0
# 字体	自带的
font = pygame.font.Font('freesansbold.ttf', 32)
#font = pygame.font.SysFont('simsunnsimsun',32) #宋体# 显示分数
def show_score():text = f'Score: {score}'# 渲染文本的 Surface 对象score_render = font.render(text, True, (255,0,0))# 将一个图像(Surface 对象)绘制到另一个图像上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"# 渲染文本的 Surface 对象render = over_font.render(text, True, (255,0,0))# 将一个图像(Surface 对象)绘制到另一个图像上screen.blit(render, (200,250))
#------------------------------------------------------------------#游戏结束#------------------------------------------------------------------#两个点之间的距离
def distance(bx, by, ex, ey):a = bx - exb = by - eyreturn math.sqrt(a*a + b*b) #开根号
#------------------------------------------------------------------#两个点之间的距#-----------------------------------------------------------------------------------------------------------#敌人
#初始化敌人的数量
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, 250)# 敌人移动的速度self.step = random.randint(2, 6)#重置位置:当被射中时,恢复位置def reset(self):self.x = random.randint(200, 600)self.y = random.randint(50, 200)
#------------------------------------------------------------------#敌人类#保存所有的敌人
enemies = []
for i in range(number_of_enemies):enemies.append(Enemy())		#调用敌人类Enemy()#------------------------------------------------------------------#显示敌人
def show_enemy():global is_overfor 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 += 40# 判断游戏是否结束if e.y > 450:# 显示结束状态	print("游戏结束啦")is_over = Trueenemies.clear()
# ------------------------------------------------------------------#显示敌人
#-----------------------------------------------------------------------------------------------------------#敌人#-----------------------------------------------------------------------------------------------------------#子弹
#------------------------------------------------------------------#子弹类
class Bullet():def __init__(self):# 画出子弹self.img = pygame.image.load('bullet.png')self.x = playerX + 16 #(64-32)/2self.y = playerY + 10					# 子弹出现在玩家的上方一点点# 子弹移动的速度self.step = 10#判断是否击中敌人def hit(self):global scorefor e in enemies:if(distance(self.x, self.y, e.x, e.y) < 30):		#子弹和敌人位置较近#射中啦bao_sound.play()		# 射中音效bullets.remove(self)	# 移除该子弹e.reset()				# 调用重置位置函数reset()#添加分数score += 1
#保存现有的子弹
bullets = []
#------------------------------------------------------------------#子弹类#------------------------------------------------------------------#显示并移动子弹
def show_bullets():for b in bullets:# 显示图片到什么地方screen.blit(b.img, (b.x, b.y))# 看看是否击中了敌人:调用hit()函数b.hit()# 移动子弹:向上b.y -= b.step#判断子弹是否出了界面,如果出了就移除掉if b.y < 0:bullets.remove(b)
#------------------------------------------------------------------#显示并移动子弹
#-----------------------------------------------------------------------------------------------------------#子弹#------------------------------------------------------------------#移动飞机防止飞机出界
def move_player():global playerXplayerX += playerStep#防止飞机出界if playerX > 736:			#右边playerX = 736if playerX < 0:				#左边playerX = 0
#------------------------------------------------------------------#移动飞机防止飞机出界#-------------------------------游戏主循环-----------------------------------#
running = True
while running:# 画出背景渲染到屏幕screen.blit(bgImg,(0,0))					# 导入背景图片# 显示分数:调用show_score()# 返回当前的所有事件for event in pygame.event.get():if event.type == pygame.QUIT:				# 退出running = False#通过键盘事件控制飞机的移动if event.type == pygame.KEYDOWN: 			# 按下就移动if event.key == pygame.K_RIGHT:			# 右键playerStep = 5elif event.key == pygame.K_LEFT:		# 左键playerStep = -5elif event.key == pygame.K_SPACE:		# 空格#创建一颗子弹bullets.append(Bullet())			# 调用子弹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()			#界面更新
#-------------------------------游戏主循环-----------------------------------#

相关文章:

  • node.js快速入门-day03
  • 使用ansible批量修改操作系统管理员账号密码
  • 内网横向1
  • Pytorch:torch.cuda.empty_cache()
  • uniapp 开发微信小程序 出现启用组件按需注入问题如何解决
  • 基于Springboot的防疫物资管理信息系统(有报告)。Javaee项目,springboot项目。
  • 【论文阅读】Masked Autoencoders Are Scalable Vision Learners
  • Docker常用命令!!!
  • 九.pandas绘图基础
  • Python基础----数据容器(持续更新中)
  • QGIS编译(跨平台编译)056:PDAL编译(Windows、Linux、MacOS环境下编译)
  • Learn OpenGL 19 几何着色器
  • java 通过 IMetaStoreClient 取 hive 元数据信息
  • 基于ArcGIS等多技术融合提升环境、生态、水文、土地、农业、大气等领域科研技术应用
  • Spring底层核心原理解析
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【node学习】协程
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【前端学习】-粗谈选择器
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • django开发-定时任务的使用
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Iterator 和 for...of 循环
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript设计模式系列一:工厂模式
  • Java多线程(4):使用线程池执行定时任务
  • rabbitmq延迟消息示例
  • vue-cli3搭建项目
  • 技术胖1-4季视频复习— (看视频笔记)
  • 离散点最小(凸)包围边界查找
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 运行时添加log4j2的appender
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • (多级缓存)多级缓存
  • (考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (新)网络工程师考点串讲与真题详解
  • (转)德国人的记事本
  • (转)原始图像数据和PDF中的图像数据
  • .form文件_SSM框架文件上传篇
  • .Net - 类的介绍
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .net反混淆脱壳工具de4dot的使用
  • .net分布式压力测试工具(Beetle.DT)
  • .NET学习教程二——.net基础定义+VS常用设置
  • .NET应用架构设计:原则、模式与实践 目录预览
  • []T 还是 []*T, 这是一个问题
  • [1127]图形打印 sdutOJ
  • [Android Studio] 开发Java 程序
  • [Android] Android ActivityManager
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [BZOJ5250][九省联考2018]秘密袭击(DP)
  • [C++] Windows中字符串函数的种类