(´・ω・`)ショボーンが降ってくるコマンドをGo言語で作ってみました。スクリーンショットはこちら。
shobon
アスキーアートで拡大されたしょぼんくんが画面を上から下へと降りてきます。スクショだけではわかりませんが、ただ降りるだけです。--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
一行に一人しょぼんくんが降りてきます。
これだけではなんかしょうもないのでしょぼんくんがうじゃうじゃおりてくるshobon --too-many
オプションを用意しました。
実装はだいぶ汚いです。気になったらリポジトリで確認してみてください。ちなみにこちらにも--reverse
オプションを用意しました。
登っていきます。
しょぼんくんがジャンプするコマンド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
最後にブーンが降ってくるコマンドを用意しました。
普通に打つとブーンが画面真ん中を飛びます。左から右に。
当然こちらにも--many
オプションがあり、
ちょっと増えます。
これだけで物足りなかったら、もちろん--too-many
コマンドもあります。
いっぱい飛びます。
まとめ
一発ネタコマンド楽しい!
使った技術
エスケープシーケンス
fmt.Print("\x1b[2J") // 画面全クリア
fmt.Print("\x1b[1;1H") // 左上(1,1)に移動