LoginSignup
2
1

More than 5 years have passed since last update.

(´・ω・`)ショボーンが降ってくるコマンドをGo言語で作ってみました⊂二二二( ^ω^)二⊃

Last updated at Posted at 2017-09-17

(´・ω・`)ショボーンが降ってくるコマンドをGo言語で作ってみました。スクリーンショットはこちら。

shobon

Screenshot from 2017-09-17 23-45-33.png

アスキーアートで拡大されたしょぼんくんが画面を上から下へと降りてきます。スクショだけではわかりませんが、ただ降りるだけです。--reverseオプションを指定すればゆっくりと上がっていきます。

これをベースになんかいろいろオプションを作ったので紹介していきます。ソースコードはgithub.com/aimof/shobonこちら。go installでインストールできるよ!

ちなみに技術的に高度なことは一切やっていません。エスケープシーケンスくらいです。

基本コマンドshobon

上のスクショのようにしょぼんくんがゆっくり降りてきます。この部分のコードは以下。

func printDefaultShobon(height, width int) {
    var x int = 0
    if width > kaomoji.SHOBON_WIDTH {
        x = (width - kaomoji.SHOBON_WIDTH) / 2
    }
    if height < 8 {
        printShobon(x, 0, 8)
    } else {
        for i := 0; i < height-kaomoji.SHOBON_HEIGHT-1; i++ {
            if *reverseOption {
                printShobon(x, height-kaomoji.SHOBON_HEIGHT-i-2, height)
            } else {
                printShobon(x, i, height)
            }
            time.Sleep(150 * time.Millisecond)
        }
    }
}

func printShobon(x, y, height int) {
    var indent string = strings.Repeat(" ", x)
    fmt.Print("\x1b[1J")
    fmt.Print("\x1b[1;1H")
    fmt.Print(strings.Repeat("\n", y))

    fmt.Print(indent + kaomoji.SHOBON0 + "\n")
    fmt.Print(indent + kaomoji.SHOBON1 + "\n")
    fmt.Print(indent + kaomoji.SHOBON2 + "\n")
    fmt.Print(indent + kaomoji.SHOBON3 + "\n")
    fmt.Print(indent + kaomoji.SHOBON4 + "\n")
    fmt.Print(indent + kaomoji.SHOBON5 + "\n")
    fmt.Print(indent + kaomoji.SHOBON6 + "\n")
    fmt.Print(indent + kaomoji.SHOBON7 + "\n")
    fmt.Print(strings.Repeat("\n", height-y-kaomoji.SHOBON_HEIGHT-1))
}

最初のうちはこんなノリだったのですが楽しくなってきたので、ちょっとふざけたオプションを用意しました。

しょぼんくんがたくさん降ってくるオプションshobon --many

Screenshot from 2017-09-17 23-45-42.png

Screenshot from 2017-09-17 23-45-47.png

一行に一人しょぼんくんが降りてきます。

これだけではなんかしょうもないのでしょぼんくんがうじゃうじゃおりてくるshobon --too-manyオプションを用意しました。

Screenshot from 2017-09-17 23-47-35.png

実装はだいぶ汚いです。気になったらリポジトリで確認してみてください。ちなみにこちらにも--reverseオプションを用意しました。

Screenshot from 2017-09-18 00-10-49.png

登っていきます。

しょぼんくんがジャンプするコマンドshobon --jump

静止画では通常コマンドと同じなので写真は省略。

func printJumpingShobon(height, width int) {
    if height < 2*kaomoji.SHOBON_HEIGHT {
        fmt.Println("sorry, your terminal is too small to jump.")
        return
    }
    var x int = 0
    if width > kaomoji.SHOBON_WIDTH {
        x = (width - kaomoji.SHOBON_WIDTH) / 2
    }
    if height < 8 {
        printShobon(x, 0, 8)
    } else {
        for jump := 0; jump < 10; jump++ {
            highest := float64(height - kaomoji.SHOBON_HEIGHT)
            for i := height - kaomoji.SHOBON_HEIGHT - 1; i >= 0; i-- {
                var shobonHeight float64 = float64(height - kaomoji.SHOBON_HEIGHT - i)
                printShobon(x, i, height)
                time.Sleep(time.Duration(math.Pow((shobonHeight-highest/2)/(highest/2), 2) * float64(40*time.Millisecond)))
            }
            for i := 0; i < height-kaomoji.SHOBON_HEIGHT-1; i++ {
                var shobonHeight float64 = float64(height - kaomoji.SHOBON_HEIGHT - i)
                printShobon(x, i, height)
                time.Sleep(time.Duration(math.Pow((shobonHeight-highest/2)/(highest/2), 2) * float64(40*time.Millisecond)))
            }
        }
    }
}

しょぼんくんがそれっぽくジャンプします。ジャンプしているっぽく関数を選ぶのが大変でした。durationを正規化した二次関数の二乗で表現したのですが、こんなんでよいのかな? もっといい関数があるかもしれないけど物理わからない……

⊂二二二( ^ω^)二⊃ shobon --booon

最後にブーンが降ってくるコマンドを用意しました。

Screenshot from 2017-09-17 23-46-50.png

普通に打つとブーンが画面真ん中を飛びます。左から右に。

当然こちらにも--manyオプションがあり、

Screenshot from 2017-09-17 23-47-16.png

ちょっと増えます。

これだけで物足りなかったら、もちろん--too-manyコマンドもあります。

Screenshot from 2017-09-17 23-47-54.png

いっぱい飛びます。

まとめ

一発ネタコマンド楽しい!

使った技術

エスケープシーケンス

fmt.Print("\x1b[2J")   // 画面全クリア
fmt.Print("\x1b[1;1H") // 左上(1,1)に移動
2
1
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
2
1