第2回 とりあえず、ゲームでも「4.丁か?半か?」

2−4 丁か?半か?

 サイコロを使ったゲームで、単純に思いついたのが「丁半賭博」なので、とりあえず、これを作って見ることにします。
ルールは簡単です。2つのサイコロを振って、合計が偶数なら丁(CHO)、奇数なら半(HAN)ですね。あと、どうせなら、点数(お金)も出るようにしましょう。
さて、初ゲーム、こんな仕様で作ってみます。

  CHOまたはHANを選択してボタンをタップすると、結果が出る。
  選択とサイコロの丁半が合っていれば「お見事!(OMIGOTO)」、ハズレなら「残念!(ZAN-NEN!)」と表示する。
  最初の所持金は10、1回サイコロを振る毎に1が掛け金となり、当たれば2戻ってくる。
  所持金がなくなればゲームオーバー

といったところです。ゲームの場合、仕様にルールが含まれますから、なんだかルール解説みたいにも見えますね。

今回は、予め、完成画面を紹介しておきましょう。

      

画面中の[CHO]か[HAN]を選択します(選択されている方は黒色反転します)、そして[SyoBu!]をタップすると、結果が表示されます。
中段の(5,1)が2つのサイコロの5と1を表しています。5+1=6で偶数なので丁ですね。
お金がなくなると、ゲームオーバーです。
え?サイコロの表示が数字じゃ嫌だ、って?ま、それは次回のネタにしますので、今日のところは数字がサイコロの目だと思ってください。

画面は、こんな感じで配置してみました。

    

上の「Money」はラベルLbl1011、これは、単に置いてあるだけです。その横の「10」は残金の表示Lbl1012です。初期値が10なので、この値を表示しています。
どちらも、配置時にLabelプロパティに値を直接セットしています。
次の2段の「*」記号もラベルです。それぞれ上からLbl1009、Lbl1010で、Lbl1009がサイコロを表示する用、Lbl1010がコメントなどを表示する用です。予め、表示する予定の文字数分だけ、何かを入れておく必要がありましたね。そのため、今回は「*」を使ってみました。
下にある「CHO」「HAN」と書かれた大きなボタンは「PushButton」オブジェクト、これは初登場ですね。
そして、その下は、通常のコマンドボタンです。「SyoBu!」などと設定してみました。

最初に、初登場のPushButtonから説明しましょう。
PushButtonの基本動作は、選択されているときは黒色反転表示、選択されていないときは通常表示、をしており、タップすることで2つの状態が自動的に切り替ります。
複数のPushButtonを使うと、1つを選択した時に、他方の選択が解除される「相互排除」のPushButton群を作ることができます。
相互排除にするには、GroupID#プロパティを0以外の同じ数字に設定するだけで、相互排除になります。今回は1にしてみました。

    

例えば、[CHO]の方のプロパティです。[CHO]の方は予め選択状態にしておけばよいので、最初に[Checked]にチェックしておきます。

プログラム中でPushButtonが選択されているかどうかを参照するには、そのコントロールの「Status」プロパティを参照します。
Status=NsbChecked、であれば選択状態、Status=NsbUnCheckedであれば、非選択状態です。
(その他、このような相互排除ができるコントロールに「CheckBox」があります。)

このPushButtonの相互排除を使うと、複数の中から1つのみを容易に選択できるので、今回は採用してみました。
相互排除によって、丁を選んだら、勝手に半の選択が解除されますから、プログラムがスッキリします。

さて、丁半賭博ですが、

    「入ります。」
    カラカラカラ・・・スタン!
    「さぁ、張った張った!丁方ないか、丁方。半方ないか半方。」
    「よしゃぁ、半!」
    「丁半、出揃いました。・・・勝負!」
    ・・・・・・・
    「ピンゾロの丁!」
    「あ〜ぁ・・・」

という手順で進められますね。
重要なのは、
  1. サイコロを振る
  2. 丁か半に賭ける
  3. 結果がわかる
という手順です。

さて、NS Basicはイベントドリブン型のプログラム言語でしたね?何らかのきっかけで動作が行われるタイプです。
そこで、このような手順をプログラムにするために、イベント的に丁半賭博を見てみましょう。

    ? → サイコロが振られる
    丁か半をタップ → 選択肢が決まる
    勝負! → 結果判定

結果判定を行う処理は、勝負(SyoBu!)ボタンをタップしたイベントで処理できますね。
丁半を選択するのは、PushButtonの相互排除が処理してくれます。
しかし、一番最初にサイコロを振る処理を、発生させるイベントは見当りません。
例えば「サイコロを振る」ボタンを置いても良いのでしょうが、ゲーム的にスマートではありませんね?
さて、そもそも、サイコロは結果が表示されるまでに振られていれば良いわけですよね?賭けてから振っても遅くありません。
そこで、プログラムしやすいように「SyoBu!」ボタンがタップされてからサイコロを振ることにします。
こうすることで「SyoBu!」ボタンイベント1つで全ての処理を実行でき、楽に作ることができます。プログラム的にサイコロを振る処理に「作為的」な要素を入れなければ、イカサマと言われることはないでしょう。

    丁か半をタップ → 選択肢が決まる
    勝負! → サイコロが振られる → 結果判定

それでは、このような仕様を元に、処理を記述していきましょう。

前へ     目次へ     次へ

第2回 とりあえず、ゲームでも「4.丁か?半か?」