ゲームを作ることによって学ぶbash


導入


OK!学習bashはかなり手で適切な目標なしに混乱することができます.だから、これはかなり良いアイデアbashの学習を開始し、楽しいトンがあります.この少しの時間で、私は私が怠惰な研究と無駄な時間のためにおよそ3ヵ月かかったC +で昨年私自身を設計した数ゲームを作ります.しかし、私はbashで2時間以内にこのゲームを作ったことに驚きました.このゲームの指示を参照することができますrepository at Github .

コンセプト


ゲームは0と9の間にユーザーに番号を求める.その後、10の番号のリストは、ランダムな順序でシャッフルされた別のリストを配列からの数字をインデックスに使用されると一緒にユーザーから表示されます.ユーザーは前方に進むために選択した番号の下にインデックスを選択する必要があります.ユーザーが数の正しいインデックスまたは入力のための時間を入力するに失敗したまでゲームのループは5秒を超えていた.ユーザーは、すべての成功したヒットのためのポイントを取得します.それはおそらくゲームの導入ですので、仕様に飛び込みましょう.

バッシュのゲームの仕様


ゲームは、それは算術演算子をたくさん必要とすることを意味するベースです.実際、シャフのようないくつかの複雑な関数が必要になるでしょう.我々は非常に頻繁に使用するとループのためのいくつかのタスクを実行し、印刷、配列やゲームのループなどを実行します.我々はいくつかのフラグ変数を使用して、ゲームの現在の状況を示し、最後にいくつかの配列と数字を計算します.

スクリプト説明


ゲームは非常に理解しやすいです.あなただけのシェルスクリプトで5秒以内に選択した番号の下に番号を選択する必要があります.単純なechoコマンドと書式設定によって端末のようなメニューを作成します.メニューの前に、ユーザーが変数3に格納される3に入るまで、反復するwhileループを持ちますch 最初にループに入るように、最初は0に初期化されます.whileループはdo文から始まり、done文で終了します.
while [ condition ];
do 
# statements
done
ループは、シナリオに基づいて異なることができます.ループの範囲を使用して{}演算子を使用して数値の範囲を反復処理します.forループもループの先頭として行い、ループの終わりとして行われます.
for i in {1..5};
do 
#statements
done
また、正しいユーザ入力をチェックして終了ステータスをチェックするために、if if else文を使用します.if文はthen ブロックを開始するfi ifブロックを終了する.
if [ condition ];
then
    #statements
elif
    #statements
else
    #statements
fi
私たちは、引数- pを持つread文を使用して、入力に関する情報をユーザにプロンプトを表示します.メニューI . E . 1に対する選択の入力、遊びのための2、命令のための2および終了する3は変数に格納されるch . 入力が1であるならば、ゲームは始まります、そして、それは数n , ゲームが終わるまでは、ループ全体に使用される番号です.
今、我々はゲームの残りの数を持って、我々はユーザーからの番号を選択するためのリストを生成する必要があります.ユーザーが正しい番号を入力したかどうかを確認するためのフラグをソートしますc , これは、正しい入力(数字X)と不正な入力のための1に0を格納します.それは0で初期化され、再び数字の生成前にwhileループを入力します.
繰り返し数のない10個の数字を生成してシャッフルするには、複数の数値を持つことができます.したがって、擬似乱数の誤用を避けるために、この場合、0から9までの10個の数字を生成しなければなりません.そのために、bashでコマンドを使うつもりですshuf これは、リスト/配列または入力ストリーム内の数字のシーケンス内の要素の置換を作成できます.私たちは使用するつもりですshuf コマンドを使用して0から9までの10の数字のランダムなシーケンスを生成するにはshuf -i 0-9 -n 10 .

10から番号があるので、それは0から9までの間のシャッフル番号のリストを生成することがわかります.これを結果として保存し、後で印字する配列を格納します.あなたはthis and these シャフを理解するための記事.
主なものは、現在のリストを印刷する必要がありますし、また、ユーザーに番号のインデックスを示すために別のリストを印刷する必要があります.forループを使用せずにリストを印刷します@ 変数.あなたがbashに新しくて、bashの上でビットガイドが欲しいならばBASH scripting , これは全部カバーしている.使用@ bashで配列全体を印字できます.

インデックスの下位リストを印刷するには、ループI . Eに基づいた範囲を使用します.これは範囲(1から10までの間)で反復し、各要素に1から10までのカウンタI . Eの値を割り当てます.私たちはr シャッフルリストとしてa インデックスリストとして.と同じ配列でこの配列を出力します.
リストの生成と印刷が完了したら、私たちは彼/彼女の番号のインデックスのユーザーから入力を取るでしょう.私たちはtimeoutとして知られている読み込みで引数を使います.そして、それは引数で提供される数秒後に入力ストリームに停止を与えます.この場合、インデックスの入力にタイムアウトとして5秒を使用します.read -t 5 -p "Enter the index of your number : " x入力を保存しますx 変数と確認のために後でそれにアクセスします.
次に、入力がタイムアウトの前に行われたかどうかを調べます.これに対して、ユーザがタイムアウトの前に入力した場合は、先に進むことができますが、時間が経過した場合には128を越えて終了ステータスを取得します.私は、これを通してこれに来ましたarticle , 本当に非常に役立つ.我々はループを破るし、フラグを作成しますc として不正な入力を示す1として“ゲームオーバー”が表示されます.しかし、あなたが十分に速いならば、我々はシャッフルされた配列のインデックスがあなたの選ばれた数を持っているかどうかチェックします${r[$(($x))-1]} -eq $n 正しい番号をチェックする.なぜ- 1?デフォルトで配列のインデックスを作成するのを覚えているならば、0から始まります.したがって、1から2番目のリストを始めたので、すべての要素は1によって相殺されます.したがって、我々は1を引くために、そのインデックスを参照するのを避けます.
数のインデックスが等しくて、正しいならば、我々はポイントのカウンタを増やしますp そして、それが間違っていたならば、旗は以前に言われたように1にセットされます、そして、我々はループを壊します.ループから出て、ステータスフラグをチェックしますc 1ははい、その後、ゲームを印刷し、ポイントを獲得表示されました.そしてそれです.いくつかのゲームを見てみましょう:)

バッシュスクリプト


#!/bin/bash

echo -e "\n NumberJack \n"
ch=0
while [ $ch -ne 3 ];
do
    echo  "  
         PLAY : Hit 1 and enter.
         HELP : Hit 2 and enter.
         EXIT : Hit 3 and enter.
         "

    read -p "Enter your choice : " ch
    if [ $ch -eq 1 ];then
    x=0
    c=0
    p=0
    read -p "Enter any number between 0 and 9 : " n
    while [ $c -eq 0 ];
    do
        x=11
        r=($(shuf -i 0-9 -n 10))
        echo "${r[@]} "
        for i in {1..10};
        do
            a[$i]=$i    
        done
        echo "${a[@]} "
        read -t 5 -p "Enter the index of your number : " x
        if [[ $? -gt 128 ]]; then 
            c=1
            break
        fi
        if [ ${r[$(($x))-1]} -eq $n ];then
            echo "Great"
            ((p=p+1))
        else
            c=1
            break
        fi
    done
    elif [ $ch -eq 2 ];then
        echo "HELP: INSTRUCTIONS TO PLAY THE GAME. "
    else
        break
fi

if [ $c -eq 1 ];then
            echo -e "\nGAME OVER\n"
            echo "You scored $p points"
fi
        done


これはスクリプトを単純に保つどんなヘルプ命令なしでも最終的な裸のスクリプトです.私はあなたがbashのゲーム開発から何かを学んだことを願っています.これは楽しい小さなプロジェクトとループなどのbashの特定の概念を学習のクールな方法、条件文、および算術演算です.楽しい.ハッピーコーディング