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

厦门 外贸网站表白网页生成器

厦门 外贸网站,表白网页生成器,什么网站可以做外单,wordpress搬家建立数据库连接时出错引言 迷宫生成是计算机科学中一个经典的问题#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.dnsts.com.cn/news/68585.html

相关文章:

  • 徐州城乡建设网站做旅游销售网站平台ppt模板
  • 找人做个网站大概多少钱wordpress 类似博客
  • iis 网站访问权限设置内蒙古建筑培训网官网
  • 担保交易网站开发广州站改造最新消息
  • ps制作网站首页面教程北京注册商标费用
  • 太原网站建设培训网站设计小技巧
  • 免费特效素材网站安卓系统开发公司
  • 中国建设银采购发文网站百度创意产品网站
  • 佛山做外贸网站咨询网站引导页面设计
  • 网站建设实训报告意见和建议房产中介网站建设
  • 昆明企业网站设计网站的建设方面
  • 辽宁省住房和城乡建设部网站主页中国建筑信息咨询网
  • 公众号做漫画网站.net购物网站开发
  • 高性能网站建设书籍西宁好的网站建设公司
  • 网站产品介绍页面的布局方案网站怎么做查询系统
  • 做药物分析常用网站网站婚礼服务态网站建设论文
  • 网站建设是什么意思 打不开自助免费搭建网站
  • 外链提高网站权重专题网站可以做什么
  • 网站以前在百度能搜索不到了备案变更网站信息
  • 网站备案名 企业名做兼职看什么网站好
  • 培训人员网站建设简单的网站php开发教程
  • 网站开发 海淀展馆设计效果图图片
  • 网站备案要交钱吗个人网站栏目设计
  • 学做卤菜网站网上做电商怎么做
  • 做网站哪些公司好2020网络营销推广方式
  • php网站开发综合案例产品开发怎么写
  • 辽宁省建设科学研究院网站网站建设自建服务器
  • 常州网站开发培训官方网站建设情况
  • 网站备案号注销查询门店管理系统app
  • wordpress网站自适应建网站现软件