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

自己做免费网站难吗网络推广员具体做什么的

自己做免费网站难吗,网络推广员具体做什么的,jsp网站建设作业,建设一个网站的支出一、前言 在游戏中,任务是非常常见的玩法,可能会有主线任务,支线任务以及其它一些类型的任务,各任务可能还会有前置任务,即需要完成某个任务之后,才能做当前任务。在游戏开发中,配置表可以使用…

一、前言

在游戏中,任务是非常常见的玩法,可能会有主线任务,支线任务以及其它一些类型的任务,各任务可能还会有前置任务,即需要完成某个任务之后,才能做当前任务。在游戏开发中,配置表可以使用Excel来编辑,如果是任务表,可能会是如下配置方式:

TaskIDTaskTitlePreTask
10任务100
20任务200
11任务1110
21任务2120

当任务比较多的时候,它们的依赖关系将变得不直观,很容易出错,出错也不容易发现。

有没比较直观的方式进行查看,排错呢?笔者想到了目前非常流程的Markdown文件,它可以简单地通过文本的方式输入然后输出强大的各种图表。这里就可以使用mermaid图来直观展现。

关于mermaid图可以去官网https://mermaid.js.org/intro/查看用例。

下图为生成后的效果图:

0:无效任务ID
21:任务21
20:任务20
11:任务11
10:任务10

注意:mermaid图在渲染时,如果不设置subgraph则可能会出现乱序问题,即不是按代码中出现的顺序渲染。

二、实现

为了方便Go读取Excel,需要使用相关的Excel库,笔者使用excelize库。

根据前面的效果图,可以知道,这其实就是一个深度优先的树,实现方式有两种,一种是使用递归的方式来实现,这种方式实现起来简单,但是如果层次很深,那可能会出现栈溢出;另一种方式就是使用栈的方式来实现,将每一层节点先压栈,然后从栈顶取出一个节点然后再将其所有子节点入栈,再从栈顶取出一个节点处理,依此类推,直到栈中所有节点处理完毕。

下面列出使用递归方式实现的版本:

/*
MIT License# Copyright (c) 2023 WittonBellPermission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
package mainimport ("flag""fmt""os""path/filepath""strings""github.com/xuri/excelize/v2"
)var taskIDField string
var taskTitleField string
var preTaskField string
var noCaseSensitive bool // 是否不区分大小写
var fieldNameRow uint    // 字段名所在行号
var dataStartRow uint    // 数据开始行号type node struct {taskID    stringtaskTitle string
}type multiMap map[string][]*nodefunc (slf multiMap) Add(key string, nd *node) {if len(slf) == 0 {slf[key] = []*node{nd}} else {slf[key] = append(slf[key], nd)}
}func (slf multiMap) Get(key string) []*node {if slf == nil {return nil}return slf[key]
}func (slf multiMap) Del(key string) {delete(slf, key)
}func searchKeyCol(rows *excelize.Rows) (TaskIDCol, PreTaskIDCol, TitleCol int) {row, err := rows.Columns()if err != nil {fmt.Println(err.Error())}for i, col := range row {name := colif noCaseSensitive {name = strings.ToLower(col)}if name == preTaskField {PreTaskIDCol = i + 1} else if name == taskIDField {TaskIDCol = i + 1} else if name == taskTitleField {TitleCol = i + 1}}return
}func readExcel(filePath string) multiMap {fd, err := excelize.OpenFile(filePath)if err != nil {fmt.Printf("读取文件`%s`失败", filePath)return nil}defer func() {fd.Close()}()TaskIDCol, PreTaskIDCol, TitleCol := -1, -1, -1sheetName := fd.GetSheetName(0)rows, err := fd.Rows(sheetName)if err != nil {return nil}defer func() {rows.Close()}()m := multiMap{}for i := 1; rows.Next(); i++ {if i == int(fieldNameRow) {TaskIDCol, PreTaskIDCol, TitleCol = searchKeyCol(rows)isOk := trueif TaskIDCol < 0 {isOk = falsefmt.Printf("要求字段名:%s\n", taskIDField)}if PreTaskIDCol < 0 {isOk = falsefmt.Printf("要求字段名:%s\n", preTaskField)}if TitleCol < 0 {isOk = falsefmt.Printf("要求字段名:%s\n", taskTitleField)}if !isOk {return nil}}if i < int(dataStartRow) {continue}TaskIDCell, err := excelize.CoordinatesToCellName(TaskIDCol, i)if err != nil {continue}PreTaskIDCell, err := excelize.CoordinatesToCellName(PreTaskIDCol, i)if err != nil {continue}TitleColCell, err := excelize.CoordinatesToCellName(TitleCol, i)if err != nil {continue}TaskID, err := fd.GetCellValue(sheetName, TaskIDCell)if err != nil || TaskID == "" {continue}Title, err := fd.GetCellValue(sheetName, TitleColCell)if err != nil || Title == "" {continue}PreTaskID, err := fd.GetCellValue(sheetName, PreTaskIDCell)if err != nil {continue}if PreTaskID == "" {PreTaskID = "0"}m.Add(PreTaskID, &node{taskID: TaskID, taskTitle: Title})}return m
}func usage() {w := flag.CommandLine.Output()fmt.Fprintf(w, "%s 应用程序是将Excel任务表中的关系转换成Markdown的mermaid图,方便使用Markdown工具直观地查看任务依赖。", filepath.Base(os.Args[0]))fmt.Fprintln(w)fmt.Fprintf(w, "命令格式:%s -hr [字段所在行号] -dr [数据起始行号] [-nc] -id [任务ID字段名] -t [任务标题字段名] -pid [前置任务ID字段名] -o <输出文件> <Excel文件路径>", filepath.Base(os.Args[0]))fmt.Fprintln(w)flag.CommandLine.PrintDefaults()fmt.Fprintln(w, "  -h")fmt.Fprintln(w, "    \t显示此帮助")
}func main() {var outputFile stringflag.CommandLine.Usage = usageflag.BoolVar(&noCaseSensitive, "nc", false, "字段名不区分大小写")flag.UintVar(&fieldNameRow, "hr", 1, "字段所在行号")flag.UintVar(&dataStartRow, "dr", 2, "数据起始行号")flag.StringVar(&taskIDField, "id", "ID", "-id [任务ID字段名]")flag.StringVar(&taskTitleField, "t", "Title", "-t [任务标题字段名]")flag.StringVar(&preTaskField, "pid", "PreTask", "-pid [前置任务ID字段名]")flag.StringVar(&outputFile, "o", "任务图.md", "-o <输出文件>")flag.Parse()if flag.NArg() < 1 {usage()return}if noCaseSensitive {taskIDField = strings.ToLower(taskIDField)taskTitleField = strings.ToLower(taskTitleField)preTaskField = strings.ToLower(preTaskField)}mapTask := readExcel(flag.Arg(0))buildGraph(mapTask, outputFile)
}func buildGraph(mapTask multiMap, outputFile string) {graph := "```mermaid\ngraph TB\n"graph += "subgraph  \n"root := mapTask.Get("0")for _, v := range root {graph += visit(rootNodeName, v, mapTask)}graph += "end\n"graph += "```"os.WriteFile(outputFile, []byte(graph), os.ModePerm)fmt.Println("完成")
}func visit(parent string, nd *node, mapTask multiMap) string {slice := mapTask.Get(nd.taskID)graph := fmt.Sprintf("%s --> %s:%s\n", parent, nd.taskID, nd.taskTitle)if parent == rootNodeName {graph += "subgraph  \n"}for _, x := range slice {graph += visit(fmt.Sprintf("%s:%s", nd.taskID, nd.taskTitle), x, mapTask)}mapTask.Del(nd.taskID)if parent == rootNodeName {graph += "end\n"}return graph
}

使用栈实现的版本笔者放在excelTask2md了。

http://www.hkea.cn/news/350417/

相关文章:

  • 网站如何做引流刷外链网站
  • wordpress 站点地址关注公众号一单一结兼职
  • 合肥网站建设第一品牌个人seo外包
  • 省心的免费建站服务热线四川seo关键词工具
  • 网站总是跳转dede58seo对网络推广的作用是
  • seo排名怎么提高seo排名优化软件有用
  • 江门论坛建站模板黑帽seo联系方式
  • 政府网站信息内容建设专项检查搜索引擎排名优化seo课后题
  • 个人做的好的淘宝客网站软文营销推广
  • 城乡建设委员会网站河北seo推广公司
  • 某网站栏目策划2022十大热点事件及评析
  • 德清网站建设中心优化大师官方免费下载
  • 生日网页制作免费网站制作代做网页设计平台
  • 学校类网站特点游戏优化大师官网
  • 手机电视网站大全河南网站建设定制
  • zblog做的商城网站上海有实力的seo推广咨询
  • 免费网站模板psd网络营销的整体概念
  • 网站模板下载破解版环球军事新闻最新消息
  • 徐汇苏州网站建设东莞免费建站公司
  • 厦门网站建设哪家强深圳网站维护
  • 政府网站新媒体平台建设关键词权重查询
  • 重庆网站建设制作公司百度客服人工在线咨询电话
  • 微信公众号平台入口官网奶盘seo伪原创工具
  • 泉州网站建设公司推荐宁德市地图
  • 大厂县住房和城乡建设局网站刷百度指数
  • 低代码开发平台优缺点昆山seo网站优化软件
  • 网站开发年终总结网络营销战略的内容
  • 建立门户网站的意义营销推广网
  • 网站建设网站软件有哪些百度推广开户费用标准
  • 找家装修公司家装吉林seo外包