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()			#界面更新
#-------------------------------游戏主循环-----------------------------------#
相关推荐
代码的乐趣14 分钟前
支持selenium的chrome driver更新到131.0.6778.204
chrome·python·selenium
又蓝39 分钟前
使用 Python 操作 Excel 表格
开发语言·python·excel
余~~185381628001 小时前
稳定的碰一碰发视频、碰一碰矩阵源码技术开发,支持OEM
开发语言·人工智能·python·音视频
0zxm1 小时前
06 - Django 视图view
网络·后端·python·django
ROBOT玲玉2 小时前
Milvus 中,FieldSchema 的 dim 参数和索引参数中的 “nlist“ 的区别
python·机器学习·numpy
Kai HVZ3 小时前
python爬虫----爬取视频实战
爬虫·python·音视频
古希腊掌管学习的神3 小时前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
m0_748244833 小时前
StarRocks 排查单副本表
大数据·数据库·python
B站计算机毕业设计超人3 小时前
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
大数据·人工智能·爬虫·python·机器学习·课程设计·数据可视化
路人甲ing..3 小时前
jupyter切换内核方法配置问题总结
chrome·python·jupyter