Skip to content

Instantly share code, notes, and snippets.

@demouth

demouth/boom.sh

Created Feb 11, 2014
Embed
What would you like to do?
爆発しろ!という気持ちを鎮める為のシェル。 このシェルを叩くとランダムで生成された爆発のアニメーションが描画されます。
#!/bin/bash
#2つの引数の間の数値をランダムで返す
#第一引数の方がより小さな値を渡すこと
function rand() {
range=$(($1 - $2))
ret=$((RANDOM % range + $1))
echo $ret
}
# 初期設定
CANVAS_W=`tput cols` #描画領域の幅
CANVAS_CENTER=$((CANVAS_W / 2)) #描画領域の幅 / 2
CANVAS_H=15 #描画領域の高さ
NUM_PARTICLES=250 #パーティクルの数
NUM_PARTICLES=$((NUM_PARTICLES - 1)) #実装の都合で-1しておく
NUM_PICS=$((CANVAS_W * $CANVAS_H)) #描画に使う配列の長さ(ここは自動で算出する)
NUM_FRAME=20 #描画するフレーム数
# 表示領域のクリア
for i in `seq $CANVAS_H`
do
echo -e "\n\c"
done
echo "[$((${CANVAS_H}+1))A"
# キャレットの位置保存
tput sc
# 座標
particles_x=()
particles_y=()
# スピード
particles_ax=()
particles_ay=()
# パーティクルの初期化
for i in `seq 0 $NUM_PARTICLES`; do
rand_x=`rand -8 8`
rand_y=`rand -3 3`
particles_x+=($((CANVAS_W / 2 + rand_x)))
particles_y+=($((CANVAS_H / 2 + rand_y)))
particles_ax+=(`rand -5 5`)
particles_ay+=(`rand -2 2`)
done
# 描画用配列初期か
pics=()
for i in `seq $NUM_PICS`; do
pics[$i]=0
done
# 秒がループ
for frame in `seq $NUM_FRAME`; do
# 移動
for i in `seq 0 $NUM_PARTICLES`; do
particles_x[$i]=$((particles_x[$i] + particles_ax[$i]))
particles_y[$i]=$((particles_y[$i] + particles_ay[$i]))
x=${particles_x[$i]}
y=${particles_y[$i]}
xy=$((y*CANVAS_W+x))
if [ $x -gt 0 -a $x -lt $CANVAS_W -a $y -gt 0 -a $y -lt $CANVAS_H ]; then
pics[$xy]=$((pics[$xy] + 1))
fi
done
# 描画用配列をもとに描画文字列を決定
str=""
for i in `seq $NUM_PICS`; do
num=${pics[$i]}
if [ $num -lt 1 ] ;then
str=$str' '
elif [ $num -lt 2 ] ;then
str=$str'.'
elif [ $num -lt 3 ];then
str=$str':'
elif [ $num -lt 4 ];then
str=$str'='
elif [ $num -lt 5 ];then
str=$str'#'
else
str=$str'@'
fi
pics[$i]=0
done
# キャレットを戻す
tput rc
# キャレット以降をクリア
echo -e "\c"
# 描画
echo -e "$str\c"
done
tput rc
echo -e "\c"
echo -e "\c"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.