5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-03-26

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

#ゲーム内容
スクリーンショット 2021-03-26 11.30.07.png

単純にデーモンを倒すゲーム
主に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の編集方法の練習にお役に立てるなら、幸いです。
もし面白いと思った方は、さらにアクションを増やしたり、パラメータなどを増やして
楽しんでみて下さい

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?