当前位置: 首页 > news >正文

Go Ebiten小游戏开发:贪吃蛇

Snake

贪吃蛇是一款经典的小游戏,玩法简单却充满乐趣。本文将介绍如何使用 Go 语言和 Ebiten 游戏引擎开发一个简单的贪吃蛇游戏。通过这个项目,你可以学习到游戏开发的基本流程、Ebiten 的使用方法以及如何用 Go 实现游戏逻辑。

项目简介

贪吃蛇的核心玩法是控制一条蛇在网格中移动,吃掉随机生成的食物,每吃一个食物蛇身会变长,同时得分增加。如果蛇撞到墙壁或自己的身体,游戏结束。

本项目使用 Go 语言和 Ebiten 游戏引擎实现。Ebiten 是一个轻量级的 2D 游戏引擎,非常适合开发小游戏。

开发环境

  • Go 版本:1.20+
  • Ebiten 版本:v2.5.0+
  • 开发工具:VS Code 或 GoLand

安装 Ebiten:

go mod init snake
go get -u github.com/hajimehoshi/ebiten/v2

游戏设计

游戏元素

  • :由头部和身体组成,头部控制移动方向,身体跟随头部移动。
  • 食物:随机出现在网格中,蛇吃到食物后身体变长。
  • 网格:游戏区域被划分为固定大小的网格,蛇和食物都位于网格中。

游戏规则

  • 蛇每移动一格,身体跟随头部移动。
  • 吃到食物后,蛇身变长,食物重新生成。
  • 如果蛇撞到墙壁或自己的身体,游戏结束。

实现细节

游戏状态

游戏的核心状态由 Game 结构体管理,包括蛇的位置、食物位置、当前方向、分数等。

type Game struct {Head      Pos     // 蛇头位置Body      []Pos   // 蛇身位置列表Food      Pos     // 食物位置Dir       int     // 当前移动方向Score     int     // 当前分数GameOver  bool    // 游戏是否结束Paused    bool    // 游戏是否暂停TickCount int     // 更新计数器
}

游戏循环

Ebiten 的游戏循环由 UpdateDraw 方法实现:

  • Update:处理游戏逻辑更新,如蛇的移动、碰撞检测、输入处理等。
  • Draw:绘制游戏画面,包括蛇、食物和分数。

蛇的移动

蛇的移动通过更新头部位置,并将身体各部分依次移动到前一个部分的位置实现。

func (g *Game) Next() {// 移动蛇身for i := len(g.Body) - 1; i > 0; i-- {g.Body[i] = g.Body[i-1]}g.Body[0] = g.Head// 移动蛇头g.Head.X += Direction[g.Dir].Xg.Head.Y += Direction[g.Dir].Y
}

碰撞检测

碰撞检测分为两种情况:

  • 撞墙:蛇头超出网格范围。
  • 撞自己:蛇头与身体任何部分重合。
func (g *Game) IsDead() bool {// 检查是否撞墙if g.Head.X < 0 || g.Head.X >= GridSize || g.Head.Y < 0 || g.Head.Y >= GridSize {return true}// 检查是否撞到自己for _, pos := range g.Body {if g.Head == pos {return true}}return false
}

食物生成

食物需要随机生成在网格中,且不能与蛇的身体重合。

func (g *Game) SpawnFood() {for {x := rand.IntN(GridSize)y := rand.IntN(GridSize)if !g.IsOccupied(x, y) {g.Food = Pos{x, y}break}}
}

输入处理

通过检测键盘输入来控制蛇的移动方向,并支持暂停和重置游戏。

func (g *Game) HandleInput() {if ebiten.IsKeyPressed(ebiten.KeyEscape) {os.Exit(0) // 按下 Esc 键退出游戏}if ebiten.IsKeyPressed(ebiten.KeyP) {g.Paused = !g.Paused // 按下 P 键切换暂停状态}if !g.Paused && !g.GameOver {// 处理方向键输入if ebiten.IsKeyPressed(ebiten.KeyLeft) && g.Dir != RIGHT {g.Dir = LEFT}if ebiten.IsKeyPressed(ebiten.KeyRight) && g.Dir != LEFT {g.Dir = RIGHT}if ebiten.IsKeyPressed(ebiten.KeyUp) && g.Dir != DOWN {g.Dir = UP}if ebiten.IsKeyPressed(ebiten.KeyDown) && g.Dir != UP {g.Dir = DOWN}}
}

运行效果

运行游戏后,你会看到一个简单的贪吃蛇界面:

  • 使用方向键控制蛇的移动。
  • 吃到食物后,蛇身变长,分数增加。
  • 如果蛇撞到墙壁或自己的身体,游戏结束,按下 R 键可以重新开始。

完整代码

package mainimport ("fmt""image/color""math/rand/v2""os""github.com/hajimehoshi/ebiten/v2""github.com/hajimehoshi/ebiten/v2/ebitenutil""github.com/hajimehoshi/ebiten/v2/vector"
)const (GridSize     int     = 40                        // 网格大小(每个格子的大小)BlockSize    float32 = 20                        // 每个格子的像素大小WindowWidth  int     = GridSize * int(BlockSize) // 窗口宽度WindowHeight int     = GridSize * int(BlockSize) // 窗口高度InitialTPS   int     = 5                         // 初始每秒更新次数(游戏速度)ScorePerFood int     = 10                        // 每吃一个食物增加的分数
)const (RIGHT = iota // 右方向DOWN         // 下方向UP           // 上方向LEFT         // 左方向
)var (HeadColor color.Color = color.NRGBA{0, 0, 255, 255}     // 蛇头颜色BodyColor color.Color = color.NRGBA{255, 255, 255, 255} // 蛇身颜色FoodColor color.Color = color.NRGBA{255, 0, 0, 255}     // 食物颜色
)// Pos 表示一个二维坐标
type Pos struct {X, Y int
}// Direction 表示四个方向的移动向量
var Direction [4]Pos = [4]Pos{{1, 0}, {0, 1}, {0, -1}, {-1, 0}}// Game 表示游戏的状态
type Game struct {Head      Pos   // 蛇头位置Body      []Pos // 蛇身位置列表Food      Pos   // 食物位置Dir       int   // 当前移动方向Score     int   // 当前分数GameOver  bool  // 游戏是否结束Paused    bool  // 游戏是否暂停TickCount int   // 更新计数器
}// Update 是游戏的主更新逻辑
func (g *Game) Update() error {if g.GameOver {// 如果游戏结束,检测是否按下 R 键来重置游戏if ebiten.IsKeyPressed(ebiten.KeyR) {g.Reset()}return nil}g.TickCount++if g.TickCount >= 60/InitialTPS {g.TickCount = 0if !g.Paused {g.Next() // 更新游戏状态}}g.HandleInput() // 处理玩家输入return nil
}// Draw 是游戏的主绘制逻辑
func (g *Game) Draw(screen *ebiten.Image) {DrawGameState(screen, g)
}// Layout 设置游戏窗口的布局
func (g *Game) Layout(outerWidth, outerHeight int) (int, int) {return WindowWidth, WindowHeight
}func main() {ebiten.SetWindowTitle("Snake")                  // 设置窗口标题ebiten.SetWindowSize(WindowWidth, WindowHeight) // 设置窗口大小game := &Game{}game.Reset() // 初始化游戏状态if err := ebiten.RunGame(game); err != nil {panic(err)}
}// DrawGameState 绘制游戏状态
func DrawGameState(screen *ebiten.Image, g *Game) {// 绘制食物vector.DrawFilledRect(screen, float32(g.Food.X)*BlockSize, float32(g.Food.Y)*BlockSize, BlockSize, BlockSize, FoodColor, true)// 绘制蛇头vector.DrawFilledRect(screen, float32(g.Head.X)*BlockSize, float32(g.Head.Y)*BlockSize, BlockSize, BlockSize, HeadColor, true)// 绘制蛇身for _, pos := range g.Body {vector.DrawFilledRect(screen, float32(pos.X)*BlockSize, float32(pos.Y)*BlockSize, BlockSize, BlockSize, BodyColor, true)}// 绘制分数scoreText := fmt.Sprintf("Score: %d", g.Score)ebitenutil.DebugPrint(screen, scoreText)// 如果游戏结束,显示游戏结束信息if g.GameOver {ebitenutil.DebugPrintAt(screen, "Game Over! Press R to restart.", WindowWidth/2-100, WindowHeight/2)}
}// Next 更新游戏状态
func (g *Game) Next() {// 检查蛇是否吃到食物if g.Head == g.Food {g.Body = append(g.Body, g.Body[len(g.Body)-1]) // 增加蛇身长度g.Score += ScorePerFood                        // 增加分数g.SpawnFood()                                  // 生成新的食物}// 移动蛇身for i := len(g.Body) - 1; i > 0; i-- {g.Body[i] = g.Body[i-1]}g.Body[0] = g.Head// 移动蛇头g.Head.X += Direction[g.Dir].Xg.Head.Y += Direction[g.Dir].Y// 检查是否碰撞if g.IsDead() {g.GameOver = true}
}// SpawnFood 生成新的食物
func (g *Game) SpawnFood() {for {x := rand.IntN(GridSize)y := rand.IntN(GridSize)if !g.IsOccupied(x, y) {g.Food = Pos{x, y}break}}
}// IsOccupied 检查某个位置是否被蛇占据
func (g *Game) IsOccupied(x, y int) bool {if g.Head.X == x && g.Head.Y == y {return true}for _, pos := range g.Body {if pos.X == x && pos.Y == y {return true}}return false
}// IsDead 检查蛇是否死亡(撞墙或撞到自己)
func (g *Game) IsDead() bool {// 检查是否撞墙if g.Head.X < 0 || g.Head.X >= GridSize || g.Head.Y < 0 || g.Head.Y >= GridSize {return true}// 检查是否撞到自己for _, pos := range g.Body {if g.Head == pos {return true}}return false
}// HandleInput 处理玩家输入
func (g *Game) HandleInput() {if ebiten.IsKeyPressed(ebiten.KeyEscape) {os.Exit(0) // 按下 Esc 键退出游戏}if ebiten.IsKeyPressed(ebiten.KeyP) {g.Paused = !g.Paused // 按下 P 键切换暂停状态}if !g.Paused && !g.GameOver {// 处理方向键输入if ebiten.IsKeyPressed(ebiten.KeyLeft) && g.Dir != RIGHT {g.Dir = LEFT}if ebiten.IsKeyPressed(ebiten.KeyRight) && g.Dir != LEFT {g.Dir = RIGHT}if ebiten.IsKeyPressed(ebiten.KeyUp) && g.Dir != DOWN {g.Dir = UP}if ebiten.IsKeyPressed(ebiten.KeyDown) && g.Dir != UP {g.Dir = DOWN}}
}// Reset 重置游戏状态
func (g *Game) Reset() {g.Head = Pos{2, 0}                                     // 初始化蛇头位置g.Body = []Pos{{1, 0}, {0, 0}}                         // 初始化蛇身g.Food = Pos{rand.IntN(GridSize), rand.IntN(GridSize)} // 初始化食物位置g.Dir = RIGHT                                          // 初始方向向右g.Score = 0                                            // 重置分数g.GameOver = false                                     // 重置游戏结束状态g.Paused = false                                       // 重置暂停状态g.TickCount = 0                                        // 重置计数器
}

相关文章:

Go Ebiten小游戏开发:贪吃蛇

贪吃蛇是一款经典的小游戏&#xff0c;玩法简单却充满乐趣。本文将介绍如何使用 Go 语言和 Ebiten 游戏引擎开发一个简单的贪吃蛇游戏。通过这个项目&#xff0c;你可以学习到游戏开发的基本流程、Ebiten 的使用方法以及如何用 Go 实现游戏逻辑。 项目简介 贪吃蛇的核心玩法是…...

c语言----------内存管理

内存管理 目录 一。作用域1.1 局部变量1.2 静态(static)局部变量1.3 全局变量1.4 静态(static)全局变量1.5 extern全局变量声明1.6 全局函数和静态函数1.7 总结 二。内存布局2.1 内存分区2.2 存储类型总结2.3内存操作函数1) memset()2) memcpy()3) memmove()4) memcmp() 2.4 堆…...

在一个sql select中作多个sum并分组

有表如下&#xff1b; 单独的对某一个列作sum并分组&#xff0c;结果如下&#xff1b; 对于表的第7、8行&#xff0c;num1都有值&#xff0c;num2都是null&#xff0c;对num2列作sum、按id分组&#xff0c;结果在id为4的行会显示一个null&#xff1b; 同时对2个列作sum&#x…...

如何修复Android上未安装的应用程序

在Android设备上安装应用程序通常是一个简单的过程。然而&#xff0c;“ Android上未安装应用程序”是一种常见的智能手机错误消息&#xff0c;由于一个或多个原因而经常遇到。发现由于即将出现故障而无法充分利用手机&#xff0c;这当然会非常令人沮丧&#xff0c;但幸运的是&…...

#CSS混合模式:解决渐变背景下的文字可见性问题

在现代网页设计中&#xff0c;渐变背景的使用越来越普遍。然而&#xff0c;当我们在渐变背景上放置文字时&#xff0c;常常会遇到一个问题&#xff1a;文字在某些背景颜色下可能变得难以阅读。今天&#xff0c;我们将探讨一个优雅的解决方案&#xff1a;使用CSS混合模式。 问题…...

微信小程序原生与 H5 交互方式

在微信小程序中&#xff0c;原生与 H5 页面&#xff08;即 WebView 页面&#xff09;之间的交互通常有以下几种方式&#xff1a; 1. 使用 postMessage 进行通信 微信小程序的 WebView 页面和原生小程序页面可以通过 postMessage 来进行数据传递。 WebView 页面向原生小程序发…...

kotlin中的flow使用,Flow跟生命周期结合

kotlin的Flow可以连续异步发出多个数据。 1. 普通flow,冷流类似于一个函数&#xff0c;当开始收集时才开始运行 val coldStream flow {for (i in 1..5) {delay(100L)emit(i)}} val collect1 buildString {coldStream.collect { append(it).append(", ") } }.remo…...

讲一下ZooKeeper的持久化机制?

大家好&#xff0c;我是锋哥。今天分享关于【讲一下ZooKeeper的持久化机制&#xff1f;】面试题。希望对大家有帮助&#xff1b; 讲一下ZooKeeper的持久化机制&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ZooKeeper 是一个开源的分布式协调服务&…...

mybatis里面实现动态升降序

问题 最近有一个需求&#xff0c;需要前端告诉后端按照某个字段进行排序。这里主要侧重mybatis的xml实现&#xff0c;其他Spring集成就忽略了。 mapper xml实现 <if test"sortField ! null and sortField ! ">ORDER BY<choose><when test"sor…...

探索网络安全:浅析文件上传漏洞

前言 在数字化时代&#xff0c;网络安全已成为我们每个人都需要关注的重要议题。无论是个人隐私保护&#xff0c;还是企业数据安全&#xff0c;网络威胁无处不在。了解网络安全的基本知识和防护措施&#xff0c;对我们每个人来说都至关重要。 网络安全 网络安全并非只是对网…...

【C++】B2112 石头剪子布

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述游戏规则&#xff1a;输入格式&#xff1a;输出格式&#xff1a;输入输出样例&#xff1a;解题分析与实现 &#x1f4af;我的做法实现逻辑优点与不足 &#x1f4af…...

java根据模板导出word,并在word中插入echarts相关统计图片以及表格

引入依赖创建word模板创建ftl模板文件保存的ftl可能会出现占位符分割的问题&#xff0c;需要处理将ftl文件中的图片的Base64删除&#xff0c;并使用占位符代替插入表格&#xff0c;并指定表格的位置在图片下方 Echarts转图片根据模板生成word文档DocUtil导出word文档 生成的wor…...

Linux网络知识——路由表

路由表 1 定义与作用 Linux路由表是一个内核数据结构&#xff0c;用于描述Linux主机与其他网络设备之间的路径&#xff0c;以及如何将数据包从源地址路由到目标地址。路由表的主要作用是指导数据包在网络中的传输路径&#xff0c;确保数据包能够准确、高效地到达目标地址。 …...

ImageSharp图形库学习

一、引言 在当今数字化时代&#xff0c;无论是 Web 应用、桌面程序&#xff0c;还是移动应用&#xff0c;图像处理都扮演着至关重要的角色。从电商平台展示商品图片&#xff0c;到社交媒体分享照片&#xff0c;再到各种软件的图标设计&#xff0c;图像处理无处不在。博主们在内…...

Android string.xml中特殊字符转义

项目中要在string.xml 中显示特殊符号 空格&#xff1a; &#xff08;普通的英文半角空格但不换行&#xff09; 窄空格&#xff1a;  &#xff08;中文全角空格 &#xff08;一个中文宽度&#xff09;&#xff09; &#xff08;半个中文宽度&#xff0c;但两个空格比一个中文…...

Rust 游戏开发框架指南

Rust 游戏开发框架指南 主流游戏引擎 1. Bevy 最受欢迎的 Rust 游戏引擎之一&#xff0c;基于 ECS&#xff08;实体组件系统&#xff09;架构。 特点&#xff1a; &#x1f680; 高性能 ECS 系统&#x1f4e6; 热重载支持&#x1f3a8; 现代渲染器&#x1f50a; 内置音频系…...

SpringBoot3+Vue3开发台球计时系统

项目介绍 台球计时系统可以帮助我们自动计算开台时间&#xff08;从开始到结束的时间段&#xff09;、自动计算开台费用、结账后生成订单记录进行留存、也可以导出订单记录。 主要功能包含&#xff1a;球桌管理、开台、结账、查看占用明细、查看球台订单、订单管理、查看订单…...

基于springboot的租房网站系统

作者&#xff1a;学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等 文末获取“源码数据库万字文档PPT”&#xff0c;支持远程部署调试、运行安装。 项目包含&#xff1a; 完整源码数据库功能演示视频万字文档PPT 项目编码&#xff1…...

静态综合路由实验

实验拓扑 实验要求 1.除R5的环回地址外&#xff0c;整个其他所有网段基于192.168.1.0/24进行合理的IP地址划分 2.R1-R4每个路由器存在两个环回接口&#xff0c;用于模拟pc网段&#xff1b;地址也在192.168.1.0/24这个网络范围内 3.R1-R4上不能直接编写到达5.5.5.0/24的静态路由…...

国产编辑器EverEdit - 扩展脚本:新建同类型文件(避免编程学习者反复新建保存练习文件)

1 扩展脚本&#xff1a;在当前文件目录下新建同类型文件 1.1 应用场景 用户在进行编程语言学习时&#xff0c;比如&#xff1a;Python&#xff0c;经常做完一个小练习后&#xff0c;又需要新建一个文件&#xff0c;在新建文件的时候&#xff0c;不但要选择文件类型&#xff0c…...

Ubuntu Server 24.04 配置静态IP

Ubuntu Server 24.04 配置静态IP 提示&#xff1a;基于Ubuntu Server 24.04进行配置 文章目录 Ubuntu Server 24.04 配置静态IP一、查看网卡信息二、修改网卡信息三、使网卡配置生效四、测试 一、查看网卡信息 使用命令 ip a lo 为本地回环地址 ens33 真实网卡地址 shanfengubu…...

​​​​​​​​​​​​​​★3.3 事件处理

★3.3.1 ※MouseArea Item <-- MouseArea 属性 acceptedButtons : Qt::MouseButtons containsMouse : bool 【书】只读属性。表明当前鼠标光标是否在MouseArea上&#xff0c;默认只有鼠标的一个按钮处于按下状态时才可以被检测到。 containsPress : bool curs…...

linux系统监视(centos 7)

一.系统监视 1.安装iostat&#xff0c;sar&#xff0c;sysstat&#xff08;默认没有&#xff0c;安装过可以跳跃&#xff09; iostat 和 sar&#xff1a; 同样&#xff0c;iostat 和 sar 是 sysstat 软件包的一部分。使用以下命令安装&#xff1a;sudo yum install sysstat解释…...

Java面试总结(1)

问题1 自我介绍&#xff1a; 面试官您好&#xff0c;我叫xxx&#xff0c;是来自xxxx大学软件工程专业的一名应届生&#xff0c;我这次想应聘的是java开发实习生&#xff0c;在校期间&#xff0c;我热爱编程&#xff0c;能够使用java&#xff0c;C,python的编程语言&#xff0c…...

晨辉面试抽签和评分管理系统之六:面试答题倒计时

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…...

关于H5复制ios没有效果

问题场景&#xff1a;今天遇到这样一个问题&#xff0c;需要从后端接口获取到的值进行复制&#xff0c;且不能提现调用获取值&#xff0c;因为是一个数据列表&#xff0c;每个列表元素需要当场点击调用接口获取值进行复制&#xff0c;本来以为很简单的一个需求&#xff0c;当做…...

Windows 蓝牙驱动开发-安装蓝牙设备

蓝牙配置文件驱动程序有两种安装类型&#xff1a; 客户端安装&#xff0c;在此类安装中&#xff0c;远程设备播发其服务&#xff0c;并且计算机与之连接。 示例包括&#xff1a;鼠标、键盘和打印机&#xff1b;服务器端安装&#xff0c;在此类安装中&#xff0c;计算机播发服务…...

你喜欢用什么编辑器?

电脑工作者和程序员所使用的文本编辑器通常需要具备高效率、易用性以及对代码友好等特点&#xff0c;包括语法高亮、自动完成、多文件同时编辑、查找替换、版本控制集成等功能。以下是几个广受开发者欢迎且实用性较强的文本编辑器&#xff1a; Visual Studio Code&#xff08;V…...

32_Redis分片集群原理

1.Redis集群分片 1.1 Redis集群分片介绍 Redis集群没有使用一致性hash,而是引入了哈希槽的概念。Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽。 用于将密钥映射到散列插槽的基本算法如下: HASH_SLOT = CRC16(key) mod 16384 集群的每…...

小米vela系统(基于开源nuttx内核)——openvela开源项目

前言 在 2024 年 12 月 27 日的小米「人车家全生态」合作伙伴大会上&#xff0c;小米宣布全面开源 Vela 操作系统。同时&#xff0c;OpenVela 项目正式上线 GitHub 和 Gitee&#xff0c;采用的是比较宽松的 Apache 2.0 协议&#xff0c;这意味着全球的开发者都可以参与到 Vela…...

【STM32-学习笔记-7-】USART串口通信

文章目录 USART串口通信Ⅰ、硬件电路Ⅱ、常见的电平标准Ⅲ、串口参数及时序Ⅳ、STM32的USART简介数据帧起始位侦测数据采样波特率发生器 Ⅴ、USART函数介绍Ⅵ、USART_InitTypeDef结构体参数1、USART_BaudRate2、USART_WordLength3、USART_StopBits4、USART_Parity5、USART_Mode…...

实现类似Excel的筛选

以下是在 DataGridView 中实现类似 Excel 下拉筛选功能的解决方案&#xff1a; 解决思路 为 DataGridView 的列添加 DataGridViewComboBoxColumn 类型的列&#xff0c;用于显示下拉筛选列表。为 DataGridView 的 ColumnHeaderMouseClick 事件添加处理程序&#xff0c;当用户点…...

【Rust】结构体定义域实例化

目录 思维导图 1. 结构体的定义与实例化 1.1 结构体的基本概念 1.2 定义结构体 1.3 创建结构体实例 1.4 结构体的定义与实例化示例 2. 访问与修改结构体字段 2.1 访问字段 2.2 修改字段 3. 结构体实例的构造函数 3.1 构造函数的定义 3.2 使用字段初始化简写 4. 结…...

VB.NET 正则表达式完全指南

VB.NET 正则表达式完全指南 VB.NET通过 System.Text.RegularExpressions 命名空间提供正则表达式支持。本指南将详细介绍VB.NET中正则表达式的使用方法、性能优化和最佳实践。 1. 基础知识 1.1 导入命名空间 Imports System.Text.RegularExpressions1.2 基本使用 Public C…...

ASP.NET Core - 配置系统之自定义配置提供程序

ASP.NET Core - 配置系统之自定义配置提供程序 4. 自定义配置提供程序IConfigurationSourceIConfigurationProvider 4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现&…...

大语言模型的稀疏性:提升效率与性能的新方向

大语言模型的稀疏性&#xff1a;提升效率与性能的新方向 大语言模型&#xff08;LLM, Large Language Model&#xff09;随着参数规模的不断扩大&#xff0c;其性能得到了显著提升&#xff0c;但也带来了巨大的计算和存储开销。稀疏性&#xff08;Sparsity&#xff09;作为一种…...

迅为RK3568开发板篇OpenHarmony配置HDF驱动控制LED-新增 topeet子系统-编写 bundle.json文件

bundle.json 文件内容如下所示&#xff1a; 下面是对各个字段的解释&#xff1a; 1. name: "ohos/demos" - 这是组件或项目的名称&#xff0c;这里表示它属于 OHOS&#xff08;OpenHarmony OS&#xff09;生态系统下的一个名为"demos"的组件。 2. descri…...

vulnhub靶场【IA系列】之Tornado

前言 靶机&#xff1a;IA-Tornado&#xff0c;IP地址为192.168.10.11 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用虚拟机&#xff0c;网卡为桥接模式 本文所用靶场、kali镜像以及相关工具&#xff0c;我放置在网盘中&#xff0c;可以复制后面链接查看 htt…...

GB44495-2024 汽车整车信息安全技术要求 - V2X部分前置要求

背景 GB 44495-2024《汽车整车信息安全技术要求》中关于V2X&#xff08;车与外界通信&#xff09;的部分&#xff0c;主要关注于通信安全要求&#xff0c;旨在确保车辆在与外部设备进行数据交互时的信息安全。其测试大致可分为消息层&#xff08;数据无异常&#xff09;、应用…...

基于mediapipe的手势游戏控制

基于mediapipe的手势游戏控制 ​ 玩游戏&#xff0c;那不是有手就行!!! mediapipe介绍 ​ Mediapipe是Google在2019年开发并提出的一款开源的跨平台多媒体处理框架&#xff0c;用于构建基于机器学习的应用程序&#xff0c;特别是涉及到计算机视觉、音频处理、姿势估计等领域。…...

K8S 节点选择器

今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8…...

IEC103 转 ModbusTCP 网关

一、产品概述 IEC103 转 ModbusTCP 网关型号 SG-TCP-IEC103 &#xff0c;是三格电子推出的工业级网关&#xff08;以下简 称网关&#xff09;&#xff0c;主要用于 IEC103 数据采集、 DLT645-1997/2007 数据采集&#xff0c; IEC103 支持遥测和遥 信&#xff0c;可接…...

docker swarm 部署问题 和 指定节点部署服务

问题原因&#xff1a; docker swarm 部署遇到的问题&#xff0c; 先前docker compose部署&#xff0c;分别创建了 cloud 网络&#xff1b; 昨进行swarm 集群部署&#xff1b;只是删了57 机器cloud 网络&#xff1b;在创建swarm集群后创建cloud 58机器 没有删除先前的cloud 网络…...

09.VSCODE:安装 Git for Windows

在 Windows 下安装著名的源代码管理工具&#xff1a;git。 git 工具两大作用&#xff1a; 管理我们自己的源代码获取他人&#xff08;开源的&#xff09;源代码 当前我们更需要第2点。 为什么要安装 git 一、 得到更多库 之前课程中我们安装了 msys2&#xff0c;从而可以通…...

基于R计算皮尔逊相关系数

# 基于R计算皮尔逊相关系数 # 函数 基本基本函数 cor.test ## 两组数据读入 xread.csv("1.csv",header T) yread.csv("2.csv",header T) ## 计算 cor.test(1,2,method"pearson") 结果 Pearsons product-moment correlationdata: 1 and 2…...

vue 纯前端导出 Excel

方法一&#xff1a; 1、安装"file-saver" npm i -S file-saver xlsx 2、引入 在需要导出功能的 .vue 文件中引入 import FileSaver from "file-saver"; import XLSX from "xlsx"; 3、简单示例&#xff08;复制即可食用&#xff09;&#x…...

APISQL在线一键安装教程

本文档将指导您在 Linux 服务器上使用 Docker 安装 APISQL 软件。提供了两种安装方式&#xff1a;在线安装和离线安装&#xff0c;您可以根据实际环境选择合适的安装方式。 1. 准备工作 1.1 硬件要求 Linux (x86_64) 服务器 1.2 软件要求 Docker Engine 推荐版本&#xff…...

数据结构《MapSet哈希表》

文章目录 一、搜索树1.1 定义1.2 模拟实现搜索 二、Map2.1 定义2.2 Map.Entry2.3 TreeMap的使用2.4 Map的常用方法 三、Set3.1 定义3.2 TreeSet的使用3.3 Set的常用方法 四、哈希表4.1 哈希表的概念4.2 冲突4.2.1 冲突的概念4.2.2 冲突的避免1. 选择合适的哈希函数2. 负载因子调…...

【PCL】sample_consensus 模块—— Random Sample Consensus model(随机样本一致性模型,RANSAC)

1、随机样本一致性模型&#xff08;RANSAC&#xff09;简介 在本教程中&#xff0c;我们将学习如何使用带有平面模型的随机样本一致性&#xff08;RANSAC&#xff09;来获取适合该模型的点云。 1.1理论背景 RANSAC 是“随机样本一致性”&#xff08;RANdom SAmple Consensus…...

【MATLAB代码】CV和CA模型组成的IMM(滤波方式为UKF),可复制粘贴源代码

该代码实现了一维无迹卡尔曼滤波器(UKF)与交互式多模型(IMM)结合的状态估计。代码分为多个部分,主要功能包括参数定义、观测数据生成、状态估计、模型更新以及结果可视化。 文章目录 运行结果程序代码主要功能代码结构应用场景注意事项运行结果 程序代码 下方源代码直接粘…...