Created
February 11, 2014 17:30
-
-
Save demouth/8939731 to your computer and use it in GitHub Desktop.
爆発しろ!という気持ちを鎮める為のシェル。 このシェルを叩くとランダムで生成された爆発のアニメーションが描画されます。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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'[35m.' | |
elif [ $num -lt 3 ];then | |
str=$str'[31m:' | |
elif [ $num -lt 4 ];then | |
str=$str'[33m=' | |
elif [ $num -lt 5 ];then | |
str=$str'[33m#' | |
else | |
str=$str'[33m@' | |
fi | |
pics[$i]=0 | |
done | |
# キャレットを戻す | |
tput rc | |
# キャレット以降をクリア | |
echo -e "[0J\c" | |
# 描画 | |
echo -e "$str\c" | |
done | |
tput rc | |
echo -e "[0J\c" | |
echo -e "[39m\c" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment