用Python写了一个贪吃蛇大冒险小游戏

一、游戏简介

1.1 游戏操作及游戏规则

(1)游戏开始后,通过键盘上下左右键控制贪吃蛇移动寻找食物;
(2)贪吃蛇每吃一个食物,身长会增加一个单位;
(3)在正常模式中,贪吃蛇如果碰到墙面或咬到自身,则游戏失败;
(4)在可穿墙模式中,贪吃蛇可以穿过墙面,但咬到自身后,游戏失败。

二、游戏总体设计

2.1 游戏总体设计框架图

三、编译语言以及用到的库文件描述

3.1 Python语言
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),Python语言具有非常简洁且清晰的语法特点,随着版本的不断更新和语言新功能的添加,越来越多被用于独立的、大型项目的开发。目前,基于Python语言的相关技术正在飞速发展,用户数量急剧增大,相关的资源越来越多。

3.2 pygame库
Pygame是跨平台Pyth,Pygame 作者是 Pete Shinners, 协议为 GNU Lesser General Public License。Pygame包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。基于这样一个设想,所有需要的游戏功能和理念(主要是图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由高级语言提供,如Python。

3.3 random库
Random是产生随机数的库,即随机数发生器,random产生的是伪随机数或者说是用一种复杂的方法计算得到的序列值,因此每次运算时需要一个不同的种子值。种子值不同,得到的序列值也不同。

3.4 time库
time库是Python中处理时间的标准库,用于计算机时间的表达,提供获取系统时间并格式化输出功能,提供系统级精确计时功能,也可用于程序性能分析。

3.5 sys库
sys.exit([ arg ])用于程序的退出,sys.exit(n) 退出程序,正常退出时exit(0)。这是通过引发SystemExit 异常来实现的,因此遵循finally语句的子句所指定的清理操作try ,并且可以拦截外层的退出尝试。可选参数arg可以是一个整数,给出退出状态(默认为零)或其他类型的对象。如果它是整数,则零被认为是“成功终止”,并且任何非零值等视为“异常终止”。

四、游戏设计与实现

4.1 游戏整体设计

  1. 定义贪吃蛇对象,包括蛇头和蛇身两个部分,蛇头单独设置,蛇身使用列表来存储;

  2. 定义食物对象,包括食物对象的初始化、随机颜色和随机位置的设置;

  3. 定义初始化界面,在该界面中设置文本为“正常模式”、“可穿墙模式”和“退出”的三个按钮供玩家选择;

  4. 定义正常模式,包括游戏窗口显示、主循环和判断贪吃蛇死亡的设置;

  5. 定义可穿墙模式,包括游戏窗口显示、主循环和判断贪吃蛇死亡的设置;

  6. 定义游戏结束窗口,包括窗口显示和最后得分显示的设置。

4.2 主要函数解析

4.2.1 new_food()函数

食物对象初始化函数,传入形参为贪吃蛇蛇头坐标。当贪吃蛇吃掉食物后,通过该函数生成新的食物。通过传入形参判断新生成的食物坐标是否与蛇头坐标相同,若相同则重新生成新的坐标。

4.2.2 start_game()函数

正常模式的主循环函数,通过该函数进行正常模式下贪吃蛇和食物的初始化、玩家控制贪吃蛇运动、蛇头和蛇身的判断更新和得分统计实现。

4.2.3 die_snake()函数

正常模式下贪吃蛇死亡判断函数,传入形参为贪吃蛇蛇头和蛇身坐标数据。在该函数中设置布尔型变量die_flag,若死亡设置为Ture并返回,没有死亡为False。通过遍历蛇身存储列表,判断蛇身坐标是否与蛇头坐标相同,若相同则判定贪吃蛇咬到自身,死亡。同时,判断贪吃蛇是否撞墙,及判断蛇头的x和y坐标是否窗体的宽高,若超过则死亡。

4.2.4 start_kgame()函数

可穿墙模式的主循环函数,通过该函数进行可穿墙模式下贪吃蛇和食物的初始化、玩家控制贪吃蛇运动、蛇头和蛇身的判断更新和得分统计实现。

4.2.5 through_snake()函数

可穿墙模式下贪吃蛇死亡判断函数,传入形参为贪吃蛇蛇头和蛇身坐标数据。在该函数中设置布尔型变量die_flag,若死亡设置为Ture并返回,没有死亡为False。通过遍历蛇身存储列表,判断蛇身坐标是否与蛇头坐标相同,若相同则判定贪吃蛇咬到自身,死亡。

4.2.6 show_end()函数

游戏结束时,结束界面设置函数。在该函数中进行结束界面窗体的初始化,在窗体中显示玩家的最终得分,并在改函数中调用pygame库quit方法,使该库停止工作。

4.2.7 into_game()函数

游戏初始界面实现函数,在该函数中进行游戏初始界面窗体的初始化。在该界面窗体中设置文本为“正常模式”、“可穿墙模式”和“退出”的三个点击按钮,通过设置循环,调用button函数(详细见6.2.8)监听玩家的点击。

4.2.8 button()函数

游戏初始界面按钮监听函数,在该函数中实现对玩家鼠标点击事件和键盘输入事件的监听。并根据玩家选择,运行按钮对应的触发函数。即点击“正常模式”按钮,运行正常模式的主循环函数,以此类推。

五、运行模块代码结构

在运行模块,进行pygame库的初始化、设置游戏背景音乐、显示窗口各个参数的设置以及游戏初始界面的显示设置,具体结果代码如下图:

六、游戏运行测试(截图)

1. 游戏初始选择界面

2. 正常模式运行界面

3. 可穿墙模式运行界面

4. 游戏结束界面


七、游戏完整代码

import sys
import time
import pygame
from random import *
# Position类,通过其构造函数,设置x和y
class Position(object):def __init__(self, x, y):self.x = xself.y = y
# 生成随机的食物
def new_food(head):while True:new_food = Position(randint(0, 48) * 20, randint(0, 29) * 20)# 判断新生成的事物是否和贪吃蛇蛇头重合,重合则不创键if new_food.x != head.x and new_food.y != head.y:breakelse:continuereturn new_food
# 绘制,在窗体中绘制贪吃蛇、食物
# color:颜色,position: 坐标
def rect(color, position):pygame.draw.circle(window, color, (position.x, position.y), 10)
# 初始界面和游戏中点差退出游戏时
def exit_end():pygame.quit()quit()
# 游戏结束时,显示得分的窗体的设置
def show_end():# 设计窗口# 定义窗口大小small_window = pygame.display.set_mode((960, 600))init_background = pygame.image.load("image/init_bgimg.jpg")small_window.blit(init_background, (0, 0))# 定义标题pygame.display.set_caption("贪吃蛇大冒险")# 定义背景图片font = pygame.font.SysFont("simHei", 40)fontsurf = font.render('游戏结束! 你的得分为: %s' % score, False, black)small_window.blit(fontsurf, (250, 200))pygame.display.update()time.sleep(2)pygame.quit()sys.exit()
# 正常模式死亡设置
# head: 蛇头, snake_body:蛇身
def die_snake(head, snake_body):# 定义标志物,默认为false,true时判定贪吃蛇碰到自己,死亡die_flag = False# 遍历存放贪吃蛇位姿的列表,从第1个开始,(第0个位蛇头)for body in snake_body[1:]:# 如果蛇头的xy和蛇身xy相等,则判定相撞,设置flag为tureif head.x == body.x and head.y == body.y:die_flag = True# 若蛇头的xy在显示窗体外,或flag为true,则显示结束界面,并退出游戏if head.x < 0 or head.x > 960 or head.y < 0 or head.y > 600 or die_flag:pygame.mixer.music.stop()show_end()
# 正常模式主体设置
def start_game():# 定义存分数的全局变量global scoreglobal colorcolor = (randint(10, 255), randint(10, 255), randint(10, 255))# 定义存放玩家键盘输入运动方向的变量,初始为向右run_direction = "right"# 定义贪吃蛇运动方向的变量,初始为玩家键入方向run = run_direction# 实例化蛇头、蛇身、食物对象head = Position(160, 160)# 初始化蛇身长度为3个单位snake_body = [Position(head.x, head.y + 20), Position(head.x, head.y + 40), Position(head.x, head.y + 60)]# 初始化食物位置food = Position(300, 300)# 死循环while True:window.blit(background, (0,0))# 监听玩家键盘输入的运动方向值,并根据输入转为up、down、right或left,方便程序中调用for event in pygame.event.get():if event.type == pygame.QUIT:show_end()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP:run_direction = "up"elif event.key == pygame.K_RIGHT:run_direction = "right"elif event.key == pygame.K_LEFT:run_direction = "left"elif event.key == pygame.K_DOWN:run_direction = "down"# 食物rect(color, food)# 蛇头rect(black, head)# 蛇身for pos in snake_body:rect(white, pos)# 判断贪吃蛇原运动方向与玩家键盘输入的运动方向是否违反正常运动情况if run == "up" and not run_direction == "down":run = run_directionelif run == "down" and not run_direction == "up":run = run_directionelif run == "left" and not run_direction == "right":run = run_directionelif run == "right" and not run_direction == "left":run = run_direction# 插入蛇头位置到蛇身列表中snake_body.insert(0, Position(head.x, head.y))# 根据玩家键入方向进行蛇头xy的更新if run == "up":head.y -= 20elif run == "down":head.y += 20elif run == "left":head.x -= 20elif run == "right":head.x += 20# 判断是否死亡die_snake(head, snake_body)# 判断蛇头和食物坐标,若相等,则加分,并生成新的食物if head.x == food.x and head.y == food.y:score += 1food = new_food(head)color = (randint(10, 255), randint(10, 255), randint(10, 255))else:snake_body.pop()font = pygame.font.SysFont("simHei", 25)mode_title = font.render('正常模式', False, grey)socre_title = font.render('得分: %s' % score, False, grey)window.blit(mode_title, (50, 30))window.blit(socre_title, (50, 65))# 绘制更新pygame.display.update()# 通过帧率设置贪吃蛇速度clock.tick(8)
# 可穿墙模式死亡设置
# head:蛇头,snake_body:蛇身
def through_snake(head, snake_body):# 定义标志位die_flag = False# 遍历,蛇头碰到蛇身时,flag为true退出游戏for body in snake_body[1:]:if head.x == body.x and head.y == body.y:die_flag = Trueif die_flag:pygame.mixer.music.stop()show_end()else:  # 当蛇头的xy出窗体时# 四种穿墙情况,分别设置if head.x < 0:head.x = 960if head.x > 960:head.x = 0if head.y < 0:head.y = 600if head.y > 600:head.y = 0
# 穿墙模式主体设置
def start_kgame():global scoreglobal colorcolor = (randint(10, 255), randint(10, 255), randint(10, 255))# 定义蛇初始方向run_direction = "up"run = run_direction# 实例化蛇头、蛇身、食物对象head = Position(160, 160)# 三格snake_body = [Position(head.x, head.y + 20), Position(head.x, head.y + 40), Position(head.x, head.y + 60)]# 初始化事物位置food = Position(300, 300)# 死循环,监听键盘键值while True:window.blit(background, (0, 0))for event in pygame.event.get():if event.type == pygame.QUIT:show_end()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_UP:run_direction = "up"elif event.key == pygame.K_RIGHT:run_direction = "right"elif event.key == pygame.K_LEFT:run_direction = "left"elif event.key == pygame.K_DOWN:run_direction = "down"# 食物rect(color, food)# 蛇头rect(black, head)# 蛇身for pos in snake_body:rect(white, pos)# 判断贪吃蛇原运动方向与玩家键盘输入的运动方向是否违反正常运动情况if run == "up" and not run_direction == "down":  # 若运动方向为向上,玩家输入运动方向向下,则违背贪吃蛇正常运动情况run = run_directionelif run == "down" and not run_direction == "up":run = run_directionelif run == "left" and not run_direction == "right":run = run_directionelif run == "right" and not run_direction == "left":run = run_direction# 插入蛇头位置到蛇身列表中snake_body.insert(0, Position(head.x, head.y))# 根据玩家键入方向进行蛇头xy的更新if run == "up":head.y -= 20elif run == "down":head.y += 20elif run == "left":head.x -= 20elif run == "right":head.x += 20# 穿墙实现through_snake(head, snake_body)# 判断是否加分和随机生成新的食物if head.x == food.x and head.y == food.y:score += 1food = new_food(head)color = (randint(10, 255), randint(10, 255), randint(10, 255))else:snake_body.pop()font = pygame.font.SysFont("simHei", 25)mode_title = font.render('穿墙模式', False, grey)socre_title = font.render('得分: %s' % score, False, grey)window.blit(mode_title, (50, 30))window.blit(socre_title, (50, 65))# 绘制更新pygame.display.update()# 通过帧率设置贪吃蛇速度clock.tick(8)
# 监听函数,监听键盘输入
# msg: 按钮信息,x: 按钮的x轴,y: 按钮的y轴,w: 按钮的宽,h: 按钮的高,ic: 按钮初始颜色,ac: 按钮按下颜色,action: 按钮按下的动作
def button(msg, x, y, w, h, ic, ac, action=None):# 获取鼠标位置mouse = pygame.mouse.get_pos()# 获取键盘输入click = pygame.mouse.get_pressed()if x + w > mouse[0] > x and y + h > mouse[1] > y:pygame.draw.rect(window, ac, (x, y, w, h))if click[0] == 1 and action != None:action()else:pygame.draw.rect(window, ic, (x, y, w, h))# 设置按钮中的文字样式和居中对齐font = pygame.font.SysFont('simHei', 20)smallfont = font.render(msg, True, white)smallrect = smallfont.get_rect()smallrect.center = ((x + (w / 2)), (y + (h / 2)))window.blit(smallfont, smallrect)
# 游戏初始界面,选择模式
def into_game():into = Truewhile into:window.blit(init_background, (0, 0))for event in pygame.event.get():if event.type == pygame.QUIT:exit_end()# 设置字体font = pygame.font.SysFont("simHei", 50)# 初始界面显示文字fontsurf = font.render('欢迎来到贪吃蛇大冒险!', True, black)  # 文字fontrect = fontsurf.get_rect()fontrect.center = ((width / 2), 200)window.blit(fontsurf, fontrect)button("正常模式", 370, 370, 200, 40, blue, brightred, start_game)button("可穿墙模式", 370, 420, 200, 40, violte, brightred, start_kgame)button("退出", 370, 470, 200, 40, red,brightred, exit_end)pygame.display.update()clock.tick(15)
if __name__ == '__main__':# 定义画布颜色white = (255, 255, 255)red = (200, 0, 0)green = (0, 128, 0)blue = (0, 202, 254)violte = (194, 8, 234)brightred = (255, 0, 0)brightgreen = (0, 255, 0)black = (0, 0, 0)grey = (129, 131, 129)score = 0# 设计窗口# 定义窗口大小width = 960height = 600window = pygame.display.set_mode((width, height))# 定义标题pygame.display.set_caption("贪吃蛇大冒险")# 定义背景图片init_background = pygame.image.load("image/init_bgimg.jpg")background = pygame.image.load("image/bgimg.jpg")# 背景音乐pygame.mixer.init()pygame.mixer.music.load("background.mp3")pygame.mixer.music.play(-1)# 创建时钟clock = pygame.time.Clock()# 初始化pygame.init()# 初始界面into_game()

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,人工智能、自动化办公等学习教程。带你从零基础系统性的学好Python!

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(全套教程文末领取)

在这里插入图片描述

👉Python学习视频600合集👈

观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

在这里插入图片描述

温馨提示:篇幅有限,已打包文件夹,获取方式在:文末

👉Python70个实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

👉Python副业兼职路线&方法👈

学好 Python 不论是就业还是做副业赚钱都不错,但要学会兼职接单还是要有一个学习规划。

在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

点击免费领取《CSDN大礼包》:Python入门到进阶资料 & 实战源码 & 兼职接单方法 安全链接免费领取

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

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

相关文章

【HarmonyOS】 低代码平台组件拖拽使用技巧之登录组件

【关键字】 HarmonyOS、低代码平台、组件拖拽、登录组件、代码编辑器 1、写在前面 前面我们介绍了低代码中堆叠容器、滚动容器、网格布局、页签容器以及一些常用容器和组件的拖拽使用方法&#xff0c;本篇我们来介绍一个新的组件&#xff0c;这个组件是属于业务组件——登录组…

Modbus转Profinet网关:PLC与天信流量计通讯的经典案例

无论您是PLC或工业设备的制造商&#xff0c;还是工业自动化系统的维护人员&#xff0c;可能会遇到需要将不同协议的设备连接组合并通讯的情况&#xff0c;Modbus和Profinet是现代工业自动化中常见的两种通信协议&#xff0c;在工业控制领域中被广泛应用。 在这种情况绝大多数会…

快速上手Banana Pi BPI-M4 Zero 全志科技H618开源硬件开发开发板

Linux[编辑] 准备[编辑] 1. Linux镜像支持SD卡或EMMC启动&#xff0c;并且会优先从SD卡启动。 2. 建议使用A1级卡&#xff0c;至少8GB。 3. 如果您想从 SD 卡启动&#xff0c;请确保可启动 EMMC 已格式化。 4. 如果您想从 EMMC 启动并使用 Sdcard 作为存储&#xff0c;请确…

《微信小程序开发从入门到实战》学习二十六

3.4 开发参与投票页面 参与投票页面同样需要收集用户提交的信息&#xff0c;哪个用户在哪个投票选择了什么选项&#xff0c;因此它也是一个表单页面 3.4.1 如何获取投票信息 假设用户A在投票创建页面后填了表单&#xff08;1.创建投票&#xff09;&#xff0c;用户A 点了提交…

山西电力市场日前价格预测【2023-11-24】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-11-24&#xff09;山西电力市场全天平均日前电价为415.13元/MWh。其中&#xff0c;最高日前电价为685.26元/MWh&#xff0c;预计出现在18:00。最低日前电价为296.84元/MWh&#xff0c;预计…

Web实战:基于Django与Bootstrap的在线计算器

文章目录 写在前面实验目标实验内容1. 创建项目2. 导入框架3. 配置项目前端代码后端代码 4. 运行项目 注意事项写在后面 写在前面 本期内容&#xff1a;基于Django与Bootstrap的在线计算器 实验环境&#xff1a; vscodepython(3.11.4)django(4.2.7)bootstrap(3.4.1)jquery(3…

美国DDoS服务器:如何保护你的网站免遭攻击?

​  在当今数字化时代&#xff0c;互联网已经成为人们生活中不可或缺的一部分。随着互联网的普及和发展&#xff0c;网络安全问题也日益严重。其中&#xff0c;DDoS攻击是目前最常见和具有破坏性的网络攻击之一。那么&#xff0c;如何保护你的网站免遭DDoS攻击呢?下面将介绍…

C#开发的OpenRA游戏之属性Selectable(9)

C#开发的OpenRA游戏之属性Selectable(9) 在游戏里,一个物品是否具有选中的能力,是通过添加属性Selectable来实现的。当一个物品不能被用户选取,那么就不要添加这个属性。 这个属性定义在下面这段描述里: ^Selectable: Selectable: SelectionDecorations: WithSpriteCon…

CSS画一条线

<p style"border: 1px solid rgba(0, 0, 0, 0.1);"></p> 效果&#xff1a;

MATLAB中imbothat函数用法

目录 语法 说明 示例 使用底帽和顶帽滤波增强对比度 imbothat函数的功能是对图像进行底帽滤波。 语法 J imbothat(I,SE) J imbothat(I,nhood) 说明 J imbothat(I,SE) 使用结构元素 SE 对灰度或二值图像 I 执行形态学底帽滤波。底帽滤波计算图像的形态学闭运算&#…

苹果手机内存满了怎么清理?这里有你想要的答案!

手机内存不足是一个比较普遍的现象。由于现在手机应用程序的功能越来越强大&#xff0c;所以占用的内存也越来越大。同时用户会在手机中存储大量的数据&#xff0c;如照片、视频、文档等&#xff0c;这些都会占用大量的手机空间。那么&#xff0c;苹果手机内存满了怎么清理&…

C++数组中重复的数字

3. 数组中重复的数字 题目链接 牛客网 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 Input: {2, 3, 1, 0, 2, 5}Output: 2解题…

Altium Designer学习笔记10

再次根据图纸进行布局走线&#xff1a; 这个MT2492 建议的布局走线。 那我这边应该是尽量按照该图进行布局&#xff1a; 其中我看到C1的电容的封装使用的是电感的封装&#xff0c;需要进行更换处理&#xff1a; 执行Validate Changes和Execute Changes操作&#xff0c;更新&a…

程序员最奔溃的瞬间

身为程序员哪一个瞬间让你最奔溃&#xff1f; *程序员最奔溃的瞬间&#xff0c; 勇士&#xff1f; or 无知&#xff1f;

Element中el-table组件右侧空白隐藏-滚动条

开发情况&#xff1a; 固定table高度时&#xff0c;出现滚动条&#xff0c;我们希望隐藏滚动条&#xff0c;或修改滚动条样式&#xff0c;出现table右边出现15px 的固定留白。 代码示例 <el-table class"controlTable" header-row-class-name"controlHead…

C语言二十一弹 --打印空心正方形

C语言实现打印空心正方形 思路&#xff1a;观察图中空心正方形&#xff0c;可知首行列和尾行列被黑色外框包裹&#xff0c;其它均为空。所以按观察打印即可。 总代码 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h>int main() {int n 0;while (scanf("%d&q…

关于数据摆渡 你关心的5个问题都在这儿!

数据摆渡&#xff0c;这个词语的概念源自于网络隔离和数据交换的场景和需求。不管是物理隔离、协议隔离、应用隔离还是逻辑隔离&#xff0c;最终目的都是为了保护内部核心数据的安全。而隔离之后&#xff0c;又必然会存在文件交换的需求。 传统的跨网数据摆渡方式经历了从人工U…

手把手教你通过CODESYS V3进行PLC编程(二)

教程背景 在上一期教程中&#xff0c;我们已经完成了控制器设备的连接和配置。接下来的教程将继续以宏集MC-Prime为例&#xff0c;假设控制器已经配置并连接到开发者的PC上&#xff0c;为您演示如何为控制器安装合适的CODESYS V3版本并创建第一个程序。 一、安装CODESYS &…

解决 requests 库下载文件问题的技术解析

每次都以为自己即将战胜bug&#xff0c;这是一场永无休止的游戏。在编程的世界中&#xff0c;bug就像狡猾的敌人&#xff0c;时隐时现&#xff0c;让人防不胜防。 今天&#xff0c;我要分享的是如何解决requests库下载文件问题的技术解析。这是一个让我头痛已久的bug&#xff0…

FastAPI通过SSE进行流式输出

服务端推送 在服务器推送技术中&#xff0c;服务器在消息可用后立即主动向客户端发送消息。其中&#xff0c;有两种类型的服务器推送&#xff1a;SSE和 WebSocket。 SSE&#xff08;Server-Send Events&#xff09; SSE 是一种在基于浏览器的 Web 应用程序中仅从服务器向客户…