【Go/TUI】使徒に侵食される気分になれるツール作ってみた


作ってみた

感謝

以下ガイドラインを参照しています。

背景・動機

  • Goの勉強
  • TUIツールの作り方の勉強
  • 楽しいことをしたかった

使い方

Linux/amd64の場合はこちらからバイナリをDLして、実行

wget [ireul_vxxx_amd64_linux.zipのURL]
unzip [zipファイル名]
chmodu u+x ireul
./ireul

それ以外の環境ではGoの動作する環境で以下のように実施

git clone [email protected]:kuredev/ireul.git
go run main.go

作り方のメモ

動き

アルゴリズムで侵食や回復の動きを作れたらかっこいいなと思いつつ、仕組みはパラパラ漫画です。
各状態のアスキーアートを1ファイルずつ準備して、それっぽくなるよう sleep させつつ順次表示しています。

1ファイル目
                          H """""""""""""""""""""" H
                          H                        H
                          H                        H
+-+-+-+-+-+ +-+-+-+       H                        H
|C|O|D|E|:| |2|6|3|       H                        H
+-+-+-+-+-+ +-+-+-+       H                        H
                          H                        H
                          H                        H
                          H                        H
                          H                        H
H (((((((((((((((((,      .W.                    .B          ((((((((((((((((( H
H                  .YJ.      7W,               .J"        .T^                  H
H                     TQ,       TN,          .H^       .J"                     H
H                       (h,        """"""""""        .T^                       H
H                         .Ta.                    .J"                          H
H                            7H,               ..T'                            H
H                              (S,            J"                               H
H                               H            H                                 H
H                               H            H                                 H
H                               H            H                                 H
H...............................H            H.................................H

2ファイル名
                          H """""""""""""""""""""" H
                          H                        H
                          H                        H
+-+-+-+-+-+ +-+-+-+       H                        H        +-+-+-+-+-+ +-+-+-+
|C|O|D|E|:| |2|6|3|       H                        H        |Under Deliberation|
+-+-+-+-+-+ +-+-+-+       H                        H        +-+-+-+-+-+ +-+-+-+
                          H                        H
                          H                        H
                          H                        H
                          H                        H
H (((((((((((((((((,      .W.                    .B          ((((((((((((((((( H
H                  .YJ.      7W,               .J"        .T^ MMMMMMMMMMMMMMMMMH
H                     TQ,       TN,          .H^       .J"MMMMMMMMMMMMMMMMMMMMMH
H                       (h,        """"""""""        .T^ MMMMMMMMMMMMMMMMMMMMMMH
H                         .Ta.                    .J"MMMMMMMMMMMMMMMMMMMMMMMMMMH
H                            7H,               ..T'MMMMMMMMMMMMMMMMMMMMMMMMMMMMH
H                              (S,            J" MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMH
H                               H            H MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMH
H                               H            H MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMH
H                               H            H MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMH
H...............................H            H.................................H

実装

表示部は tcell というツールを使っています。

ファイルの内容を1Byteずつ表示しつつ、侵食されている部分は M で表示しているため、そこだけ色を変えるようにしています。

主な表示処理部抜粋
bytes, err := files.ReadFile(fileName)
if err != nil {
    panic(err)
}
s := string(bytes)
x := 1
y := 1
for _, c := range s {
    if string(c) == "\n" {
        x = 1
        y = y + 1
    } else {
        if string(c) == "M" {
            screen.SetContent(x, y, c, nil, tcell.StyleDefault.Foreground(tcell.ColorRed))
        } else {
            screen.SetContent(x, y, c, nil, tcell.StyleDefault.Foreground(tcell.ColorDarkCyan))
        }
        x = x + 1
    }
}
screen.Show()

その他

  • 推しはマヤ、日向、青葉のオペレーターズ
  • 感謝: