回忆童年游戏,完美利用Python制作飞机大战(爷青回~)

news2024/11/26 16:33:57

名字:阿玥的小东东

学习:python、C/C++

博客链接:阿玥的小东东的博客_CSDN博客-python&&c++高级知识,过年必备,C/C++知识讲解领域博主

目录

pygame包的安装

添加python环境变量

创建飞机大战窗口

飞机照片

将变量及函数抽取出来

添加多架敌机

本期推荐赠书

小结


今天制作一个大家肯定都玩过的游戏:飞机大战

游戏玩法:玩家操控一架飞机,开始时处于窗口的中下方位置
玩家飞机位置会随鼠标位置移动。
单击鼠标可让玩家飞机发射子弹。
屏幕上方不断出现敌方飞机并向下移动。
如果玩家的子弹打到敌方飞机,则敌方飞机被清除

pygame包的安装

  • 第一种方式:File —> Setting—> Project:工程名—>Python interpret–> 到解释器模块列表下方的+点击—>查询要安装的模块—>点击底下的 Install Package
  • 第二种方式:点击pycharm底下的terminal 打开终端,使用pip list 查看解释器的模块列表,如果有pygame就证明已将安装成功了,如果没有,就输入pip install pygame 进行安装
  • 注意:如果警告pip不是最新版本,不用管他

添加python环境变量

​不是内部或外部命令,也不是可运行的程序 或批处理文件。​​(没有在安装解释器时勾选add to path)

  • 手动添加环境变量流程:
  • 在此电脑中右键点击属性
  • 在属性中选择高级系统设置
  • 点击环境变量按钮
  • 在系统环境变量中双击 Path
  • 找到你的解释器所在的文件夹:(可以使用全局搜索找到python.exe文件)
  • 点击新建,将路径添加到环境变量中
  • 然后找到python.exe所在路径下的Script目录,继续将路径添加到环境变量中
  • 测试 python 和pip 能否正常使用(如果是在终端中执行,需要将终端重启后环境变量才会生效)

创建飞机大战窗口

再刷新窗口时,也要不断获取用户的操作信息,如果我们想要获取可以使用evnet
    获取所有的窗口事件(事件就是用户做出的操作)
    当前方法的返回值是一个列表,内部获取了所有的窗口事件(用户的点击,鼠标移动,关闭按钮的点击等)
    我们可以根据不同的事件做出不同的反馈例如QUIT 可以退出程序

# 创建窗口
window = pygame.display.set_mode((512, 768))

# 为了让窗口不会立即关闭,而是等待我们的操作,需要循环刷新窗口
while True:
    # 刷新窗口内容的命令
    pygame.display.update()
 
    # print(pygame.event.get())
    for event in pygame.event.get():
        if event.type == pygame.locals.QUIT:
            exit('退出游戏')

飞机照片

你自己去找去!!

将变量及函数抽取出来

# TODO: 抽取常量和变量
# 思考: 变量是统一管理更为方便还是分散管理方便?? 统一管理
# 在代码中出现的数字有没有单位,比如  apples = 5 此时显示的是重量还是个数???  不清楚
# 为了增加代码的可读性,尽量减少程序中出现的魔法数字,可以将魔法数字提取出来作为常量出现.
# 在编程中,一般不可以被修改的变量叫做常量,Python中本身是没有常量的,所以我们使用标识符大写来备注常量
# 但是这个常量可以被修改,只是提醒协同人员或调用模块的人这个是一个常量而已

# 导入pygame模块
import pygame
import pygame.locals


# 抽取常量
WINDOW_WIDTH = 512  # 窗口宽度
WINDOW_HEIGHT = 768  # 窗口高度

# 创建全局变量
background_x = 0
background_y = 0

# 创建窗口
# window = pygame.display.set_mode((512, 768))
window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))

# # 加载背景图片
# background_img = pygame.image.load('res/img_bg_level_2.jpg')
# # 将图片添加到窗口中
# window.blit(background_img, (0, 0))

# TODO: 抽取函数
# 函数一般就是一个特定的功能,完整的功能保存到函数中进行调用即可

# 移动背景图片
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 get_window_event():
    """获取所有的窗口事件,并且进行处理"""
    # 获取关闭窗口事件
    for event in pygame.event.get():
        if event.type == pygame.locals.QUIT:
            exit('退出游戏')


while True:
    # # 让背景图片进行移动
    # 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
    # TODO: 调用移动背景的方法
    move_background()

    # 刷新窗口内容的命令
    pygame.display.update()
    # 获取关闭窗口事件
    # for event in pygame.event.get():
    #     if event.type == pygame.locals.QUIT:
    #         exit('退出游戏')
    # TODO: 调用获取事件的方法
    get_window_event()

添加多架敌机

    # 移动敌机
    # 为了让敌机有一个俯冲的效果,所以让敌机移动速度大于背景图片的移动速度
    # enemy_y += 2
    # 当敌机移动到屏幕之外我们就不需要再去显示他了,为了让敌机变量复用
    # 当敌机超出屏幕范围时,将敌机恢复原位(如果我们想让敌机有一个进入到屏幕的效果,
    # 我们需要将敌机的初始位置设置到屏幕外边,此时初始位置左边y值应该为负的敌机的高度)

# 导入pygame模块
import random

import pygame
import pygame.locals

# 抽取常量
WINDOW_WIDTH = 512  # 窗口宽度
WINDOW_HEIGHT = 768  # 窗口高度

ENEMY_WIDTH = 100  # 敌机宽度
ENEMY_HEIGHT = 68  # 敌机高度

# 创建全局变量
background_x = 0
background_y = 0



# 创建窗口
window = pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT))


# TODO: 初始化敌机的函数
def init_enemy_list():
    global enemy_list
    # 循环多少次就有多少架敌机
    for i in range(5):
        enemy_list.append(
            {'x': random.randint(0, WINDOW_WIDTH - ENEMY_WIDTH),
             'y': -ENEMY_HEIGHT,
             'speed': random.randint(2, 4)
             }
        )


# 移动背景图片
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


# 添加并移动敌机
# TODO: 将每一架敌机数据组成的字典传递进来
# TODO: 将所有的敌机的x,y,speed 用字典中的数据进行替换
def move_enemy(enemy_dict):
    """添加敌机并且移动敌机的函数"""
    # 声明全局变量
    # global enemy_x
    # global enemy_y
    # global enemy_speed
    # 加载敌机图片
    # TODO: 随机加载飞机图片
    # 如果想要随机加载敌机图片,就对敌机的路径进行随机从plane1- plane7
    # 课下感兴趣的同学自己完成
    enemy_img = pygame.image.load('res/img-plane_1.png')
    # 在窗口上显示敌机
    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)
    else:
        enemy_dict['y'] += enemy_dict['speed']
    # 思考如果每次敌机都从一个位置出现未免太过死板游戏过于简单,所以要将敌机出现的位置x坐标设置为随机值


# 获取窗口事件
def get_window_event():
    """获取所有的窗口事件,并且进行处理"""
    for event in pygame.event.get():
        # 获取关闭窗口事件
        if event.type == pygame.locals.QUIT:
            exit('退出游戏')


if __name__ == '__main__':
    # TODO: 调用函数初始化敌机数据
    init_enemy_list()
    while True:
        # 调用移动背景的方法
        move_background()
        # TODO: 如果想要添加多架敌机,要么在函数中进行循环,要么执行多次添加一架敌机的方法,我们选择后者
        for enemy in enemy_list:
            move_enemy(enemy)
        # 刷新窗口内容的命令
        pygame.display.update()
        # 调用获取事件的方法
        get_window_event()


本期推荐赠书

Python从入门到精通

参与方式:点赞+关注+评论:人生苦短,我用Python!(否则无效)

截止时间:6月16日晚上20:00

《Python从入门到精通(微课精编版)》使用通俗易懂的语言、丰富的案例,详细介绍了Python语言的编程知识和应用技巧。全书共24章,内容包括Python开发环境、变量和数据类型、表达式、程序结构、序列、字典和集合、字符串、正则表达式、函数、类、模块、异常处理和程序调试、进程和线程、文件操作、数据库操作、图形界面编程、网络编程、Web编程、网络爬虫、数据处理等,还详细介绍了多个综合实战项目。其中,第24章为扩展项目在线开发,是一章纯线上内容。全书结构完整,知识点与示例相结合,并配有案例实战,可操作性强,示例源代码大都给出详细注释,读者可轻松学习,快速上手。本书采用O2O教学模式,线下与线上协同,以纸质内容为基础,同时拓展更多超值的线上内容,读者使用手机微信扫一扫即可快速阅读,拓展知识,开阔视野,获取超额实战体验。 

小结

在本章中,我们学习了Python中用来开发游戏的 pygame模块,了解了2D游戏的常见代码逻辑并演示了如何开发一个“飞机大战”游戏。在此游戏中,我们用到了之前学习过的知识,如条件判断、循环、列表、函数、模块、面向对象等,也学习了 pygame 开发时的主循环、事件响应等写法可以说是对Python基础知识的一次综合运用。
 

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

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

相关文章

LeetCode:31. 下一个排列

31. 下一个排列 1)题目2)思路3)代码4)结果 1)题目 整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。 例如,arr [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1…

Nacos负载均衡策略

文章目录 按权重分配流量负载均衡自定义负载均衡策略 按权重分配流量负载均衡 SpringCloud新版本(2021.x.x)中负载均衡器用LoadBalancer替代了Ribbon,默认只提供了2种负载均衡策略:RandomLoadBalancer 和 RoundRobinLoadBalancer。…

[冷冻电镜]IMOD使用指南

参考教程: Etomo Tuturial for IMOD version 4.11 1. Initial Setup 本教程提供了一个小双轴示例数据集和Etomo的分布指南,更详细的内容参考Tomography Guide。该版本使用1k*1k的图像而不是压缩版本。imodhelp命令可以打开帮助界面,查看各种…

java并发之CAS(Compare and swap)

1. 简介 CAS的底层调用native方法,最终是利用CPU的一个特殊指令,该指令由CPU保证了原子性,而且包含多个操作,比如先比较再更新。 原理: (1)需要读写的内存值(V)、原值…

【Kafka】Docker安装kafkajava kafka api

内容目录 一、安装zookeeper1 拉取镜像2 创建network3 启动容器 二、安装kafka1 拉取kafka镜像2 启动kafka容器3 创建topic4 创建生产者5 创建消费者 三、kafka的java api1 producer2 消费者 docker依赖于zookeeper,首先安装zookeeper 一、安装zookeeper 1 拉取镜像…

[PyTorch][chapter 40][数据增强]

前言: 深度学习对数据量要求非常大, 我们通常会遇到图像的数据集比较小,影响Train效果。 这个时候可以通过transformer 方法,增加图像的多样性,达到数据 增强的效果。 transformer 不会单独使用,通常和其它torch 其他类一起使用 transformer 常用方法…

可视管理 数字孪生智慧隧道一体化管控平台

前言 交通是国家发展的关键,四通八达的交通路线,对国家经济、社会等方面的发展起着至关重要的作用。 建设背景 随着社会经济的持续发展与城市化进程的平稳推进,我国公路工程规模逐步扩大,公路工程建设直接影响着城市未来发展与…

Vue 报错 error:0308010C:digital envelope routines::unsupported

症状 Vue 报错error:0308010C:digital envelope routines::unsupported 原因 出现这个错误是因为 node.js V17版本中最近发布的OpenSSL3.0, 而OpenSSL3.0对允许算法和密钥大小增加了严格的限制,可能会对生态系统造成一些影响. 解决方法 方法1 打开终端&#x…

React 应用 Effect Hook 函数式中操作生命周期

React Hook入门小案例 在函数式组件中使用state响应式数据给大家演示了最简单的 Hook操作 那么 我们继续 首先 Hook官方介绍 他没有破坏性是完全可选的 百分比兼容 也就说 我们一起的 类 class的方式也完全可以用 只要 react 16,8以上就可以使用 Hook本身不会影响你的react的理…

ESXi 7.0 U3m Hitachi (日立) 定制版 OEM Custom Installer CD

VMware ESXi 7.0 Update 3m - 领先的裸机 Hypervisor (All OEM Customized Installer CDs) ESXi 7.0 U3m Standard (标准版) ESXi 7.0 U3m Dell (戴尔) 定制版 OEM Custom Installer CD ESXi 7.0 U3m HPE (慧与) 定制版 OEM Custom Installer CD ESXi 7.0 U3m Lenovo (联想) 定…

4.单表查询

SQL句子中语法格式提示: 1.中括号([])中的内容为可选项; 2.[,...]表示,前面的内容可重复; 3.大括号({})和竖线(|)表示选择项,在选择…

chatgpt赋能python:Python怎么导入第三方库

Python怎么导入第三方库 如果你是Python开发者,你一定会使用各种第三方库来加速你的开发过程。这些库可能是Python标准库之外的代码,或由其他人编写的自定义代码。使用这些库可以让你的开发更高效、更易于管理,并且可以避免重复造轮子。 但…

RabbitMQ虚拟主机无法启动的原因和解决方案

RabbitMQ虚拟主机无法启动的原因和解决方案 摘要: RabbitMQ是一个广泛使用的开源消息代理系统,但在使用过程中可能会遇到虚拟主机无法启动的问题。本文将探讨可能导致该问题的原因,并提供相应的解决方案,以帮助读者解决RabbitMQ虚…

Learning C++ No.31 【线程库实战】

引言: 北京时间:2023/6/11/14:40,实训课中,实训场地有空调,除了凳子坐着不舒服之外,其它条件都挺好,主要是我带上了我自己的小键盘,并且教室可以充电,哈哈哈&#xff0c…

在做自动化测试之前你需要知道的

B站视频教程:Python自动化测试:7天练完这60个实战项目,年薪过35w。 什么是自动化测试? 做测试好几年了,真正学习和实践自动化测试一年,自我感觉这一个年中收获许多。一直想动笔写一篇文章分享自动化测试实践…

信息系统管理工程师-学习笔记1-信息化知识

考点1 信息与信息系统 信息的概念 信息的定义: 是有别与物质与能量的第三种东西,是对事物运动状态或存在方式的不确定行的描述 信息是按特定方式组织在一起的客体属性的集合,具有超出这些客体属性本身之外的价值两层次 1.本体论层次 : 纯客观的层次,只与客体本身的因素有关,与主…

python cv2的一些操作,如膨胀,画线,滤波等

目录 0. cv2简介1. 打开摄像头2. 画图,画线3. 滤波4. 获取角点5. 梯度边缘6. 图形匹配7. 形态学变化-膨胀腐蚀8. 二值化阈值10. 总结 0. cv2简介 在这里先简单介绍一下cv2吧。 cv2 是 OpenCV Python 库的主要模块,提供了许多图像处理和计算机视觉方面的函数和工具。…

vue2组件通信

父传子 传递静态或动态 Prop <!-- 传入静态值 --> <blog-post title"hai hai hai"></blog-post><!-- 传入变量值 --> <blog-post :title"info.title"></blog-post>传入一个对象的所有 property 数据 post: {id: 1…

进程管道:popen函数实例

基础知识 可能最简单的在两个程序之间传递数据的方法就是使用popen和pclose函数了。它们的原型如下所示&#xff1a; #include <stdio.h>FILE *popen(const char *command, const char *type);int pclose(FILE *stream); 1&#xff0e;popen函数 popen函数允许一个程…

因为Json,controller方法单参数 导致脑袋短路

对于单参数方法&#xff0c; 一直喜欢用parameter方式。今天不知道为啥&#xff0c;就想用Json方式&#xff0c;然后无法直接传递。各种自我怀疑&#xff0c;然后尝试。 突然醒悟过来&#xff0c;Json方式是key/value模式&#xff0c;单参数String类型&#xff0c;没有key。必…