# 导入pygame模块
import random
import time
import pygame
import pygame.locals
# 抽取常量
WINDOW_WIDTH = 512 # 窗口宽度
WINDOW_HEIGHT = 768 # 窗口高度
ENEMY_WIDTH = 100 # 敌机宽度
ENEMY_HEIGHT = 68 # 敌机高度
PLAYER_WIDTH = 120 # 玩家飞机宽度
PLAYER_HEIGHT = 78 # 玩家飞机高度
BULLET_WIDTH = 20 # 子弹的宽度
BULLET_HEIGHT = 56 # 子弹的高度
# 创建全局变量
background_x = 0
background_y = 0
player_x = 200
player_y = 500
# 添加子弹的坐标数据
bullet_list = []
# 创建一个储存敌机数据的容器
# 使用列表推导式方式进行初始化
enemy_list = [
{'x': random.randint(0, WINDOW_WIDTH - ENEMY_WIDTH),
'y': -ENEMY_HEIGHT,
'speed': random.randint(2, 4),
'img_path': f'res/img-plane_{random.randint(1, 7)}.png'
} for i in range(5)
]
# 创建窗口
window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))
# 移动背景图片
def move_background():
"""可以滚动显示背景图片"""
# 如果想要在函数体内部修改全局变量的值,需要声明全局变量才可以
global background_y
global background_x
# 加载背景图片
background_img = pygame.image.load('res/img_bg_level_2.jpg')
# 让背景图片进行移动
window.blit(background_img, (background_x, background_y))
# 添加辅助背景
window.blit(background_img, (background_x, background_y - WINDOW_HEIGHT))
# 循环移动
if background_y >= WINDOW_HEIGHT:
background_y = 0
else:
background_y += 1
# 添加并移动敌机
def move_enemy(enemy_dict):
"""添加敌机并且移动敌机的函数"""
# 加载敌机图片
# 加载图片时,获取敌机字典中的图片路径进行加载
enemy_img = pygame.image.load(enemy_dict['img_path'])
# 在窗口上显示敌机
window.blit(enemy_img, (enemy_dict['x'], enemy_dict['y']))
# 移动敌机
if enemy_dict['y'] >= WINDOW_HEIGHT:
enemy_dict['y'] = -ENEMY_HEIGHT
# 每次进入屏幕时都会重置x的值
enemy_dict['x'] = random.randint(0, WINDOW_WIDTH - ENEMY_WIDTH)
# 每次重新进入屏幕时,重置速度值
enemy_dict['speed'] = random.randint(2, 4)
# 每次回到起始位置时重置自己的图片路径
enemy_dict['img_path'] = f'res/img-plane_{random.randint(1, 7)}.png'
else:
enemy_dict['y'] += enemy_dict['speed']
# 思考:判断敌机是否与子弹相撞,和判断子弹是否与敌机相撞有没有区别???
# 判断的方式是什么???? 在敌机中遍历子弹,或者在子弹中遍历敌机
# 敌机遍历子弹过程中,子弹有可能被删除,所以我们再子弹函数中遍历敌机更为稳妥
# 在让子弹移动的函数中一定要遍历每一粒子弹,在贴图敌机时,也要遍历每一架敌机
# 如果想要让性能最佳,最好让子弹遍历敌机
# 其实理论上都可以
# 定义了玩家飞机添加和移动的函数
def move_player():
"""添加和移动玩家飞机的方法"""
# 使用global进行声明,获取全局变量中的x,y值
global player_x
global player_y
# 1. 获取玩家飞机的图片
player_img = pygame.image.load('res/hero2.png')
# 2. 将玩家飞机放置在窗口之上
window.blit(player_img, (player_x, player_y))
# 3.移动玩家飞机
position = pygame.mouse.get_pos()
player_x = position[0] - PLAYER_WIDTH / 2
player_y = position[1] - PLAYER_HEIGHT / 2 + 10
# 添加子弹,并且移动
def send_bullet(bullet_dict):
"""添加并发射子弹函数"""
# 1.将子弹的图片加载下来(使用大火箭图片)
bullet_img = pygame.image.load('res/bullet_8.png')
# 2.将子弹添加到屏幕当中
window.blit(bullet_img, (bullet_dict['x']+50, bullet_dict['y']))
# 3.移动子弹,让子弹向上移动
# 修改子弹的y值
bullet_dict['y'] -= 6
# 判断,如果当前的子弹已经飞出屏幕范围,则删除该子弹
# 在下方对子弹的间隔进行了修改,所以当前所有子弹的distance都是不同的
if bullet_dict['y'] <= -BULLET_HEIGHT:
bullet_list.remove(bullet_dict)
# 子弹超出屏幕范围时,则不判断其是否相撞
return
# TODO: 所以我们需要在子弹移动方法中,判断是否与敌机碰撞了
# 1.获取当前子弹的矩形范围
bullet_rect = pygame.locals.Rect(bullet_dict['x'], bullet_dict['y'],BULLET_WIDTH, BULLET_HEIGHT)
# 2.遍历敌机,获取每一架敌机的矩形范围
for enemy in enemy_list:
enemy_rect = pygame.locals.Rect(enemy['x'], enemy['y'], ENEMY_WIDTH, ENEMY_HEIGHT)
# 3.用子弹的矩形范围,和敌机的矩形范围进行比对
if pygame.Rect.colliderect(bullet_rect, enemy_rect):
# 4.如果碰撞,删除子弹,
# 子弹超出屏幕范围就要被清除了,可以不删除
bullet_list.remove(bullet_dict)
# 摧毁敌机(将敌机重置)
enemy['y'] = -ENEMY_HEIGHT
enemy['x'] = random.randint(0, WINDOW_WIDTH - ENEMY_WIDTH)
enemy['speed'] = random.randint(2, 4)
enemy['img_path'] = f'res/img-plane_{random.randint(1, 7)}.png'
break
# 获取窗口事件
def get_window_event():
"""获取所有的窗口事件,并且进行处理"""
for event in pygame.event.get():
# 获取关闭窗口事件
if event.type == pygame.locals.QUIT:
exit('退出游戏')
# 监听鼠标的点击并且发射子弹
if pygame.mouse.get_pressed()[0]:
bullet_list.append({'x': player_x, 'y': player_y})
if __name__ == '__main__':
while True:
# 调用移动背景的函数
move_background()
# 调用添加子弹的函数
for bullet in bullet_list:
send_bullet(bullet)
# 调用添加和移动玩家飞机的函数
move_player()
# 如果想要添加多架敌机,要么在函数中进行循环,要么执行多次添加一架敌机的方法,我们选择后者
for enemy in enemy_list:
move_enemy(enemy)
# 刷新窗口内容的命令
pygame.display.update()
# 调用获取事件的方法
get_window_event()
Token_w
- 粉丝: 1w+
- 资源: 4
最新资源
- 网络搭建练习题.pkt
- 搜索引擎soler的相关介绍 从事搜索行业程序研发、人工智能、存储等技术人员和企业
- 搜索引擎lucen的相关介绍 从事搜索行业程序研发、人工智能、存储等技术人员和企业
- 基于opencv-dnn和一些超过330 FPS的npu
- 房屋租赁管理系统 java项目ssm框架开发,全套视频教程
- MATLAB代码:计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度 关键词:碳捕集 电厂 需求响应 优化调度 电转气协同调度 参考文档:《计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度》完全复现
- 关键词:微网 优化调度 深度强化学习 A3C 需求响应 编程语言:python平台 主题:基于改进A3C算法的微网优化调度与需求响应管理 内容简介: 代码主要做的是基于深度强化学习的微网
- web网页,三次平时作业+大作业+Acwing笔记
- cruise软件模型,混动仿真模型,IMMD架构混联混动仿真模型,Cruise混动仿真模型,混联混动汽车动力性经济性仿真 关于模型 1.本模型是基于IMMD架构搭载的混联混动仿真模型,关于IMMD架
- C#上位机开发源码 上位机项目源代码 采用基于RS485通讯总线的ModbusRtu协议,支持用户权限管理、sqlite数据库、实时曲线、历史曲线、历史报表、导出Excel、主界面布局可调带记忆等功能
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈