golang奇幻名称生成器插件库fantasyname的使用

golang奇幻名称生成器插件库fantasyname的使用

这是一个基于RinkWorks描述的命名生成器的Golang实现,代码源自https://github.com/skeeto/fantasyname。

示例

使用示例:

import (
    "fmt"
    "log"
    "time"
    "math/rand"

    fn "github.com/s0rg/fantasyname"
)

func main() {
    rand.Seed(time.Now().UnixNano())

    // 编译名称生成器模式
    // sV'i 模式表示:音节 + 元音组合 + 单引号 + 侮辱词
    // Collapse(true) 表示压缩连续重复字符
    // RandFn(rand.Intn) 使用标准库的随机数生成器
    gen, err := fn.Compile("sV'i", fn.Collapse(true), fn.RandFn(rand.Intn))
    if err != nil {
        log.Fatal(err)
    }

    // 生成并打印奇幻名称,例如:entheu'loaf
    fmt.Println(gen.String())
}

你可以运行这个示例来查看结果。

模式语法

字母s, v, V, c, B, C, i, m, M, D, 和 d代表不同类型的随机替换:

  • s - 通用音节
  • v - 元音
  • V - 元音或元音组合
  • c - 辅音
  • B - 适合单词开头的辅音或辅音组合
  • C - 适合单词任何位置的辅音或辅音组合
  • i - 侮辱词
  • m - 黏糊糊的名字
  • M - 黏糊糊的名字结尾
  • D - 适合愚蠢人名的辅音
  • d - 适合愚蠢人名的音节(以元音开头)

其他字符会原样输出。

括号()内的所有字符都会原样输出。例如,模式s(dim)会输出一个随机通用音节后跟dim

尖括号<>内的字符会从上面的表格中发出模式。可以想象整个模式都包裹在其中一个中。

在这两种分组中,竖线|表示随机选择。允许空组。例如,(foo|bar)会发出foobar。模式<c|v|>会发出辅音、元音或什么都不发出。

感叹号!表示大写后面跟随的组件。例如,!(foo)会发出Foo,而v!s会发出小写元音后跟大写的音节,如eRod

完整示例

package main

import (
	"fmt"
	"log"
	"math/rand"
	"time"

	fn "github.com/s0rg/fantasyname"
)

func main() {
	rand.Seed(time.Now().UnixNano())

	// 定义不同的名称生成模式
	patterns := []string{
		"sV'i",      // 音节+元音组合+单引号+侮辱词
		"!Cv!c",     // 大写辅音组合+小写元音+大写辅音
		"(The )!cV", // "The " + 大写辅音 + 元音组合
		"<B|M|v>",   // 开头辅音组合 或 黏糊名字结尾 或 元音
	}

	for _, p := range patterns {
		// 为每个模式创建生成器
		gen, err := fn.Compile(p, fn.Collapse(true), fn.RandFn(rand.Intn))
		if err != nil {
			log.Fatal(err)
		}

		// 生成5个名称
		fmt.Printf("Pattern: %q\n", p)
		for i := 0; i < 5; i++ {
			fmt.Println("  ", gen.String())
		}
		fmt.Println()
	}
}

这个完整示例展示了如何使用不同的模式生成奇幻名称,每个模式生成5个示例名称。


更多关于golang奇幻名称生成器插件库fantasyname的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang奇幻名称生成器插件库fantasyname的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang奇幻名称生成器插件库fantasyname使用指南

fantasyname是一个用于生成奇幻风格名称的Golang库,非常适合游戏开发、小说创作等需要随机名称的场景。下面我将详细介绍如何使用这个库。

安装

首先安装fantasyname库:

go get github.com/jasondavies/fantasyname

基本用法

1. 简单名称生成

package main

import (
	"fmt"
	"github.com/jasondavies/fantasyname"
)

func main() {
	// 创建一个新的名称生成器
	generator := fantasyname.New()

	// 生成一个随机名称
	name := generator.Generate()
	fmt.Println("随机奇幻名称:", name)
}

2. 使用特定模式生成

fantasyname支持使用模式字符串来定义名称生成规则:

func main() {
	// 定义名称生成模式
	pattern := "sV'i"
	
	// 创建带有模式的生成器
	generator := fantasyname.New(fantasyname.WithPattern(pattern))
	
	// 生成多个名称
	for i := 0; i < 5; i++ {
		name := generator.Generate()
		fmt.Println(name)
	}
}

模式语法

fantasyname使用特殊字符定义名称结构:

  • C - 辅音
  • V - 元音
  • v - 元音或"y"
  • c - 辅音或"y"
  • s - 音节
  • i - 从内置列表中随机选择一个音节
  • ' - 插入撇号
  • - 插入空格
  • - - 插入连字符
  • D - 随机辅音组合
  • d - 随机元音组合

示例模式

patterns := []string{
	"sVsVs",  // 3音节名称 (如 "Aelarion")
	"CvCvC",  // 交替辅音元音 (如 "Kyrin")
	"s s",    // 两个单词名称 (如 "Shadow Fang")
	"s's",    // 带撇号名称 (如 "D'rizzt")
	"s-i",    // 带连字符名称 (如 "Storm-born")
}

高级用法

1. 自定义音节列表

func main() {
	// 自定义音节列表
	syllables := []string{
		"ael", "thor", "wyn", "mir", "dri", 
		"zzt", "storm", "shadow", "blade",
	}
	
	generator := fantasyname.New(
		fantasyname.WithSyllables(syllables),
		fantasyname.WithPattern("sVs"),
	)
	
	fmt.Println(generator.Generate())
}

2. 组合多个模式

func main() {
	generator := fantasyname.New(
		fantasyname.WithPatterns([]string{
			"s s",
			"s's",
			"s the s",
		}),
	)
	
	for i := 0; i < 10; i++ {
		fmt.Println(generator.Generate())
	}
}

3. 创建特定种族的名称生成器

func createElfNameGenerator() *fantasyname.Generator {
	return fantasyname.New(
		fantasyname.WithSyllables([]string{
			"ael", "ar", "il", "or", "wyn", 
			"thas", "mir", "riel", "dri", "van",
		}),
		fantasyname.WithPattern("sVs"),
	)
}

func createDwarfNameGenerator() *fantasyname.Generator {
	return fantasyname.New(
		fantasyname.WithSyllables([]string{
			"thor", "bal", "din", "grim", "morg",
			"thrain", "dwal", "gim", "nor", "fund",
		}),
		fantasyname.WithPattern("s's"),
	)
}

func main() {
	elfGen := createElfNameGenerator()
	dwarfGen := createDwarfNameGenerator()
	
	fmt.Println("精灵名字:", elfGen.Generate())
	fmt.Println("矮人名字:", dwarfGen.Generate())
}

实用技巧

  1. 缓存生成器:如果需要频繁生成名称,最好重用生成器实例而不是每次都创建新的。

  2. 名称唯一性:如果需要确保名称唯一,可以维护一个map来检查重复。

  3. 组合使用:可以组合多个生成器来创建更复杂的名称系统,如"名字 + 姓氏"或"称号 + 名字"。

  4. 过滤不当名称:有时生成的名称可能有不良含义,可以添加过滤逻辑。

fantasyname库简单易用但功能强大,通过合理设计模式和音节列表,你可以为你的奇幻世界创建各种风格的独特名称。

回到顶部