go-starrail-compass

command module
v0.0.0-...-6e7763a Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 27, 2023 License: MIT Imports: 2 Imported by: 0

README

go-starrail-compass

用 Golang 实现的解决《崩坏:星穹铁道》引航罗盘谜题的代码。

  1. 消除了一些在 Python 中使用的语法糖,使代码逻辑易于理解和移植
  2. 保留了取模运算,因为在 Python 中 % 操作符默认是取模运算,而 Golang 中的 % 默认是取余数运算

缺陷

目前这个程序对下面这个案例无解,算法存在缺陷:

内环 中环 外环
转向 顺时针 逆时针 顺时针
转角 ∠120° ∠180° ∠180°
起始位置 ∠0° ∠180° ∠0°
A B C
方案 内+中 中+外 内+外

已知这个案例的解法是转动 3 次方案 A,在相对不改变内环位置的情况下,使得中环在第三次转动后归位。 但是目前本程序使用的算法会在某次计算 GCD 时,产生 getMul 返回 -1 错误计算出【无解】的结果。

我已找到了另一个更好的解决引航罗盘谜题的程序,建议前往 hksr-compass 这个仓库查看。 对于我这个代码存在的问题,可能我不会花太多时间去解决,因为目前来看全部引航罗盘谜题中只有一个特例,其他谜题均可以获得结果。

也建议使用 hksr-compass 提供的程序,可用性比我这个要改源代码的好很多。

关于 matrix 的格式

package main

import "fmt"

func main() {
	mod := 6
	matrix := [][]int{
		{-1, 0, -1, mod - 4},
		{-3, -3, 0, mod - 0},
		{0, 3, 3, mod - 0},
	}
	fmt.Println(matrix, mod)
}

引航罗盘一共有三个环,从里到外分别称为内环、中环、外环。映射到上述代码中的 matrix 矩阵,分别有:

  1. matrix[0] 是内环
  2. matrix[1] 是中环
  3. matrix[2] 是外环

每个谜题一共有三个转动方案,并且有 1 到 4 种转动角度,按照转动方向可以转换成数字向量来表达,即顺时针成正数,逆时针成负数。

映射到 matrix 矩阵上,则有:

  1. matrix[n][0] 代表方案 1 需要转动的情况,数值 0 代表不转动,其他向量值则表示需要转动
  2. 同理,matrix[n][1] 代表方案 2 需要转动的情况,matrix[n][2] 代表方案 3 需要转动的情况

矩阵的最后一列,即写作 mod - x 的一列,首先需要解释 mod 参数,这是一个表示引航罗盘被分成的角度数。 目前引航罗盘以供拆分了 6 个角度位,从 0 开始计算,分别有 0、1、2、3、4、5 一共 6 个角度,这些值分别代表:

  • 0: ∠0°
  • 1: ∠60°
  • 2: ∠120°
  • 3: ∠180°
  • 4: ∠240°
  • 5: ∠270°

对此我们声明了一个基础的 mod 值,设定 mod = 6,并声明 mod - xx 是当前圆环停留的刻度标识。

由此我们就可以使用一个矩阵来描述某一引航罗盘谜题的全部信息,用来求解需要转动的最终方案。

关于最终方案

运行 main 方法后,控制台会输出一个最终方案的数组。 这里以 [4, 0, 0] 举例说明,这个数组分别表示方案 1 的转动次数、方案 2 的转动次数和方案 3 的转动次数。 所以这个例子的含义是,只需要转动 4 次方案 1 即可复原引航罗盘。

Documentation

The Go Gopher

There is no documentation for this package.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL