LoginSignup
14
2

More than 5 years have passed since last update.

Goでクリスマスツリーを表示する 

Last updated at Posted at 2018-12-24

この記事はand factory Advent Calendar 2018 Day 25の記事になります。
前日は@yst_i の「マルチモジュール 簡単なサンプル」でした。

概要

クリスマスなので、Goでクリスマスツリーをニョキッと生やすツールを作りました。
MacとLinuxでGoの環境があれば、たった以下の2コマンドであなたのCLI環境にツリーをお届けします。

go get github.com/gosagawa/xmastree
xmastree

オプションでサイズと速度を指定できます。モニタのサイズが許す限り大きいツリーを作れます。

xmastree -size=20 -speed=40

xmastree.gif

解説

ソースはこちら
https://github.com/gosagawa/xmastree

なんて事はないプログラムなのですが、ちゃんやろうとすると結構な労力を要するように思いました。

対応した事

  • 文字の色を変える
  • 同じところでアニメーションさせる
    • これらを実現するためにエスケープシーケンスを使っています。Windowsだと動かないのはそのためです。
  • Cliコマンドツールとして、オプションでサイズやスピードを指定できるように
  • TravisCIとの連動
  • readmeにGif動画を載せる

対応する前に力尽きた事

  • テスト
    • 文字は即時で出力してしまっているが、テスト用に文字列として書き出せるようにしておくのが良いです
  • コードを読みやすくする
    • パラメータ周りや表示部分が汚い
  • もっとツリーらしく飾り付けをしたりとか。

一口解説、エスケープシーケンス

今回のツールを実現させるために"\033[xxxA" (xxxの部分は任意の数字)というエスケープシーケンスを用いています。これはxxx分カーソルを上に戻るといういうもので、これで書いて戻ってを繰り返して描画を行なっています。

    for i := 0; i < size; i++ {
        if i != 0 {
            fmt.Printf("\033[%vA", maxHeight)
        }
        tree := newTree(i*2+5, i+1, 2, maxHeight)
        tree.display()
        time.Sleep(time.Duration(speed) * time.Millisecond)
        maxWidth = tree.MaxWidth
    }

また、以下定数で定義していますが各文字の色付けをエスケープシーケンスで設定しています

const (
    // EscapeRed display red color
    EscapeRed = "\033[31m"

    // EscapeGreen  display green color
    EscapeGreen = "\033[32m"

    // EscapeYellow display Yellow color
    EscapeYellow = "\033[33m"

    // EscapeReset  reset color
    EscapeReset = "\033[0m"
)

まとめ

ちょっとしたものですが、ちゃんと作り込もうとなるとそれなりに大変そうです。時間を区切って、何かこういうCLIツールを作るコンテストとかやると面白いかもしれませんね。
良いクリスマスを!

参考にしたもの、インスパイヤされたもの

14
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
2