python3 飞机大战游戏开发历程

一、先安装pygame,我自己的系统是windows10,在cmd命令行下执行如下命令:

python -m pip install --user pygame

注意:python用如下命令安装软件包:

python -m pip install <package_name>

此时安装的软件包名字是pygame。

二、开发游戏需要的一些函数

#导入pygame模块
import pygame  #导入pygame模块#导入sys库,里面有能够结束python解释器的exit()函数
import sys     #导入sys模块,这个模块中有可以关闭窗口的函数#初始化pygame
pygame.init()  #初始化pygame(初始化pygame的背景设置),使得pygame能正确地工作#pygame.init()是Pygame库中的一个重要函数,用于初始化Pygame模块,以便后续能够正常使用Pygame提供的各种功能。#创建游戏窗口
screen = pygame.display.set_mode((width,height))  #创建一个名(窗口的名字,不是窗口上显示的名字)为screen,大小为(width,height)的窗口,创建的窗口必须用动画循环去绘制,不然窗口闪烁以下就自己关闭
了。#设置背景颜色
screen.fill(bg_color)  #bg_color表示背景色,是一个颜色元组,颜色字符串或者十六进制颜色颜色代码
例如:bg_color = 'green',bg_color = '#ff0000' bg_color = (230,230,230)——3个数字越小,颜色越深,数字越大,颜色越亮.#设置窗口(游戏)标题
pygame.display.set_caption("title") #设置游戏标题#或者游戏事件列表
pygame.event.get() #​pygame.event.get() 是 Pygame 库中的一个函数,用于从事件队列中获取所有待处理的事件并返回一个事件列表。例如:如果玩家单击游戏窗口的关闭按钮时,将检测到pygame.QUIT事件.
1.如果按下了窗口的“关闭”按钮,那么event.type == pygame.QUIT#(瞬时地)更新游戏实时画面
pygame.display.flip() #(极短的时间内)更新游戏屏幕,显示游戏的实时画面,从而制造出动画效果,如果想一直更新屏幕,那么需要把这句代码放在while True(即无限循环中),事实上,通常也是先创建游戏的窗口,设置标题,紧接着把这句代码放在无限循环中。然后把他们一起放在一个模块内。#退出python解释器
sys.exit()  #在python中,sys.exit() 函数用于退出程序。当调用 sys.exit() 函数时,Python 解释器将会立即退出程序,并返回一个状态码。
​

三、一些概念

(一)surface

(surface的概念部分转载自下面的博客)

Pygame库中Surface 对象介绍_pygame.surface-CSDN博客

surface:Pygame库中Surface 对象

        在Pygame库中,Surface 对象是一个非常核心的概念,它代表了一个二维的矩形画布,可以在上面绘制图像、图形、文本等内容。每个 Surface 都有自己的像素格式和尺寸,它们可以被用来表示游戏中的任何可见元素,比如背景、角色、物品等。

创建Surface对象

你可以通过多种方式创建一个 Surface 对象:

通过 pygame.display.set_mode() 创建主显示 Surface,这通常是游戏窗口的画布。
screen = pygame.display.set_mode((width, height))
通过 pygame.Surface() 直接创建一个新的 Surface 对象。
new_surface = pygame.Surface((width, height))
通过加载一个图像文件创建 Surface 对象。
image_surface = pygame.image.load('image.png')
Surface对象的属性和方法

Surface 对象有很多属性和方法,以下是一些常用的:

get_size(): 返回 Surface 对象的尺寸,即宽和高。
get_width(): 返回 Surface 对象的宽度。
get_height(): 返回 Surface 对象的高度。
fill(): 使用单一颜色填充整个 Surface。
blit(): 将一个 Surface 对象绘制到另一个上面,这是图像合成的基本操作。
convert(): 改变 Surface 的像素格式,以更好地匹配显示设备,这可以提高绘制速度。
set_alpha(): 设置 Surface 的透明度。
get_rect(): 获取一个矩形对象,其大小与 Surface 相同,常用于处理位置和碰撞检测。
绘制和更新Surface

在Pygame中,当你对 Surface 进行绘制操作后,这些操作不会立即反映到屏幕上。你需要调用 pygame.display.flip() 或 pygame.display.update() 来更新显示的内容。

pygame.display.flip(): 更新整个屏幕的内容。
pygame.display.update(): 可以更新屏幕的一个区域或多个区域。
Pygame 中 Surface 对象的基本使用方法如下:

1、创建 Surface 对象

要在 Pygame 中创建一个 Surface 对象,你可以使用 pygame.Surface() 函数,并传入一个元组,指定你希望创建的 Surface 的宽度和高度:

import pygame

# 初始化pygame
pygame.init()

# 创建一个Surface对象
surface_width = 800
surface_height = 600
my_surface = pygame.Surface((surface_width, surface_height))
 

2、绘制 Surface 对象

你可以使用各种 Pygame 的绘图函数来在 Surface 上绘制图形。例如,你可以在一个 Surface 上绘制一个矩形:

# 设置颜色
color = (255, 0, 0) # RGB颜色,这里是红色

# 绘制一个矩形
# pygame.draw.rect(Surface, color, Rect, width=0)
pygame.draw.rect(my_surface, color, (10, 10, 50, 50))
 

3、显示 Surface 对象

创建和绘制 Surface 之后,你需要将它绘制到主显示 Surface 上,这通常是你通过 pygame.display.set_mode() 获取的 Surface。你可以使用 blit 方法来完成这个操作:

# 创建主显示Surface
screen = pygame.display.set_mode((800, 600))

# 把我们创建的Surface对象绘制到主显示Surface上
screen.blit(my_surface, (0, 0))

# 更新整个待显示的 Surface 对象到屏幕上
pygame.display.flip()

4、事件循环

在 Pygame 中,你需要设置一个事件循环来保持游戏的运行,并在适当的时候处理事件(如按键和退出):

# 游戏主循环
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    # 其他游戏逻辑和渲染

    # 更新显示
    pygame.display.flip()

# 退出pygame
pygame.quit()

使用Python的pygame库画花
例1、效果图:

源码如下:

import pygame
import sys
 
# 初始化pygame
pygame.init()
 
# 设置窗口尺寸
width, height = 400, 400
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption('画花')
 
# 定义颜色
WHITE = (255, 255, 255)
RED = (255, 0, 0)
YELLOW = (255, 255, 0)
GREEN = (0, 255, 0)
BROWN = (139, 69, 19)
 
# 绘制背景
screen.fill(WHITE)
 
# 画花
pygame.draw.circle(screen, RED, (200, 200), 30)  # 花心
pygame.draw.circle(screen, YELLOW, (170, 170), 30)  # 花瓣1
pygame.draw.circle(screen, YELLOW, (230, 170), 30)  # 花瓣2
pygame.draw.circle(screen, YELLOW, (170, 230), 30)  # 花瓣3
pygame.draw.circle(screen, YELLOW, (230, 230), 30)  # 花瓣4
 
# 画枝条
pygame.draw.rect(screen, BROWN, (195, 250, 10, 100))  # 枝条
 
# 画叶子
pygame.draw.polygon(screen, GREEN, [(100, 200), (150, 280), (195, 300)])  # 左叶子
pygame.draw.polygon(screen, GREEN, [(280, 200), (250, 280), (205, 300)])  # 右叶子
 
# 刷新屏幕
pygame.display.flip()
 
# 保持窗口打开
while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
例2、效果图:

源码如下:

import pygame
import sys
 
# 初始化 Pygame
pygame.init()
 
# 设置屏幕大小
screen = pygame.display.set_mode((600, 400))
 
# 设置标题
pygame.display.set_caption("花")
 
# 定义樱花的颜色
red = (255, 0, 0)
Green = (0, 255, 0)
# 定义枝条的颜色
brown = (139, 69, 19)
 
def draw_cherry_blossom(x, y):
    # 绘制樱花的五个瓣
    pygame.draw.ellipse(screen, red, (x, y, 10, 20))
    pygame.draw.ellipse(screen, red, (x+10, y-10, 20, 10))
    pygame.draw.ellipse(screen, red, (x+20, y, 10, 20))
    pygame.draw.ellipse(screen, red, (x+5, y+10, 20, 10))
    pygame.draw.ellipse(screen, red, (x-10, y+10, 20, 10))
 
    # 绘制花的中心
    pygame.draw.circle(screen, (255, 255, 255), (x+15, y+15), 5)
    
    # 绘制枝条
    pygame.draw.line(screen, Green, (x+15, y+1), (x+15, y+35), 2)
    pygame.draw.line(screen, brown, (x+10, y+35), (x+20, y+35), 4)
 
 
# 游戏主循环
running = True
while running:
    # 处理事件
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
 
    # 填充背景
    screen.fill((255, 255, 255))
 
 
    # 绘制花
    draw_cherry_blossom(150, 200)
    draw_cherry_blossom(250, 250)
    draw_cherry_blossom(300, 180)
    draw_cherry_blossom(320, 280)
    draw_cherry_blossom(400, 200)
 
    # 更新屏幕
    pygame.display.flip()
 
# 退出 Pygame
pygame.quit()
sys.exit()
说明:pygame.draw.line(screen, Green, (100,200),(220,320),2)的意思:

pygame.draw.line: 这是pygame库中的一个函数,用于绘制线段。

screen: 这是一个pygame的Surface 对象,通常是你想要绘制线的屏幕或窗口。

Green: 这是一个颜色元组,表示线的颜色。在这个例子中,线将是绿色的。

(100,200): 这是线段起始点的坐标。

(220,320): 这是线段终点的坐标。

2: 这是线段的宽度。

(二)pygame.event.get()的介绍

   pygame.event.get() 是 Pygame 库中的一个函数,用于从事件队列中获取所有待处理的事件并返回一个事件列表。

Pygame 库主要用于游戏开发,其中事件是指用户在游戏中发出的各种操作,例如按键、鼠标移动、点击等。这些事件被存储在一个事件队列中,程序需要不断从队列中获取事件并作出相应的响应,从而使游戏能够与用户进行交互。

pygame.event.get() 函数的作用是从事件队列中获取所有待处理的事件,并将它们作为一个事件列表返回。程序可以通过对事件列表进行遍历,逐一判断每个事件的类型,并根据需要做出相应的响应。例如,如果用户按下了键盘上的某个按键,程序可以通过判断事件类型为“按键按下”来执行相应的操作。

需要注意的是,pygame.event.get() 函数只会获取当前在事件队列中的事件,并不会等待新的事件产生。如果事件队列中没有待处理的事件,该函数会返回一个空的事件列表。因此,在程序中需要不断地调用该函数来获取事件,以保证游戏的正常交互。

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

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

相关文章

中英双语介绍美国的州:西弗吉尼亚州(West Virginia)

中文版 西弗吉尼亚州简介 西弗吉尼亚州&#xff08;West Virginia&#xff09;是位于美国东部的一个州&#xff0c;因其丰富的自然资源和美丽的山地风景而闻名。以下是对西弗吉尼亚州的详细介绍&#xff0c;包括其地理位置、人口、经济、教育、文化和主要城市等。 地理位置 …

轻松拯救手机数据,数据恢复软件推荐这8款!

在现代生活中&#xff0c;手机已成为我们不可或缺的工具&#xff0c;承载着大量重要的个人和工作数据。然而&#xff0c;意外删除、系统崩溃、设备损坏等情况可能导致数据丢失&#xff0c;给我们带来极大的困扰。幸运的是&#xff0c;随着科技的发展&#xff0c;各种手机数据恢…

【C++之unordered_set和unordered_map的介绍与应用】

C学习笔记---024 C之unordered_set和unordered_map的介绍与应用1、unordered_set和unordered_map的简单介绍1.1、unordered_set和unordered_map的基本概念1.2、unordered_set和unordered_map的基本特性 2、unordered_set的基本操作2.1、unordered_set的定义2.2、unordered_set的…

Mysql迁移数据报错:1114 – The table ‘xxxx’is full问题以及迁移mysql

今天用Navicat迁移数据的时候&#xff0c;报了一个错:1114 – The table ‘xxxx’is full 解决方案一:修改mysql的配置 这个问题可能是2种原因: 1.存放数据的磁盘整的已经放满&#xff0c;不能再写入数据&#xff0c;需要优化磁盘的存储大小。2.超过了mysql的临时表大小 和内…

顶顶通语音信箱手机助手拦截方案

在电话自动外呼系统&#xff0c;常见的问题是被叫号码开通了语音信箱&#xff0c;或者运营商自动给开通了小秘书服务&#xff0c;一旦电话打不通&#xff0c;就会先播放一个类似这样的提示音&#xff0c;你拨打的电话已经开启了来电小秘书&#xff0c;请在滴声后留言。还有一个…

【面试题】IPS(入侵防御系统)和IDS(入侵检测系统)的区别

IPS&#xff08;入侵防御系统&#xff09;和IDS&#xff08;入侵检测系统&#xff09;在网络安全领域扮演着不同的角色&#xff0c;它们之间的主要区别可以归纳如下&#xff1a; 功能差异&#xff1a; IPS&#xff1a;这是一种主动防护设备&#xff0c;不仅具备检测攻击的能力&…

优思学院|如何管理库存?让浪费和缺货减至最少?

引言&#xff1a;库存在精益生产中的悖论 在精益生产管理中&#xff0c;库存&#xff08;Inventory&#xff09;一直被视为八大浪费之一&#xff0c;因为它占用了资源、空间&#xff0c;并且可能掩盖流程中的问题。然而&#xff0c;库存并非一无是处&#xff0c;特别是在流程尚…

这几类热销品被Ozon限制销售,ozon还有什么产品好卖?

OZON是俄罗斯最大的B2C电商平台&#xff0c;占据俄罗斯电商市场份额的62%&#xff0c;日均订单量高达37万单&#xff0c;拥有超过1600万的活跃用户。ozon平台对中国卖家招商的产品品类涵盖了多个领域&#xff0c;但近日Ozon官方发布将对这三大类目实行销售限制&#xff0c;一起…

使用PyTorch高效读取二进制数据集进行训练

使用pickle制作类cifar10二进制格式的数据集 使用pytorc框架来训练&#xff08;以猫狗大战数据集为例&#xff09; 此方法是为了实现阿里云PAI studio上可视化训练模型时使用的数据格式。 一、制作类cifar10二进制格式数据 import os, cv2 from pickled import * from load_da…

非常疑惑文章变成了仅VIP可读

关于博客发布的一些感想 挺久没上 CSDN 了&#xff0c;平时遇到问题都是问 ChatGPT&#xff0c;自行查阅资料的时间也不多了&#xff0c;写博文的频率也随之降低。偶尔会记些笔记自用&#xff0c;也没有再发布出来。 今天在谷歌查了个问题&#xff0c;突然想发个博客&#xf…

微信小程序渲染层与逻辑层交互原理

1. 网页开发与小程序开发有何不同&#xff1f; 2. 小程序运行环境 3. 页面渲染技术选型 1. 纯客户端技术&#xff1b; 2. 纯Web技术&#xff1b; 3. 用客户端原生技术与Web技术结合的混合技术&#xff08;Hybrid&#xff09;&#xff0c;小程序就是使用的这种技术&#xff1…

零基础学MySQL:从入门到实践的完整指南

引言&#xff1a; MySQL&#xff0c;作为全球最受欢迎的开源关系型数据库管理系统之一&#xff0c;以其高性能、易用性和灵活性&#xff0c;在Web开发、数据分析等领域占据着举足轻重的地位。如果你是一位编程新手&#xff0c;想要踏入数据库管理的大门&#xff0c;本文将从零…

MacBook关闭谷歌浏览器双指左右移动(扫动)前进后退功能

这个功能真的很反人类&#xff0c;正常上下滑动页面的时候很容易误操作&#xff0c;尤其是当你在一个页面上做了很多的编辑工作后误触发了此手势&#xff0c;那真叫一个崩溃&#xff01; 其实这应该是 Macbook 触控板提供的一个快捷操作&#xff0c;跟浏览器本身估计没关系&am…

基于大模型构建企业私有智能知识库落地的简单实践

​ 随着人工智能技术的飞速发展&#xff0c;大模型在企业知识管理中的应用日益广泛。下文是作者围绕如何基于大模型技术构建企业私有知识库&#xff0c;以提升企业的知识管理效率和创新能力的一些思考和简单实践。 ​ 本文对企业知识库的落地场景暂不作广泛的展开&#xff0c;…

Oracle PL / SQL数据类型

PL / SQL是SQL的过程语言扩展&#xff0c;它支持与SQL对数据库相同的数据类型。 PL / SQL可以处理任何数据库数据类型&#xff0c;并且还有自己的数据类型。 VARCHAR2&#xff1a;我们将使用数据类型VARCHAR2处理PL / SQL中的字符串。 PL / SQL VARCHAR2最多可容纳32,767个字…

成都百洲文化传媒有限公司网上开店怎么样?

在电商的浪潮中&#xff0c;每一个品牌都在寻找自己的定位与突破。而成都百洲文化传媒有限公司&#xff0c;正是这场浪潮中的一股强大助力&#xff0c;凭借其专业的电商服务&#xff0c;助力无数品牌实现了飞跃发展。 一、专业铸就品质&#xff0c;服务成就品牌 成都百洲文化传…

Runway:Gen-3 Alpha 文生视频现已开放

Runway 自 6 月 17 号公布 Gen-3 Alpha 快半个月了, 现在终于对所有人开放了&#xff0c;当然前提是你至少订阅了标准版&#xff08;12 美刀/月), 传送门&#xff1a;runwayml.com

中原汉族与北方游牧民族舞蹈文化在这段剧中表现得淋漓尽致,且看!

中原汉族与北方游牧民族舞蹈文化在这段剧中表现得淋漓尽致&#xff0c;且看&#xff01; 《神探狄仁杰》之使团喋血记是一部深入人心的历史侦探剧&#xff0c;不仅以其曲折离奇的案情和狄仁杰的睿智形象吸引观众&#xff0c;更以其对唐代文化的精准再现而备受赞誉。#李秘书讲写…

引力波信号的连续小波变换(Python)

提到引力波&#xff0c;就要提到引力波天文学。引力波天文学是观测天文学的一个新兴分支&#xff0c;主要利用引力波&#xff08;微小时空扭曲&#xff09;观测发出引力辐射的天体系统&#xff0c;比如中子星和黑洞等波源、超新星等事件以及大爆炸后不久的早期宇宙演化过程。 …

Java代码基础算法练习-计算平均身高-2024.07.02

任务描述&#xff1a; n个同学站成一排&#xff0c;求它们的平均身高 解决思路&#xff1a; 输入的学生人数为 for 循环次数&#xff0c;循环中每输入一个值就添加在总数中&#xff0c;循环结束总数除以对应的学生人数得到平均身高 代码示例&#xff1a; package a4_2024_07;…