中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

免費網絡推廣培訓課程seo網站優(yōu)化外包

免費網絡推廣培訓課程,seo網站優(yōu)化外包,企業(yè)網站源碼 asp,開外貿公司的流程及費用一、前言 在游戲中,任務是非常常見的玩法,可能會有主線任務,支線任務以及其它一些類型的任務,各任務可能還會有前置任務,即需要完成某個任務之后,才能做當前任務。在游戲開發(fā)中,配置表可以使用…

一、前言

在游戲中,任務是非常常見的玩法,可能會有主線任務,支線任務以及其它一些類型的任務,各任務可能還會有前置任務,即需要完成某個任務之后,才能做當前任務。在游戲開發(fā)中,配置表可以使用Excel來編輯,如果是任務表,可能會是如下配置方式:

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

當任務比較多的時候,它們的依賴關系將變得不直觀,很容易出錯,出錯也不容易發(fā)現(xiàn)。

有沒比較直觀的方式進行查看,排錯呢?筆者想到了目前非常流程的Markdown文件,它可以簡單地通過文本的方式輸入然后輸出強大的各種圖表。這里就可以使用mermaid圖來直觀展現(xiàn)。

關于mermaid圖可以去官網https://mermaid.js.org/intro/查看用例。

下圖為生成后的效果圖:

0:無效任務ID
21:任務21
20:任務20
11:任務11
10:任務10

注意:mermaid圖在渲染時,如果不設置subgraph則可能會出現(xiàn)亂序問題,即不是按代碼中出現(xiàn)的順序渲染。

二、實現(xiàn)

為了方便Go讀取Excel,需要使用相關的Excel庫,筆者使用excelize庫。

根據(jù)前面的效果圖,可以知道,這其實就是一個深度優(yōu)先的樹,實現(xiàn)方式有兩種,一種是使用遞歸的方式來實現(xiàn),這種方式實現(xiàn)起來簡單,但是如果層次很深,那可能會出現(xiàn)棧溢出;另一種方式就是使用棧的方式來實現(xiàn),將每一層節(jié)點先壓棧,然后從棧頂取出一個節(jié)點然后再將其所有子節(jié)點入棧,再從棧頂取出一個節(jié)點處理,依此類推,直到棧中所有節(jié)點處理完畢。

下面列出使用遞歸方式實現(xiàn)的版本:

/*
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 // 是否不區(qū)分大小寫
var fieldNameRow uint    // 字段名所在行號
var dataStartRow uint    // 數(shù)據(jù)開始行號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 [數(shù)據(jù)起始行號] [-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, "字段名不區(qū)分大小寫")flag.UintVar(&fieldNameRow, "hr", 1, "字段所在行號")flag.UintVar(&dataStartRow, "dr", 2, "數(shù)據(jù)起始行號")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
}

使用棧實現(xiàn)的版本筆者放在excelTask2md了。

http://www.risenshineclean.com/news/63964.html

相關文章:

  • 中文游戲制作軟件常州百度關鍵詞優(yōu)化
  • 做網站設像素國內廣告投放平臺
  • 網站域名登陸長沙seo優(yōu)化價格
  • 蘇州網站建設推廣服務百度電話怎么轉人工客服
  • 怎么做網站免費的刷贊百度seo正規(guī)優(yōu)化
  • 廣州網站外貿推廣seo有哪些網站
  • 哪家手表網站鞏義網絡推廣
  • 大型網站開發(fā) 框架網絡搜索關鍵詞排名
  • 凡科做的網站為什么打不開十大跨界營銷案例
  • 做網站需要哪些素材網站優(yōu)化排名軟件
  • wordpress javascript廣告插件seo排名推廣
  • 網站做優(yōu)化多少錢牛推網
  • 汶上云速網站建設如何找做網站的公司
  • 北京微信網站建設費用北京seo優(yōu)化公司
  • 網站建設有什么方法連接數(shù)據(jù)庫網絡營銷師證
  • 政府網站建設新模式網站排名優(yōu)化軟件聯(lián)系方式
  • 開鎖都在什么網站做最有效的推廣學校的方式
  • 諸城做網站找個人種子搜索神器 bt 下載
  • 網站建設 價格新聞軟文自助發(fā)布平臺
  • 大連app制作seo外包優(yōu)化網站
  • jsp做網站能實現(xiàn)什么功能百度網盤搜索引擎
  • .網站開發(fā)工具dw搜索引擎付費推廣
  • .net 創(chuàng)建網站項目網絡營銷的主要特點有哪些
  • 關于網站建設相關文章武漢 網絡 推廣
  • 南京網站流量優(yōu)化輕松seo優(yōu)化排名 快排
  • 建設公司網站要注意哪些杭州網站排名提升
  • 化妝品網站建設項目計劃書今日新聞頭條
  • wordpress建站速度提升免費推廣途徑與原因
  • 深圳網站設計價格表優(yōu)化大師下載舊版本安裝
  • 山東德州如何網站建設教程qq群排名優(yōu)化