この記事で扱っていること
- ジャンケンゲームを作る方法
を紹介しています。
注意:すべてのエラーを確認しているわけではないので、記事の内容を実装する際には自己責任でお願いします。また、エラー配線は適当な部分があるので適宜修正してください。
本記事では、昔のゲームセンターでよく見た、ジャンケンマンフィーバーのようなゲームを作ります。
勝ってもコインが払い戻されるわけではないですが、デジタル表示の画面にグー、チョキ、パーを表示して、プレイヤーが出したい手のボタンを押したらコンピュータ側の手も表示され勝ち負け(あるいはあいこ)を決めます。
一回で終わるのも面白くないので、どちらかが5回勝ったら終わり、ということにします。
どんな結果になるか
フロントパネルにはコンピュータの手を表示するブールの2次元配列と、コンピュータおよびプレイヤーの勝ち数を表示するブール1次元配列、ステータスを表示するための文字列表示器と、プレイヤーが出す手を決めるボタンがあります。
(フロントパネルの背景は、通常のものだと味気ないので、空色に変えています)
プログラムを実行してゲームスタートボタンを押してスタートします。
コンピュータの手は常にグー、チョキ、パーを巡っていて、プレイヤーが出す手のボタンを押すと確定し、勝敗をつけます。
プログラムの構造
今回のプログラム、コンピュータが出す手を常に画面上で更新し、プレイヤーが出す手を決めるまではその動作を止めません。
こうした場合には、イベントストラクチャを使用したプログラムではなく、ポーリング(ループが常に回っていて、ユーザーのボタン操作等をずっと監視している状態)のプログラムの方が組みやすくなります。
(イベントストラクチャを使用したプログラムでももちろん組めますが、常に回り続けているループがある以上、敢えてイベントストラクチャを使用する利点は少ない、ということです)
プログラムの処理の流れは単純なので、ステートマシンでの実装としています。
ステートマシンのWhileループに入る前に、コンピュータが出す手の「絵柄」を先に定数で決めておきます。
この定数の配列(「定数」が2次元配列なので、定数の配列としては3次元になります)の指標をWhileループの中で順繰りに指定していきます。
絵柄はより大きい2次元配列の方がはっきりグー、チョキ、パーを表現できますが、あまり大きい2次元配列にしても余計に負荷ばかりかかるので、最低限指の数で識別できるようにするのであれば以下の図のような表示がいいかなと思います。
ゲーム終了のボタンはいつでも反応できるようにステートマシンのケースストラクチャの外に置いておきます。
こうすることで、どのステートからでも停止させることができます。
ステートマシンを構成する各ステートは以下の通りです。
まずはinitializeステートです。
ステートマシンで使用する各データを初期化します。
グー、チョキ、パーのブールボタンはラッチ動作としていますが、これらは最初は押せないようになっています。
ゲーム開始してからこれらのボタンを押させるためですね。
次にgameステートです。
プレイヤーが出す手を選ぶまではこのgameステートが回り続けます。
このとき、コンピュータの手は、Whileループの外で用意した定数の3次元配列を順に取り出すため、コンピュータの手というパラメータを更新していき、これを3で割ったときの余りで配列の指標を指定しています。
3で割ったときの余りは、0か1か2の3種類しかないため、グー、チョキ、パーを重複することなく指定することができます。
また、あいこフラグが立っているかどうかでステータスに表示する文字列を変えます。
ループの速度は待機関数へ渡す数値で変えられますが、常に同じ値だと万が一目押しされても面白くないので、少しランダム要素を持たせています。
プレイヤーが出す手を決めたら一瞬の間を置きたいため、出す手のボタンが押された時には待機時間を長めにしています。
以下の図で、左下にある「初めて呼び出す?」に対するFalseケースには何の処理もおいていません。
次のresultステートでは勝ち、負け、あいこの判定を行います。
コンピュータの手とプレイヤーの手の組み合わせで9通りあります。
もっといい実装の仕方があるかもしれませんが、9通り程度であれば泥臭く全部のケースをケースストラクチャで表現した方が早いですね。
なお、あいこだった場合にはあいこフラグをTrueにしていきます。
これらの勝敗に応じて得点を表す1次元配列の値を更新します。
また、待機時間も少し長めに取っておくことで、プレイヤーが結果を認識しやすくしておきます。
最後はstopステートで、こちらではWhileループを止めるだけです。
なお、得点の表示についてはサブVIを使用しており、得点表示の配列から情報を抽出してブール表示器に表せる形に変換しています。
また、5回勝ったらプログラムが終了するための判定もついでに行っておきます。
連勝するまで終わらないようにする場合
上で紹介したプログラムは、先にプレイヤーかコンピュータが先に5回勝つまで終わらないのですが、途中で負けたとしても勝利ポイントは変わりませんでした。
そうではなく、連勝するまで終わらないようにプログラムを少し変更することができます。
要はresultのステートで、負けた方のポイントが常に0になるように得点配列へ置換操作を加えればよいだけです。
以下では、3回連勝した方が出るまでゲームが終わらないようにした例を示しています。
本記事ではジャンケンゲームを作る方法を紹介しました。
プログラムの構造としては基本的なステートマシンなのでどちらかというと簡単な部類になりますが、処理の中で扱うパラメータを数字で持っておいて割り算の余りを使用することで配列指標を切り替えるなど、他のプログラムでも使えるテクニックもあるので初心者の方がLabVIEWに慣れるのには適しているテーマかと思いますので参考になればうれしいです。
ここまで読んでいただきありがとうございました。
コメント