GeoCities home page

プログラミング A home page

1998年4月27日分

数当てゲームを作ってみよう

さて、これまでの知識を活用して、数当てゲームを作ってみましょう。新しくプログラムを作るのですから、これまでのプログラムはすべて閉じてください。(今後はこのような細かい指示は出しません。)

次のようにコンポーネント(部品)を配置してください。それぞれのコンポーネント(部品)のNameプロパティ(属性)も下のように変更してください。

それぞれの入力欄は空欄にしてください。ボタンは「答えあわせ」と表示してください。

これから作る数当てゲームは、プレイヤー(遊ぶ人)がEditAnsに適当な数(たとえば2)を入力して答えあわせボタンを押すと、プログラムは正解(たとえば7)と比較して、正解なら「正解!」、はずれなら「はずれ」とEditMesに表示するプログラムです。

この説明がよく分からなくても、とりあえず作って遊んでみましょう。

ButtonCheckのOnClickで、次のように書いてください。

void __fastcall TForm1::ButtonCheckClick(TObject *Sender)

{

if (EditInput->Text.ToInt() == 7) {

EditMes->Text = "正解!";

} else {

EditMes->Text = "はずれ";

}

}

できたら実行しましょう。解答欄(EditInput)に7以外の数を入れてボタンを押すと「はずれ」、7を入れてボタンを押すと「正解」と表示されますね。

しかし、このプログラムにはいくつかの欠点があります。

1つ目の欠点は、はずれのときに大きすぎるのか小さすぎるのか分からないことです。これを、「大きすぎるよ」「小さすぎるよ」と表示するようにしましょう。プログラムを次のように変えてください。

void __fastcall TForm1::ButtonCheckClick(TObject *Sender)

{

if (EditInput->Text.ToInt() == 7) {

EditMes->Text = "正解!";

} else if (EditInput->Text.ToInt() < 7) {

EditMes->Text = "小さすぎるよ";

} else {

EditMes->Text = "大きすぎるよ";

}

}

プログラムを簡単に説明します。新しく else if という文が出てきましたが、これは elseif との単なる組み合わせです。

このプログラムを日本語で書くと次のようになります。

もし7なら {

「正解」と表示

} そうではなく、もし7未満なら {

「小さすぎるよ」と表示

} そうではなければ {

「大きすぎるよ」と表示

}

課題:もし「10」と入力したときに「10では大きすぎるよ」と表示するようにプログラムを変えなさい。

2つ目の欠点は、答えが7に決まっていることです。これでは、1回遊ぶと答えが分かってしまいます。答え(7)をプログラムの中に書く代わりに、プログラムを実行してすぐに答えを入力するようにしましょう。この説明でよく分からなくとも、とりあえずプログラムを入力し、動かしてみましょう。

次のようにフォームに正解欄を作ってください。

また、正解欄は空欄にしてください。

これまでは正解は7と決まっていたので、これを変えるため、プログラムを次のように書き換えましょう。

void __fastcall TForm1::ButtonCheckClick(TObject *Sender)

{

if (EditInput->Text.ToInt() == EditAns->Text.ToInt()) {

EditMes->Text = "正解!";

} else if (EditInput->Text.ToInt() < (左下へ続く)

EditAns->Text.ToInt()) {

EditMes->Text = "小さすぎるよ";

} else {

EditMes->Text = "大きすぎるよ";

}

}

できたら実行してみましょう。このゲームで遊ぶには、出題者と解答者の2人が必要です。解答者は最初は後ろを向き、その間に出題者が正解欄に答えを入力し、ウィンドウを画面の下のほうに持っていって正解が見えないようにします。

そして解答者が振り返り数を当てる、というように遊びます。

入力欄を隠す

しかしこれでは、プログラムを実行するたびにウィンドウを画面の下のほうに移動させなくてはならないので、不便で格好悪いです。別の方法で正解欄を隠すことはできないでしょうか。

オブジェクトインスペクタで、EditAnsのVisibleというプロパティ(属性)を見てください。True(真)になっていますね。このVisibleとは、(そのコンポーネントが)見えるか見えないかを決めるプロパティ(属性)です。これをfalse(偽)にして実行してみましょう。(Visibleの右の欄をクリックすると、右端にというボタンが現れます。このボタンを押してfalseを選びます。)

おっと、今度は最初から正解欄が現れませんね。これでは正解を入力することができません。正解欄は、正解を入力してからボタンを押して隠すことにしましょう。

次のように、正解を隠すボタンを作ってください。

ボタンの表示は「隠す」にします。

このボタンが押されたときに正解欄を隠すようにしたいので、ButtonHideのOnClickで次の通りプログラムを書いてください。

void __fastcall TForm1::ButtonHideClick(TObject *Sender)

{

EditAns->Visible = false;

}

このプログラムに説明は必要ないでしょう

課題:実は、1度数当てをした後は、このプログラムを終えて再び実行しない限り、正解欄は現れません。つまり、このままでは1度しか数当てゲームができないのです。しかし、1回目の数当てが終われば、つまり正解を当てれば、正解欄は見えても構わないですね。そこで課題です。正解を当てたときに正解欄が再び現れるよう、プログラムを変えなさい。

プログラムの工夫−押せないボタン

ここでやることは、プログラムをよりプログラムらしくすることです。時間がなければ、この「プログラムの工夫」を読み飛ばしても構いませんが、プログラミングの楽しさはこういうところにもあるので、ぜひ読んでほしいところです。
正解欄に正解が入力される前に「答えあわせ」ボタンが押されても困りますね。(確実にエラーになります。)そこで、「答えあわせ」ボタン(ButtonCheck)のEnabledをfalseにし、ButtonHideのOnClickに次のように行を加えてください。

void __fastcall TForm1::ButtonHideClick(TObject *Sender)

{

EditAns->Visible = false;

ButtonCheck->Enabled = true;

}

こうして、最初は押せない「答えあわせ」ボタンも、「隠す」ボタンを押すと押せるようになります。

このように余計な操作ができないようにすることは、プログラム利用者にとって「次に何をすべきか」を示すことになり、プログラムはより使いやすくなっていくのです。

課題:「隠す」ボタンを2回続けて押す、という操作は意味がないですね。そこで、1度「隠す」ボタンを押したら「隠す」ボタンは押せなくなるようにしてください。また、正解が入力されたら再び「隠す」ボタンが押せるようにしてください。

プログラムの工夫−ヘルプヒント

何も考えずに、EditInputのShowHintをtrueにし、EditInputのHintに「あなたの予想を入力してください。」と入力してください。その後、このプログラムを実行し、マウスを動かして矢印を解答欄(EditInput)の上に持っていき、1〜2秒待ってください。ヒントが表示されましたか?

これは、ヘルプヒントと呼ばれる、簡単な説明です。やり方は簡単、ボタンや入力欄などヒントを表示したいコンポーネント(部品)のShowHintをtrueにし、Hintにヒント文を書くだけです。

プログラムの工夫−色やフォント

最後に、手軽にできるプログラム改良−色やフォントの変更を行います。

フォーム(コンポーネントを載せているウィンドウ)をクリックすると、オブジェクトインスペクタはフォームを指しますね。この状態でColorを選ぶと、右欄の右端にが現れます。このを押すと、色を選ぶことができます。「clRed」を選んで、ウィンドウを赤くしてみてください。

今度は、解答欄(EditInput)のFontを選びましょう。が現れますね。これを押すと、文字のフォントなどを変更する画面が出てきます。フォントを「MS Pゴシック」、サイズを16、色を緑にしてみてください。

このようにプログラムの外見を簡単に変えることができます。しかし、あまり手を加えるとかえってくどくなります。あなたのセンスが問われる部分ですから、感じがいいプログラムを作りましょう。