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()			#界面更新
#-------------------------------游戏主循环-----------------------------------#
相关推荐
Madison-No724 分钟前
搭建项目测试环境
linux·运维·服务器·python
计算机编程-吉哥1 小时前
YOLO26 vs YOLO11 vs YOLOv8:深度学习咖啡果实成熟度分割系统【计算机毕业设计选题推荐】
人工智能·python·深度学习·yolo·django·毕业设计
大衛說1 小时前
11 · 异常处理与日志
python
auto_go2 小时前
Python 实战指南(7)——账本动不动就崩?先把“魔法字符串”和“裸报错”干掉
python
Beyond_System|系统之外2 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
根目录下的猫2 小时前
RK3588适配的轻量级AI模型推荐
人工智能·后端·python·目标检测
wno7043 小时前
Spring Security权限控制
java·python·spring
ShineWinsu3 小时前
对于Coze—AI:SDK的解析
人工智能·python·ai·sdk·项目·coze·字节跳动
右耳朵猫AI4 小时前
Python周刊2026W38 | 标准流编码修复、PEP 845/846 草案、解析器提速 10%、集合字典二次复杂度
python·ai·数据科学
微软技术分享4 小时前
大模型网络结构:模型接口测试用例参考
python