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

厦门 外贸网站dw网站站点正确建设方式

厦门 外贸网站,dw网站站点正确建设方式,微信登录 网站开发,东莞热的建设网站引言 迷宫生成是计算机科学中一个经典的问题#xff0c;常用于算法教学和游戏开发。本文将介绍如何使用 Go 语言和 Ebiten 游戏引擎实现一个基于深度优先搜索#xff08;DFS#xff09;的随机迷宫生成算法#xff0c;并通过可视化的方式展示迷宫的生成过程。 技术栈 Go … 引言 迷宫生成是计算机科学中一个经典的问题常用于算法教学和游戏开发。本文将介绍如何使用 Go 语言和 Ebiten 游戏引擎实现一个基于深度优先搜索DFS的随机迷宫生成算法并通过可视化的方式展示迷宫的生成过程。 技术栈 Go 语言一种高效、简洁的编程语言适合实现算法和并发任务。Ebiten一个轻量级的 2D 游戏引擎适合快速开发简单的图形应用程序。深度优先搜索DFS一种经典的图遍历算法用于生成随机迷宫。 算法原理 深度优先搜索DFS DFS 是一种用于遍历或搜索树或图的算法。在迷宫生成中我们可以将迷宫看作一个图每个块是一个节点墙是节点之间的边。DFS 通过随机选择邻居节点并打破墙来生成迷宫。 栈回溯 为了确保迷宫生成的完整性我们使用栈来记录访问路径。当当前块没有未访问的邻居时通过栈回溯到上一个未完全探索的块继续生成迷宫。 #mermaid-svg-E6KsdaGQtraW31oK {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-E6KsdaGQtraW31oK .error-icon{fill:#552222;}#mermaid-svg-E6KsdaGQtraW31oK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-E6KsdaGQtraW31oK .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-E6KsdaGQtraW31oK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-E6KsdaGQtraW31oK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-E6KsdaGQtraW31oK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-E6KsdaGQtraW31oK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-E6KsdaGQtraW31oK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-E6KsdaGQtraW31oK .marker.cross{stroke:#333333;}#mermaid-svg-E6KsdaGQtraW31oK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-E6KsdaGQtraW31oK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-E6KsdaGQtraW31oK .cluster-label text{fill:#333;}#mermaid-svg-E6KsdaGQtraW31oK .cluster-label span{color:#333;}#mermaid-svg-E6KsdaGQtraW31oK .label text,#mermaid-svg-E6KsdaGQtraW31oK span{fill:#333;color:#333;}#mermaid-svg-E6KsdaGQtraW31oK .node rect,#mermaid-svg-E6KsdaGQtraW31oK .node circle,#mermaid-svg-E6KsdaGQtraW31oK .node ellipse,#mermaid-svg-E6KsdaGQtraW31oK .node polygon,#mermaid-svg-E6KsdaGQtraW31oK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-E6KsdaGQtraW31oK .node .label{text-align:center;}#mermaid-svg-E6KsdaGQtraW31oK .node.clickable{cursor:pointer;}#mermaid-svg-E6KsdaGQtraW31oK .arrowheadPath{fill:#333333;}#mermaid-svg-E6KsdaGQtraW31oK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-E6KsdaGQtraW31oK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-E6KsdaGQtraW31oK .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-E6KsdaGQtraW31oK .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-E6KsdaGQtraW31oK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-E6KsdaGQtraW31oK .cluster text{fill:#333;}#mermaid-svg-E6KsdaGQtraW31oK .cluster span{color:#333;}#mermaid-svg-E6KsdaGQtraW31oK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-E6KsdaGQtraW31oK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是 否 是 否 是 否 开始 初始化游戏状态 设置随机种子 随机选择起始位置 进入游戏循环 是否所有块已访问? 结束 标记当前块为已访问 查找当前块的未访问邻居 是否有未访问邻居? 随机选择一个邻居 将当前位置压入栈 打破当前块与邻居之间的墙 移动到邻居块 栈是否为空? 从栈中弹出上一个位置 代码实现 package mainimport (image/colormath/randostimegithub.com/hajimehoshi/ebiten/v2github.com/hajimehoshi/ebiten/v2/vector )const (N int 20 // 迷宫的行数和列数BlockSize int 50 // 每个迷宫块的大小像素WindowWidth int N*BlockSize 2*int(WW) // 窗口宽度WindowHeight int N*BlockSize 2*int(WW) // 窗口高度WW float32 2 // 墙的宽度像素BS float32 float32(BlockSize) // 块大小的浮点数表示 )// Pos 结构体表示一个二维坐标 type Pos struct {X, Y int }// Dirs 数组表示四个可能的移动方向上、左、右、下 var Dirs [4]Pos [4]Pos{Pos{0, -1}, Pos{-1, 0}, Pos{1, 0}, Pos{0, 1}}// Game 结构体表示游戏的状态 type Game struct {T int // 当前已访问的块数P Pos // 当前的位置Walls [N][N][4]bool // 记录每个块的四面墙是否存在IsVis [N][N]bool // 记录每个块是否被访问过Stack []Pos // 栈用于记录访问路径 }// Update 是 Ebiten 游戏循环中的更新函数每一帧调用一次 func (g *Game) Update() error {SystemFunction() // 处理系统功能如退出if g.T N*N { // 如果还有未访问的块g.Next() // 生成下一个块}return nil }// Draw 是 Ebiten 游戏循环中的绘制函数每一帧调用一次 func (g *Game) Draw(screen *ebiten.Image) {g.DrawWalls(screen) // 绘制迷宫的墙 }// Layout 设置游戏窗口的布局 func (g *Game) Layout(outsideWidth, outsideHeight int) (int, int) {return outsideWidth, outsideHeight }func main() {ebiten.SetWindowTitle(maze) // 设置窗口标题ebiten.SetWindowSize(WindowWidth, WindowHeight) // 设置窗口大小game : Game{P: Pos{rand.Intn(N), rand.Intn(N)}, // 随机选择一个起始位置Stack: make([]Pos, 0), // 初始化栈}if err : ebiten.RunGame(game); err ! nil { // 运行游戏panic(err)} }// SystemFunction 处理系统功能如退出游戏 func SystemFunction() {if ebiten.IsKeyPressed(ebiten.KeyEscape) { // 如果按下 ESC 键os.Exit(0) // 退出程序} }// DrawWalls 绘制迷宫的墙 func (g *Game) DrawWalls(screen *ebiten.Image) {if g.T N*N { // 如果还有未访问的块// 绘制当前块的位置红色方块vector.DrawFilledRect(screen, float32(g.P.X)*BS, float32(g.P.Y)*BS, BS, BS, color.RGBA{255, 0, 0, 255}, true)}// 遍历所有块绘制墙for i : 0; i N; i {for j : 0; j N; j {if !g.Walls[i][j][0] { // 如果上墙存在vector.DrawFilledRect(screen, float32(i)*BS, float32(j)*BS, BS, WW, color.White, true)}if !g.Walls[i][j][1] { // 如果左墙存在vector.DrawFilledRect(screen, float32(i)*BS, float32(j)*BS, WW, BS, color.White, true)}if !g.Walls[i][j][2] { // 如果右墙存在vector.DrawFilledRect(screen, float32(i1)*BS, float32(j)*BS, WW, BS, color.White, true)}if !g.Walls[i][j][3] { // 如果下墙存在vector.DrawFilledRect(screen, float32(i)*BS, float32(j1)*BS, BS, WW, color.White, true)}}} }// Next 生成迷宫的下一个块 func (g *Game) Next() {// check 函数检查给定的坐标是否在迷宫范围内且未被访问过check : func(x, y int) bool {return x 0 x N y 0 y N !g.IsVis[x][y]}// 标记当前块为已访问if !g.IsVis[g.P.X][g.P.Y] {g.IsVis[g.P.X][g.P.Y] trueg.T}// 查找当前块的所有未访问邻居var neighbors []intfor i : 0; i 4; i {if check(g.P.XDirs[i].X, g.P.YDirs[i].Y) {neighbors append(neighbors, i)}}if len(neighbors) 0 {// 如果有未访问的邻居随机选择一个方向d : neighbors[rand.Intn(len(neighbors))]g.Stack append(g.Stack, g.P) // 将当前位置压入栈g.Walls[g.P.X][g.P.Y][d] true // 打破当前块的墙g.P.X Dirs[d].X // 移动到邻居块g.P.Y Dirs[d].Yg.Walls[g.P.X][g.P.Y][3-d] true // 打破邻居块的对应墙} else if len(g.Stack) 0 {// 如果没有未访问的邻居回溯到上一个块g.P g.Stack[len(g.Stack)-1] // 弹出栈顶元素g.Stack g.Stack[:len(g.Stack)-1]} }
http://www.hkea.cn/news/14387165/

相关文章:

  • 站长统计app进入网址凡客诚品什么档次
  • 杭州专业网站设计制作辽宁企业网站建设
  • gta5 网站正在建设中织梦网站背景音乐
  • delphi 可做网站吗手机图片编辑器
  • 知名网站建设联系电话大淘客网站开发
  • 长春做网站qianceyun福田做网站公司怎么选
  • 爱站网怎么用天猫注册店铺流程及费用
  • 广东省住房城乡建设厅官方网站应用软件设计过程
  • 商务网站建设一万字forpress wordpress wp
  • 网站如何paypal支付网站空间如何申请
  • 视频网站建设 方案广州sem代运营推广公司
  • 网站建设比较合理的流程是如何让网站做网页适配
  • 自己动手的网站深圳外贸建站模板
  • 网站建设怎么骗人wordpress 新浪微博
  • 北京建设工程质量总站网站专业的移动客户端网站建设
  • 做彩铃的网站济南网站建设公司电子商务网站
  • 网站所有权问题做个网站需要多少钱?有没有旧装修要拆
  • ppt网站建设答案电器网站模板
  • 网站流量功能更怎么做淘宝seo关键词的获取方法有哪些
  • 国内做网站哪家好百度云建网站
  • qq群推广网站免费秒进淘宝客优惠卷网站怎么做的
  • 南皮县网站建设wordpress底部添加工信部链接
  • 企业网站管理系统cms源码下载wordpress 相册主题
  • 建筑公司网站董事长致辞网站建设优化推广教程
  • 中国怎么进fiverr网站做任务品牌全案策划
  • 各人可做的外贸网站网页打不开pdf文件如何设置
  • 有没有专门做老年婚介的网站汽车用品网站规划
  • 如何做免费域名网站亳州做网站哪家好
  • 一个网站做多少内链合适专业建设网站建站
  • 丹东网站建就有公司域名怎么建设网站