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()			#界面更新
#-------------------------------游戏主循环-----------------------------------#

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/759550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AMPQ和rabbitMQ

RabbitMQ 的 Channel、Connection、Queue 和 Exchange 都是按照 AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;标准实现的。 AMPQ的网络部分 AMQP没有使用HTTP&#xff0c;使用TCP自己实现了应用层协议。 AMQP实现了自己特有的网络帧格式。 一个Connection…

[网鼎杯 2020 朱雀组]Think Java

[网鼎杯 2020 朱雀组]Think Java swagger [[swagger]] 首先下载源码&#xff0c;查看之后发现 查找swagger资料&#xff0c;或者扫描&#xff0c;得到&#xff1a;swagger-ui.html swagger-ui 提供了一个可视化的UI页面展示描述文件。接口的调用方、测试、项目经理等都可以…

[激光原理与应用-76]:光束指向性与影响因素

目录 一、光束指向性 1.1 概述 2.2 光束指向性与光斑大小的区别 2.3 光束指向性与时间的关系 二、激光器的光束指向性的测量方法 2.1 概述 2.2 计算方法 三、激光器中影响光束指向性的因素 一、光束指向性 1.1 概述 光束指向性是指光束传播方向的特性&#xff0c;也可…

【Linux】进程通信

目录 一、管道通信 二、共享内存 三、消息队列 一、管道通信 管道是由操作系统维护的一个文件&#xff0c;管道通信的本质就是将管道文件作为临界资源&#xff0c;实现不同进程之间的数据读写&#xff0c;但是管道只允许父子进程或者兄弟进程之间的通信。 管道文件本身是全…

刷题DAY29 | LeetCode 491-递增子序列 46-全排列 47-全排列 II

491 递增子序列&#xff08;medium&#xff09; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;也…

开放签开源电子签章白皮书-简版

开放签开源电子签章白皮书-简版 一、摘要&#xff1a; 开放签电子签章团队源自于电子合同SaaS公司&#xff0c;立志于通过开源、开放的模式&#xff0c;结合团队十多年的行业经验&#xff0c;将电子签章产品更简单、更低门槛的推广到各行各业中。让电子签章应用更简单&#x…

Fetch、Axios 和 jQuery(Ajax) 三种常用的网络请求技术

Fetch、Axios 和 jQuery(Ajax) 是三种常用的网络请求技术&#xff0c;它们各自有着不同的特点和优势。本文将对这三种技术进行详细的介绍和比较&#xff0c;以帮助开发者更好地选择和使用合适的网络请求技术。 一、Fetch Fetch(浏览器自带) 是一种现代的网络请求 API&#xff…

Vue3组件的注册

组件是Vue.js中的一个重要概念&#xff0c;它是一种抽象&#xff0c;是一个可以复用的Vue.js实例。它拥有独一无二的组件名称&#xff0c;可以扩展HTML元素&#xff0c;以组件名称的方式作为自定义的HTML标签。 在大多数系统网页中&#xff0c;网页都包含header、body、footer…

Debezium vs OGG vs Tapdata:如何实时同步 Oracle 数据到 Kafka 消息队列?

随着信息时代的蓬勃发展&#xff0c;企业对实时数据处理的需求逐渐成为推动业务创新和发展的重要驱动力。在这个快速变化的环境中&#xff0c;许多企业选择将 Oracle 数据库同步到 Kafka&#xff0c;以满足日益增长的实时数据处理需求。本文将深入探讨这一趋势的背后原因&#…

数学建模(熵权法 python代码 例子)

目录 介绍&#xff1a; 模板&#xff1a; 例子&#xff1a;择偶 极小型指标转化为极大型&#xff08;正向化&#xff09;&#xff1a; 中间型指标转为极大型&#xff08;正向化&#xff09;&#xff1a; 区间型指标转为极大型&#xff08;正向化&#xff09;&#xff1a…

基于BusyBox的imx6ull移植sqlite3到ARM板子上

1.官网下载源码 https://www.sqlite.org/download.html 下载源码解压到本地的linux环境下 2.解压并创建install文件夹 3.使用命令行配置 在解压的文件夹下打开终端&#xff0c;然后输入以下内容&#xff0c;其中arm-linux-gnueabihf是自己的交叉编译器【自己替换】 ./config…

PyTorch 深度学习(GPT 重译)(三)

六、使用神经网络拟合数据 本章内容包括 与线性模型相比&#xff0c;非线性激活函数是关键区别 使用 PyTorch 的nn模块 使用神经网络解决线性拟合问题 到目前为止&#xff0c;我们已经仔细研究了线性模型如何学习以及如何在 PyTorch 中实现这一点。我们专注于一个非常简单…

拷贝他人maven仓库jar包到自己本地仓库,加载maven依然提示无法下载对应依赖

所遇问题&#xff1a; 拷贝他人maven仓库jar包到自己本地maven仓库repository下的对应依赖位置&#xff0c;重新加载idea的maven依然提示无法下载对应依赖。 解决办法&#xff1a; 在maven->repository找到对应报错依赖路径&#xff0c;删除xxx.repositories 和 xxx.lastU…

【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结

【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结 模糊图像增强技术之去噪声类滤波场景应用小结—【蘇小沐】 文章目录 【视频图像取证篇】模糊图像增强技术之去噪声类滤波场景应用小结&#xff08;一&#xff09;去噪声类滤波器1、去块滤波器&#xff08;Deblo…

32.768K晶振X1A000141000300适用于无人驾驶汽车电子设备

科技的发展带动电子元器件的发展电子元器件-“晶振”为现代的科技带来了巨大的贡献&#xff0c;用小小的身体发挥着大大的能量。 近两年无人驾驶汽车热度很高&#xff0c;不少汽车巨头都已入局。但这项技术的难度不小&#xff0c;相信在未来几年里&#xff0c;无人驾驶汽车这项…

软考高级:软件架构风格-独立构件风格概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

MySQL 索引的分类和优化

​ 优质博文&#xff1a;IT-BLOG-CN 索引是什么 &#xff1a; MySQL 官方对索引的定义&#xff1a;索引&#xff08;Index&#xff09;是帮助 MySQL 高效获取数据的数据结构。可以得到索引的本质&#xff1a;索引是数据结构。索引的目的在于提高查询效率。可以简单理解为&#…

力扣爆刷第101天之hot100五连刷91-95

力扣爆刷第101天之hot100五连刷91-95 文章目录 力扣爆刷第101天之hot100五连刷91-95一、62. 不同路径二、64. 最小路径和三、5. 最长回文子串四、1143. 最长公共子序列五、72. 编辑距离 一、62. 不同路径 题目链接&#xff1a;https://leetcode.cn/problems/unique-paths/desc…

实现防抖函数并支持第一次立刻执行(vue3 + ts环境演示)

1、先看一效果&#xff1a; 2、实现思路&#xff1a; 使用定时器setTimeout和闭包实现常规防抖功能&#xff1b;增加immediate字段控制第一次是否执行一次函数&#xff08;true or false&#xff09;&#xff1b;增加一个flag标识&#xff0c;在第一次执行时&#xff0c;将标…

【go从入门到精通】for循环控制

前言 Go 语言提供了 for 循环语句&#xff0c;用于重复执行一段程序逻辑&#xff0c;直到循环条件不再满足时终止。 循环可以用于迭代各种数据结构&#xff08;例如切片、数组、映射或字符串&#xff09;中的元素 本文将很基础的for循环语法&#xff0c;循环嵌套&#…