シェルスクリプトでゲームを作りながらlinuxコマンドを覚える

環境macOS Catalina version10.15.6 ターミナル
#目的
シェルスクリプトでゲームを作りながら
Linuxコマンドを覚える
論理よりとりあえず、Linuxコマンドに慣れたい人向け
忙しい人用のコマンド確認もあり


#ゲーム内容
![スクリーンショット 2021-03-26 11.30.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1186069/f4a7df4b-a6f4-1232-b438-976c359d02e4.png)

単純にデーモンを倒すゲーム
主にattack,recover,defence,status_upを選択しながら攻めていく
単純にデーモンのHPがゼロになったら勝ちで、こちらのHP０になったら負け

attack・・・攻撃
recover・・・HPを回復する
defence・・・攻撃を防御する
status_up・・・攻撃力を上げる

ごくまれに、デーモンのスーパーパワーを発生させ難易度をあげています。






#使用するコマンド一覧
Linuxコマンド確認のみの忙しい人用

```shell:
#ファイル操作
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


```

#シェルスクリプト入力の留意点

```shell:
■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
```


#手順１
ゲーム用のディレクトリを作成して、作成したディレクトリに移動
ここではshellgameディレクトリとする。

```
mkdir　shellgame
cd shellgame
```

ゲームのシェルスクリプトファイルを作成を開始する
iを押して入力開始する。

```
vi game.sh
```
#手順２　ここからはviテキストエディタの入力内容
頭に下記のおまじないを入力して、バッシュを選択
(CentOSの場合!/usr/bin/bash)
playerと敵のパラメータを変数で作成
ここは個人のやりたいように数値変更ok

```shell:
#!/bin/bash
hp=200
daemon_hp=200
attack=10
daemon_attack=10
```
echoで初期のゲーム画面を作る（-nは改行するではなく、改行をしない）

whileでHPの分だけ■を表示する
例：HP５０なら■が50表示する
exprは四則演算を行うときに必要、｀（バッククオート）で囲む必要もあり
$は変数を呼び出す時に使用
whileの-neはnot イコール

ここは好みに合わせて、見やすいように整えて下さい

```shell:

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で５つのアクションを選択出来るようにして
（attack recover defence status_up exit）
ひたすら、select内をHPがゼロになるまで、ひたすらループを行う
ちなみに、selectは選択入力とループの組み合わせ


```shell:
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はゲーム終了


```shell:
 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を押すと、デーモンに余裕で勝てるので
デーモンにスーパーパーワーを得るという機能を加える
乱数をを作成して、１ならデーモンの攻撃力を上げる
２ならHPを50回復する
for i in 1 2
なので２回ループしている、すなわち１回につき２回スーパーパワーを得られるチャンスがある

```shell:
        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が１より小さくなったら真

```shell:

        if [ $hp  -lt 1 ]; then
                 echo "You lose"
                break
        fi
                if [ $daemon_hp -lt 1 ]; then
                echo "You win!"
                break
        fi
```

最後に現在のHPと攻撃力を表示してして次のアクションを促す文字を表示する

```shell:
     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)"
```
#手順３
eacで入力モードを終了して
:wqで上書き保存

```
:wq
```

#手順４
./game.shで実行
ゲームが開始される

```
./game.sh
```

#終わりに

ゲームを作りを通して、シェルスクリプト、また
viの編集方法の練習にお役に立てるなら、幸いです。
もし面白いと思った方は、さらにアクションを増やしたり、パラメータなどを増やして
楽しんでみて下さい