環境macOS Catalina version10.15.6 ターミナル
#目的
シェルスクリプトでゲームを作りながら
Linuxコマンドを覚える
論理よりとりあえず、Linuxコマンドに慣れたい人向け
忙しい人用のコマンド確認もあり
単純にデーモンを倒すゲーム
主にattack,recover,defence,status_upを選択しながら攻めていく
単純にデーモンのHPがゼロになったら勝ちで、こちらのHP0になったら負け
attack・・・攻撃
recover・・・HPを回復する
defence・・・攻撃を防御する
status_up・・・攻撃力を上げる
ごくまれに、デーモンのスーパーパワーを発生させ難易度をあげています。
#使用するコマンド一覧
Linuxコマンド確認のみの忙しい人用
#ファイル操作
mkdir :ディレクトリ作成
cd ディレクトリ名 :指定したディレクトリに移動
vi ファイル名:指定したファイルのテキストを編集
(ファイルがない場合は新規作成)
#vi エディタ内
iで vi エディタの入力開始
:コマンドモード
eac 入力モード終了
:wq ファイルの上書き
:q! ファイル保存しないで終了
:34 34行目に移動
#シェルスクリプトおまじない
を先頭に入力して、バッシュを選択
#!/bin/bash
#!/usr/bin/bash(centOSの場合)
#変数
var="これは変数です"
var=2
■while文:
while [ 条件式 ]
do
・・・処理内容
done
■if文
if [ 条件式 ]; then
・・・・・・・・処理内容
elif [ 条件式 ]; then
・・・・・・・・
else
・・・・・・・・
fi
■for 文
for i in 1 2 3
do
・・・・・
done
■Select 文
select action in a b c d e
do
・・・・・・・・・・処理内容
done
■case文
case var in
0)
・・・・・・処理内容
;;
1)
・・・・・
;;
2)
・・・・・
;;
esac
#シェルスクリプト入力の留意点
■if,whileは空白が必須
NG入力:while [$count2 -ne $daemon_hp ]
正しい入力:while [ $count2 -ne $daemon_hp ]
NG入力:if [ $action = "attack" ];then
正い入力 NG×:if [ $action = "attack" ]; then
■変数は逆に空白不要
NG入力:hp = 200
正しい入力 hp=200
#手順1
ゲーム用のディレクトリを作成して、作成したディレクトリに移動
ここではshellgameディレクトリとする。
mkdir shellgame
cd shellgame
ゲームのシェルスクリプトファイルを作成を開始する
iを押して入力開始する。
vi game.sh
#手順2 ここからはviテキストエディタの入力内容
頭に下記のおまじないを入力して、バッシュを選択
(CentOSの場合!/usr/bin/bash)
playerと敵のパラメータを変数で作成
ここは個人のやりたいように数値変更ok
#!/bin/bash
hp=200
daemon_hp=200
attack=10
daemon_attack=10
echoで初期のゲーム画面を作る(-nは改行するではなく、改行をしない)
whileでHPの分だけ■を表示する
例:HP50なら■が50表示する
exprは四則演算を行うときに必要、`(バッククオート)で囲む必要もあり
$は変数を呼び出す時に使用
whileの-neはnot イコール
ここは好みに合わせて、見やすいように整えて下さい
echo "************************************************************************************"
echo "Your HP"
count=0
while [ $count -ne $hp ]
do
echo -n "■"
count=`expr 1 + $count`
done
echo ""
echo "Daemon_HP"
count2=0
while [ $count2 -ne $daemon_hp ]
do
echo -n "■"
count2=`expr 1 + $count2`
done
echo ""
echo "Your attack $attack"
echo "Daemon_attack $daemon_attack"
echo "************************************************************************************"
echo "Welcome.Please select action"
echo "************************************************************************************"
selectで5つのアクションを選択出来るようにして
(attack recover defence status_up exit)
ひたすら、select内をHPがゼロになるまで、ひたすらループを行う
ちなみに、selectは選択入力とループの組み合わせ
select action in attack recover defence status_up exit
do
次からここに入力していく
done
以降はselect内のdo doneの間に入力をしていく
selectのdone以降は入力はしない
$(($RANDOM % 4))は乱数でデーモンのactionを決める
ifでplayerが入力したactionを分岐する
ifの中のcase分でデーモンの分岐を行う
デーモンのactionは0はattack,1はrecover,2はdefending,3はstatus_up
合計4(player)×4(デーモン)=16 + 1(exit)の17パターンのactionがある
clearはターミナルの過去の文字を消す。
breakはゲーム終了
daemon_action=$(($RANDOM % 4))
if [ $action = "attack" ]; then
clear
case $daemon_action in
0)
echo "You attck to Daemon! Daeimon_HP-$attack "
echo "Daemon attck to you!Your_HP -$daemon_attack "
hp=`expr $hp - $daemon_attack`
daemon_hp=`expr $daemon_hp - $attack`
;;
"1")
echo "You attack to Daemon!DAEMON_HP -$attack "
echo "Daemon failed to recover "
daemon_hp=`expr $daemon_hp - $attack`
;;
"2")
echo "You attck to Daemon! "
echo "Daemon succeeded in defending. "
;;
"3")
echo "You attck to daemon! Daemon_HP-$attack "
echo "Daemon failed to status_up "
daemon_hp=`expr $daemon_hp - $attack`
;;
esac
elif [ $action = "recover" ]; then
clear
case $daemon_action in
0)
echo "Daemon attck to you!Your_HP -$daemon_attack "
echo "You failed to recover "
hp=`expr $hp - $daemon_attack`
;;
"1")
echo "You succeeded in recovery HP+30 "
echo "Daemon succeeded in recovery HP+30"
hp=`expr $hp + 30`
daemon_hp=`expr $daemon_hp + 30`
;;
"2")
echo "You succeeded in recovery HP+30"
echo "Daemon defended, but you didn't attack."
hp=`expr $hp + 30`
;;
"3")
echo "You succeeded in recovery HP+30 "
echo "Daemon succeeded in up status.Daemon_attack+3 "
hp=`expr $hp + 30`
daemon_attack=`expr $daemon_attack + 3`
;;
esac
elif [ $action = "defence" ]; then
clear
case $daemon_action in
0)
echo "Daemon attck to you! "
echo "You succeeded in defending."
;;
"1")
echo "You defended, but Daemon didn't attack. "
echo "Daemon succeeded in recovery HP+30"
daemon_hp=`expr $daemon_hp + 30`
;;
"2")
echo "You defended, but Daemon didn't attack. "
echo "Daemon defended, but You didn't attack. "
hp=`expr $hp + 30`
;;
"3")
echo "You defended, but Daemon didn't attack. "
echo "Daemon succeeded in up status.Daemon_attack+3"
daemon_attack=`expr $daemon_attack + 3`
;;
esac
elif [ $action = "status_up" ]; then
clear
case $daemon_action in
0)
echo "Daemon attck to you!Your_HP -$daemon_attack "
echo "You failed to status_up"
hp=`expr $hp - $daemon_attack`
;;
"1")
echo "You succeeded in up status. your_attack+3"
echo "Daemon succeeded in recovery HP+30"
attack=`expr $attack + 3`
daemon_hp=`expr $daemon_hp + 30`
;;
"2")
echo "You succeeded in up status. "
echo "Daemon defended, but you didn't attack. "
attack=`expr $attack + 3`
;;
"3")
echo "You succeeded in up status.Your_attack+3 "
echo "Daemon succeeded in up status. Daenmon_attack+3"
daemon_attack=`expr $daemon_attack + 3`
attack=`expr $attack + 3`
;;
esac
elif [ $action = "exit" ]; then
clear
break
else
clear
echo "Please select 1-5"
fi
ひたすらattackを押すと、デーモンに余裕で勝てるので
デーモンにスーパーパーワーを得るという機能を加える
乱数をを作成して、1ならデーモンの攻撃力を上げる
2ならHPを50回復する
for i in 1 2
なので2回ループしている、すなわち1回につき2回スーパーパワーを得られるチャンスがある
for i in 1 2
do
daemon_last_power=$(($RANDOM % 30))
if [ $daemon_last_power = 1 ]; then
echo "*************************************************"
echo "The demon got super power. Daemon_attack + 10"
daemon_attack=`expr $daemon_attack + 10`
fi
if [ $daemon_last_power = 2 ]; then
echo "*************************************************"
daemon_hp=`expr $daemon_hp + 50`
echo "The demon got super power. Daemon_HP + 50"
fi
done
HPがゼロになったら、勝負終了にする
ちなみに、同時にゼロになる可能性もあるが、その場合も負けとしている
ちなみにifの-ltはhpが1より小さくなったら真
if [ $hp -lt 1 ]; then
echo "You lose"
break
fi
if [ $daemon_hp -lt 1 ]; then
echo "You win!"
break
fi
最後に現在のHPと攻撃力を表示してして次のアクションを促す文字を表示する
echo "*****************************"
echo "Your HP$hp"
count=0
while [ $count -ne $hp ]
do
echo -n "■"
count=`EXPR 1 + $count`
done
echo ""
echo "Daemon_HP$daemon_hp"
count2=0
while [ $count2 -ne $daemon_hp ]
do
echo -n "■"
count2=`EXPR 1 + $count2`
done
echo ""
echo "Your attack $attack"
echo "Daemon_attack $daemon_attack"
echo "****************************"
echo "Please select action in attack(1) recover(2) defence(3) status_up(4) exit(5)"
#手順3
eacで入力モードを終了して
:wqで上書き保存
:wq
#手順4
./game.shで実行
ゲームが開始される
./game.sh
#終わりに
ゲームを作りを通して、シェルスクリプト、また
viの編集方法の練習にお役に立てるなら、幸いです。
もし面白いと思った方は、さらにアクションを増やしたり、パラメータなどを増やして
楽しんでみて下さい