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

文章目录:

一:运行效果

1.演示

2.思路和功能

二:代码

文件架构

Demo


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

一:运行效果

1.演示

效果图◕‿◕✌✌✌

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


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

博主提取资源: 提取

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 - ex
	b = by - ey
	return 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_over
	for 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 = True
				enemies.clear()
# ------------------------------------------------------------------#显示敌人
#-----------------------------------------------------------------------------------------------------------#敌人

#-----------------------------------------------------------------------------------------------------------#子弹
#------------------------------------------------------------------#子弹类
class Bullet():
	def __init__(self):
		# 画出子弹
		self.img = pygame.image.load('bullet.png')
		self.x = playerX + 16 #(64-32)/2
		self.y = playerY + 10					# 子弹出现在玩家的上方一点点
		# 子弹移动的速度
		self.step = 10

	#判断是否击中敌人
	def hit(self):
		global score
		for 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 playerX
	playerX += playerStep
	#防止飞机出界
	if playerX > 736:			#右边
		playerX = 736
	if 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 = 5
			elif event.key == pygame.K_LEFT:		# 左键
				playerStep = -5
			elif 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()			#界面更新
#-------------------------------游戏主循环-----------------------------------#
相关推荐
MATLAB代码顾问8 分钟前
5大智能算法优化标准测试函数对比(Python实现)
开发语言·python
ting945200012 分钟前
Tornado 全栈技术深度指南:从原理到实战
人工智能·python·架构·tornado
果汁华34 分钟前
Browserbase Skills:让 Claude Agent 真正“看见“网页世界
人工智能·python
ZhengEnCi35 分钟前
04-缩放点积注意力代码实现 💻
人工智能·python
DeepReinforce1 小时前
三、AI量化投资:使用akshare获取A股主板20260430所有的涨停股票
python·量化·akshare·龙头战法
段一凡-华北理工大学2 小时前
【高炉炼铁领域炉温监测、预警、调控智能体设计与应用】~系列文章08:多模态数据融合:让数据更聪明
人工智能·python·高炉炼铁·ai赋能·工业智能体·高炉炉温
万粉变现经纪人2 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
其实防守也摸鱼2 小时前
CTF密码学综合教学指南--第五章
开发语言·网络·笔记·python·安全·网络安全·密码学
callJJ3 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
小郑加油3 小时前
python学习Day12:pandas安装与实际运用
开发语言·python·学习