プログラミング機能を向上させるために、これらの古き良き古典的なゲームが、良い材料。今日では、bashで地雷除去プログラムを作成する方法を、私たちはそれについて慎重に見ていきましょう。
私はプログラミングを教えるの専門家ではないですが、私は事をよりよく把握したい場合、これらのメソッドの音楽で自分を見つけようとします。私はシェルプログラミングの面でさらに行きたい場合たとえば、私が練習することがバッシュで掃海艇のゲームを書くことにしました。
あなたは同じ時間の楽しみでスキルを向上させることを期待して、経験豊富なプログラマのバッシュであれば、その後、私はあなたに、端末での掃海艇のゲームの実行を書きに従ってください。完全なコードはGitHubのリポジトリで見つけることができます。
レディ
私は任意のコードを書く前に、私はゲームのいくつかの必要な部分を列挙されています:
- ディスプレイの地雷原
- ゲームロジックを作成します。
- 代替論理セルを作成するかどうかを決定します
- 利用可能な特定され、記録されたセルの数を(鉱山を持っています)
- ゲームの論理的な終わりを作成します。
ディスプレイの地雷原
地雷除去は、ゲーム・インターフェースは、2Dアレイ(行と列)の小さな正方形不透明な組成物です。各グリッドで鉱山を所有している可能性があります。プレイヤーのタスクは、それらの自由二乗鉱山を見つけることです、その過程で、地雷を指すことはできません。バッシュの10×10マトリックス、完了するための単純なバッシュによる実際のロジック・アレイを使用してマインスイーパこのバージョン。
まず第一に、私の夫はいくつかのランダムな数字となりました。これは、地雷原で地雷の場所になります。あなたは、コードを書き始める前に、地雷の数を制御し、そうすることは容易になります。この機能を実現するロジックは、より良いかもしれないが、私はそれをシンプルに保つ達成するためのゲームを作るためにそれをやったし、改善の余地があります。(私はこのゲームは純粋にエンターテインメントで書きましたが、あなたは、より良い、それを変更することができれば、私もとても幸せです。)
以下の変数は、彼らがランダムに番号を生成したことを宣言するためには、プロセスを通して一定です。次のように a
- g
鉱山の値を計算するのに使用される変数を除外することができます。
#变量
score=0#会用来存放游戏分数
#下面这些变量,用来随机生成可排除地雷的实际值
a="1 10 -10 -1"
b="-1 0 1"
c="0 1"
d="-1 0 1 -2 -3"
e="1 2 20 21 10 0 -10 -20 -23 -2 -1"
f="1 2 3 35 30 20 22 10 0 -10 -20 -25 -30 -35 -3 -2 -1"
g="1 4 6 9 10 15 20 25 30 -30 -24 -11 -10 -9 -8 -7"
#
#声明
declare-a room #声明一个 room 数组,它用来表示雷区的每一格。
次に、I列(0-9)と行(AJ)ゲーム・インターフェースを表示し、地雷原として10×10のマトリックスを使用します。(M[10][10]
0-99からインデックス100個の値の配列)。
呼ばれる作成する plough
機能を、私たちの最初のタイトルが表示さ:2つの空行、列ヘッド、および彼の党を -
、ゲームの概略インターフェイスでダウンしています:
printf'\n\n'
printf'%s'" a b c d e f g h i j"
printf'\n %s\n'"-----------------------------------------"
私はと呼ばれるカウンタ変数を初期化すると r
、表示されたどのくらいの横行記録するために使用されます。後でゲームコードでは、私たちは同じ変数を使用することに注意してください r
私たちの配列のインデックスとして、。forループバッシュで、と seq
0から9までのコマンド。I(デジタルd%
(行番号を表示するために)プレースホルダ$row
によって seq
定義):
r=0#计数器
for row in $(seq 09);do
printf'%d '"$row"#显示行数0-9
私たちが行うダウンした前に、私たちは今までに何が行われたかを見てみましょう。私たちは、最初に横向きに表示され [a-j]
、その後、 [0-9]
行番号が表示され、我々は、ユーザーの鉱山の正確な位置を決定するために、これら二つの範囲を使用します。
その後、それぞれの行に、列を挿入ので、新しい書き込みをする時が来た for
のサイクルを。各列でこのサイクル管理は、つまり、実際には、ゲームのインターフェイスは、各グリッドのために生成されます。私は、あなたがソースコードでの完全な実装を見ることができ、いくつかの補助的な機能を追加しました。各セルのために、我々はそれが地雷のように見えるようにいくつかのことを必要とするので、私たちは、ドット(始まります.
スペースを初期化します)。このアイデアを実現するために、我々使用が呼び出される is_null_field
カスタム関数。同時に、我々は、以前に定義されたグローバル配列を使用します。ここでは、それぞれの特定の値のために、メモリセルアレイを必要と room
し、変数を r
指標として。で r
増加し、すべてのセルを介して、ランダムに地雷を展開。
for col in $(seq 09);do
((r+=1))#循环完一列行数加一
is_null_field $r #假设这里有个函数,它会检查单元格是否为空,为真,则此单元格初始值为点(.)
printf'%s \e[33m%s\e[0m '"|""${room[$r]}"#最后显示分隔符,注意,${room[$r]}的第一个值为'.',等于其初始值。
#结束 col 循环
done
最後に、かなりきちんとしているゲームのインターフェイスを保つために、私は最後のように縦線とのすべての行、およびサイクルの最後の行の末尾になります:
printf'%s\n'"|"#显示出行分隔符
printf' %s\n'"-----------------------------------------"
#结束行循环
done
printf'\n\n'
完全な plough
コードは以下の通りであります:
plough()
{
r=0
printf'\n\n'
printf'%s'" a b c d e f g h i j"
printf'\n %s\n'"-----------------------------------------"
for row in $(seq 09);do
printf'%d '"$row"
for col in $(seq 09);do
((r+=1))
is_null_field $r
printf'%s \e[33m%s\e[0m '"|""${room[$r]}"
done
printf'%s\n'"|"
printf' %s\n'"-----------------------------------------"
done
printf'\n\n'
}
それは私に、考えるためにいくつかの時間がかかったis_null_field
そう何特定の機能を。のは、それが何ができるかを最終的には、見てみましょう。初めに、私たちは、ゲームが固定されている必要があります。あなたは簡単に初期値が数値または任意の文字ができ選ぶことができます。私は最終的に、ポイントすべてのセル(の初期値を決めた.
私は、これはゲームのインターフェイスが良く見えるようになると思うので、)。ここでは、この機能のための完全なコードは次のとおりです。
is_null_field()
{
local e=$1 #在数组 room 中,我们已经用过循环变量'r'了,这次我们用'e'
if[[-z "${room[$e]}"]];then
room[$r]="."#这里用点(.)来初始化每一个单元格
fi
}
今、私はすべてのキャビネットを初期化してきた、そして今だけ多くのセルが動作することができますどのように現在のゲームを描くことができるようになります非常に簡単な関数を使用します。
get_free_fields()
{
free_fields=0#初始化变量
for n in $(seq 1 ${#room[@]});do
if[["${room[$n]}"="."]];then#检查当前单元格是否等于初始值(.),结果为真,则记为空余格子。
((free_fields+=1))
fi
done
}
これは、ゲームのインターフェイスに示されている[a-j]
列、[0-9]
行。
機雷原
プレイヤーは、論理を作成します
プレイヤの操作の背後にある論理ことで、読み出しデータが標準入力座標を起動し、実際の値の対応する位置が含まれて見つけるように。これは、ランク数を取得しようとする、パラメータ展開のバッシュを使用しています。手紙は、このように対応する列を得、列の数が、その後分岐ステートメントに渡され表します。よりよいこのプロセスを理解するためには、次のコード変数、見ることができる o
対応する値を。例えば、プレイヤの入力が c3
、それは2文字のバッシュに分けられる:c
および 3
。簡単にするために、私は無効な入力を処理する方法に関するセクションをスキップ。
colm=${opt:0:1}#得到第一个字符,一个字母
ro=${opt:1:1}#得到第二个字符,一个整数
case $colm in
a ) o=1;;#最后,通过字母得到对应列数。
b ) o=2;;
c ) o=3;;
d ) o=4;;
e ) o=5;;
f ) o=6;;
g ) o=7;;
h ) o=8;;
i ) o=9;;
j ) o=10;;
esac
選択されたセルの数の実際のユーザに対応する次の計算コードは、その後、結果を変数に格納します。
また、多くのあり使用されている shuf
コマンドを、shuf
Linuxコマンドに専用されているが、ランダムなシーケンスを生成します。-i
所望の範囲または破壊の数を提供するために、その後のオプション必要が、-n
オプションは、出力に必要な値の所定数まで戻ります。bashは、我々は何度も使用される二つの括弧内に数学的な計算を実行することができます。
または、前の例では、プレーヤーの入力に従ってください c3
。その後、それはに変換した ro=3
と o=3
。その後、上記のステートメントは、支店コードであり、 c
最終的な結果得るために式に、対応する整数に変換し i
た値です。
i=$(((ro*10)+o))#遵循运算规则,算出最终值
is_free_field $i $(shuf-i 0-5-n 1)#调用自定义函数,判断其指向空/可选择单元格。
慎重に最終結果がどうかを確認するために、この計算を観察し i
て計算する方法です。
i=$(((ro*10)+o))
i=$(((3*10)+3))=$((30+3))=33
図33は、最終的な結果です。私たちのゲームのインターフェイスに表示、プレイヤーは、つまり、ライン3(0から始まるが、それ以外の場合、これは4となる)、第33セルに最初の3つの点の座標を入力します。
代替論理セルを作成するかどうかを決定します
、地雷を見つけた後に座標変換し、実際の位置を見つけるためには、プログラムは、セルがオプションであるかどうかをチェックします。利用できない場合は、プログラムは警告メッセージを表示し、座標を再入力するプレーヤーが必要です。
セルが配列(点に対応する値であるか否か任意であるかどうか、このコードには.
)決定しました。また場合は、セルに対応する値がリセットされ、更新のスコアです。それは点に対応する値ではないので、逆に、可変設定されます not_allowed
。簡単にするために、警告メッセージソースのこの部分ではゲームは、私は自分自身を探求する読者を残しておきます。
is_free_field()
{
local f=$1
local val=$2
not_allowed=0
if[["${room[$f]}"="."]];then
room[$f]=$val
score=$((score+val))
else
not_allowed=1
fi
}
鉱山の抽出
以下に示すように、有効な入力は、座標、および地雷の対応する位置。プレイヤーは、入力した h6
ゲームのインターフェイスは、生成されたいくつかのランダムな値になります。鉱山の発見後、これらの値は、ユーザのスコアに追加されます。
鉱山の抽出
、我々は最初に定義された変数を忘れないでくださいa
- g
あなたは、私が特定の値をランダムに生成地雷を決定するためにそれらを使用します。したがって、入力は、プログラム(に基づいて、プレイヤに基づいて座標をm
ランダムに周囲の他の細胞(上記に示す)の値を生成するために生成された番号)。最終的に初期入力値と加算の座標、結果のすべての後 i
に(上記のように計算されました)。
次のコードであることに注意してください X
ゲームの終わり私たちの唯一のマークです、。我々は、ランダムなリストに追加されます。では shuf
魔法の指揮下に、X
あなたはどのような場合に表示されることができますが、運がよければ、それは表示されませんされている可能性があります。
m=$(shuf-e a b c d e f g X -n 1)#将 X 添加到随机列表中,当 m=X,游戏结束
if[["$m"!="X"]];then# X 将会是我们爆炸地雷(游戏结束)的触发标志
for limit in ${!m};do#!m 代表 m 变量的值
field=$(shuf-i 0-5-n 1)#然后再次获得一个随机数字
index=$((i+limit))#将 m 中的每一个值和 index 加起来,直到列表结尾
is_free_field $index $field
done
私はゲームのインターフェイス、表示されたすべてのランダムな細胞は、細胞はプレイヤーの選択に近いたいです。
鉱山の抽出
そして、選択したセルの数が利用可能な記録
プログラムは、細胞が選択されているゲームのインターフェイスを記録する必要があります。そうでなければ、プログラムは常にすべてのセルが、あまりにも選択されている場合でも、入力されたデータにユーザーをできるようになります。これを実現するために、私は名前の作成 free_fields
、初期値を変数に 0
。 for
サイクル、選択可能なゲームのインターフェイス細胞内のレコード数。セルは、ポイントの値に対応する場合(.
)されている free_fields
インクリメント。
get_free_fields()
{
free_fields=0
for n in $(seq 1 ${#room[@]});do
if[["${room[$n]}"="."]];then
((free_fields+=1))
fi
done
}
待って、あれば free_fields=0
それ?これは、プレイヤーがすべてのセルを選択されていることを意味します。このセクションのより良い理解を得るために、あなたはここでソースコードを見ることができます。
if[[ $free_fields -eq 0]];then#这意味着你已选择过所有格子
printf'\n\n\t%s: %s %d\n\n'"You Win""you scored""$score"
exit0
fi
ゲームの論理的な終わりを作成します。
ゲームこの場合の終わりのために、我々はいくつかの非常に巧妙なトリックを使用している、結果が画面の中央に表示されます。私はこの部分が自分の友人を探求するために、読者に委ね呼び出します。
if[["$m"="X"]];then
g=0#为了在参数扩展中使用它
room[$i]=X #覆盖此位置原有的值,并将其赋值为X
for j in{42..49};do#在游戏界面中央,
out="gameover"
k=${out:$g:1}#在每一格中显示一个字母
room[$j]=${k^^}
((g+=1))
done
fi
最後に、我々は選手の2行が最も懸念している示しています。
if[["$m"="X"]];then
printf'\n\n\t%s: %s %d\n'"GAMEOVER""you scored""$score"
printf'\n\n\t%s\n\n'"You were just $free_fields mines away."
exit0
fi
Minecraftのゲームオーバー
記事はここで終了し、私の友人!あなたが詳細をお知りになりたい場合は、この地雷除去ゲームのソースコードがあり、私のGitHubリポジトリを参照してください、あなたはバッシュで書かれた多くのゲームを見つけることができます。私はこの記事がバッシュと楽しさを学ぶことにご関心を喚起ことを願っています。