LabVIEWでヘビを作った方法

「nefig do /ちょうどlulzのために」は...







ヘビ。 このゲームは古いものです( Wikipediaによると、1970年代の中期、または終り)ですが、少なくともLabVIEW 2009でのグラフィカルプログラミングの可能性を示すための単純だが興味深いアルゴリズムの例としては、それほど面白くありません。







実際にはアルゴリズム。





ゲームの基本は整数の2次元配列で、これは競技場を表します。 この配列には、ヘビが配置されます。 ヘビの頭がアレイの新しいフィールドに移動すると(ヘビの移動方向に応じて)、特定のセルの寿命が追加されます。



ゲームの各サイクルで、サイクルは配列を実行し、非ゼロセルの値を1ずつ減らします。 その後、画面上でゼロ以外のセルは色で塗りつぶされ、ゼロのセルは白のままになります。 したがって、最初のセルの寿命に等しい長さの非ゼロセルのループは、フィールドを横切って移動する頭の後ろで絶えず伸びます。 したがって、細胞の寿命がヘビの長さを決定します。 また、長さは増減できます。



特定の「食べ物」を食べると、蛇の長さが伸びます。 食べ物-競技場のポイント。その2つの座標によってのみ記述されます。 食べられるとすぐ、つまり、ヘビの頭の座標が食物の座標と一致し、ヘビの長さが1増加し、食物はランダムに選択された座標の新しいペアを受け取ります。



ヘビの尾を噛むと、ヘビの長さが短くなります。 はい、私はこれがもはやヘビではなく、ある種のワームであり、古典的なヘビではゲームをゲームオーバーで終わらせるべきであり、ポイントではないことを理解しています。 これは単純に行われます。ある時点で、ヘビの頭がすでにその体で占められている細胞に入ると、そのダインは噛まれた部位で記録された値だけ減少します。 残りの尾はフィールド上に静かに横たわり、その寿命を使い果たします。



タスクはシンプルで簡単です。 次にLabVIEWを使用します。



ゲームインターフェース





フォーム上に要素を作成しましょう-ClassicBooleanツールバーの配列と最も単純なブールインジケーター「フラットスクエアボタン」。







ブールインジケーターのタイトルを非表示にして色付けし、falseの場合はそのフレームとフレームが白になり、trueの場合はそれぞれダークグリーンとライトグリーンになるようにします。 インジケーターのサイズを10 x 10ピクセルに設定します。



インジケーターを配列に配置します。 配列を2次元にし、配列とそのタイトルのインデックスインジケーターも非表示にします。 配列自体は成長しているため、32 x 24のインジケーターのコピーが表示されます。



素敵な色で図形をペイントします。 このアイテムはオプションですが、私のお気に入りです。



すべての操作の後、trueとfalseの値のランダムなセットを持つ競技場は次のようになります。







プログラムのメインサイクル。





プログラムは、Whileループに基づいており、falseで終了します。つまり、決して終了しません。 ループ内に配列のターミナルを配置し、次の変数を配列に接続します。配列にはゲームの主要なパラメーターが格納されます。 これらは、ヘビの頭の座標、動きの方向と長さ、食物の座標、対応するクラスターに結合されたもの、および最初の章で述べた整数配列です。 すべて次のようになります。







サイクルの内容




ループ内に、コントロール矢印を押すことに関するキーボードからの信号を処理するためにイベントをキャプチャするためのイベント構造と、各スネークステップの処理シーケンス全体を段階的に配置するシーケンシャル構造を追加します。 そして、最初のステップは、すべての非ゼロ要素を1ずつ減らして、配列全体を実行します。これは、互いにネストされた2つのforループを使用して行われます。







次のステップは、動きの方向に応じて頭の座標を変更し、食べ物を食べたり、尾を噛んだりする場合にヘビの長さを変更することです。 座標は、可変方向が接続されている条件端子に構造であるケースを使用して変更されます。 方向の値に応じて、構造のタブの1つが実行され、対応する座標が1増加または減少します。 同時に座標が最大値またはゼロを超えると、ゼロにリセットされるか、最大値に設定されて、いわゆる「画面の端を通過する」ことが保証されます。



新しい座標が食品の座標(2つの比較演算子と1つのAnd演算子)とペアワイズで等しい場合、長さは1増加し、食品の新しい座標は乱数ジェネレーター(0から1)と係数を使用して生成されます。 それ以外の場合(falseタブは表示されません)、3つの変数はすべて同じ値を取得します。



頭の新しい位置の座標を持つ配列の要素がゼロに等しくない場合、この要素の値は蛇の長さから差し引かれます。 ヘビの長さの値がゼロ以下になると、ヘビの頭が常に残るため、値1が割り当てられます。



値のクラスターが集まり、新しい値を吸収します。 このステップで変更されていない値は再選択できません-とにかく同じままです。







次のステップでは、ヘビの長さがその有効期間として新しいフィールドに書き込まれ、ブール配列が生成され、フロントパネルのインジケーターにアップロードされます。 難しくありません。 荷を降ろす直前に、食事の座標に等しい座標を持つセルに真を追加することを忘れないでください。







運営管理





実際のところ、それはすべてスネークです。コントロールを強化するためだけに残っています。 彼のために、イベント-構造、またはロシア語ではイベントの構造をすでに決定しています。 このマルチタブ構造は、事前定義されたイベントの1つが発生するまで指定された時間間隔の間待機し、待機するときに対応するタブを実行します(そうでない場合はタイムアウトタブ)。 イベントは、アプリケーションのフロントパネルでのマウスクリックからシステムイベントでの終了まで、さまざまです。 キーボードのキーダウンイベントに興味があります。



イベント構造をシーケンシャル構造の最後のフレームに移動し、Snakeクラスターを含むコンダクターをその中に挿入します(キーボードのキーを押すと値が正確に変更されるため)。



イベントを追加するには、イベントソース(イベントソース)として以下を選択します。 そしてイベントとして:キー->キーダウン。



構造体から返されるイベントパラメーターのうち、イベントをトリガーしたキーのコードを含むVKeyパラメーターのみに関心があります。 ケースの追加-左のキーが押された場合は0、下の場合は1、右の場合は2、上の場合は3を返す構造。 他のキーを押すと、方向の値は変更されません。 イベント構造がメジャー間の間隔を短くしないようにするために、追加の遅延が追加されました。







それだけです。 実行してプレイできます。 もちろん、フロントパネルに得点の数、ゲームの速度(メジャー間の遅延の量)が依存する難易度なども表示するのが良いでしょう。



ご希望の方は、こちらの完全なアプリケーション図をご覧ください



All Articles