マイクロチップ社のマイクロコンピュータPIC16C/F84を使った製作例の
プログラム製作方法の紹介です。(「ゲームラボ’98/9月号に掲載)
まず全体は光線銃そのものと、的になる受光セットの2つからできて
います。
ゲームの仕方は、受光セットの電源をONとすると、数秒後にブザーが
鳴り始め、同時に、数字表示器が時間カウント表示を始めます。
これが始まったら光線銃の射的として動作し始めたことになり、光線銃
を発射して当たれば、その時点の時間で時間カウントが停止し、開始
時点からの時間を10msec単位で表示したまま停止します。
もう一度光線銃が当たると表示が消え、ゲームが再開しますので、
繰り返しゲームを楽しむことが出来ます。
これで早撃ちの時間を競うゲームが出来ます。
ゲームのプログラムは全て、受光セットの中にある、PIC16F84で実行
しています。
【プログラムの概要】
今回のプログラムはダイナミック点灯という表示制御をしますので、
プログラムとしては、一瞬も止められない繰り返し処理があることになり
ます。
一寸でも止めれば、表示が完全に消えてしまうためです。
従って、その他の処理は、表示処理の繰り返しの合間にやってしまわな
ければなりません。
そこで活躍するのが「フラグ」と呼ばれるソフトウェアのスイッチの働きを
する変数データです。今回使っているフラグは3種類で、これが0か0で
ないかによってプログラムの流れの制御をしています。
SHOOT:受光素子が光を検知したというフラグ。
WAIT:受光後、一定時間次の受光を無視するためのカウンタ兼用
のフラグ。
RESTART:1回ゲームが完了し、再開のため受光待ち中を表すフラグ。
この3個のフラグを使い分けて下図の全体フロー図のように、プログラム
の流れの制御を行っています。
流れが代わるのはひし形の判断ブロックの所で、ここでフラグによる判定
を行っていることになります。いわゆる「if」文に相当します。
![]()
【プログラムの動作説明】
フロー図の流れは、まず、イニシャライズでポートの設定をしたあと、
フラグのリセットをしてダイナミック表示をするサブルーチンを実行し、
時間をカウントアップして再表示をするというループで繰り返します。
表示のサブルーチンの中で、光を検知したかというチェックをしており、
光を検知するとSHOOTフラグがONとなってサブルーチンから戻って
来るので、戻って来た所でSHOOTフラグの判定をしています。
その判断ボックスを右側に抜けると、RESTARTフラグの判定になりま
すが、まだ初めてなのでそのまま下に抜けてWAITカウンタのカウント
ダウンをして戻ります。そしてまた同じルートを通ってWAITカウンタを
減算して抜けるということを、WAITカウンタがゼロになるまで繰り返し
ます。
この繰り返しの間に、光線銃からの閃光はなくなりますから、1回の
光線銃の発射で1回だけの当たり判定が出来ることになります。
WAITカウンタがゼロとなると、確かに光が当たったというルートを通って
RESTARTフラグがON、SHOOTフラグがOFFとなって戻って来ます。
そうすると、次のループはゲーム再開待ちのループとなり、表示時間も
カウントアップされないので、一定の時間値(つまり開始から光線銃の
光を検知するまでの時間)を表示したまま表示ループを繰り返すことに
なります。
この間にさらに光線銃の光を検知すると、再度SHOOTフラグがONと
なって戻って来ますが、RESTARTフラグがONなので、再開のルートに
変更され、最初の初期化の所に戻って、ゲームが再開されることになり
ます。これで一巡の流れを完了したことになります。
このゲームの再開の時に、時間カウントをスタートするまでに遅れの時間
を挿入するのですが、この時間をランダムにしてゲームらしくするために、
前回の時間値からディレイタイムを計算して毎回異なるディレイ時間に
なるようにしています。
このフロー図をもとに作成したプログラムのリストが下記リストです。
日本語のコメントを入れてありますので、フロー図との対応はすぐ出来ると
思います。
★ 光線銃による早撃ちゲームプログラムリスト
【数値データからセグメントデータへの変換】
プログラムとして一寸特殊なテクニックを使っているのが、この数値データ
を、表示出力用のセグメントデータに変換するサブルーチンです。
このために使っている命令が「RETLW a」という命令で、これは、aという
値をWregに戻り値として持ってサブルーチンからリターンします。
これを利用して、あらかじめ0〜Fまでのバイナリデータに対してセグメント
の組み合わせを持った16個のRETLW命令を順に並べたテーブルを作成し、
「ADDWF PCL,F」という命令で、変換元のバイナリデータと現在のプログラ
ムカウンタ値(PCL)を足し算して、テーブルの該当するRETLW命令にジャン
プするようにし、セグメントデータを戻り値として戻す様にしています。
【ダイナミック表示制御のサブルーチン】
3桁の表示制御は、各桁毎に同じサブルーチンを使います。その1桁表示
のサブルーチンは、ポートへ出力する順序が大切で、まず、表示セグメント
データをRB1からRB7に出力し、その次に桁表示のRAの1ビットをONとしま
す。
そして3msec待ってから、RAをOFFにして表示を全消去しておきます。
この全消去は、つぎの桁を出力するまでの瞬間だけになるので、見た目に
は感じませんが、表示部が離れていて、信号の波形が崩れて遅れが発生し
たときなどに、一瞬前の桁の表示が次の桁にチラツクのを防ぐ働きがあり
ます。