占いアプリを作ろう

今回のC#プログラミング学習は、簡単な占いアプリケーションを作ります。

とはいってもまだウィンドウを作ることしかやってないので、そこに少し新しい学習内容を追加して、なんとか占いソフトにしていきます。

もちろん、動画解説も用意したので、こちらも参考にしてください。

ダウンロード

まずはここをクリックして今回使用するファイル一式をダウンロードします。

ZIP形式になっているので、ダウンロードしたら解凍します。

解凍すると「Step4」フォルダの中に、「Compile.bat」と「Step4.txt」があるはずです。

「Compile.bat」は、C#コンパイル作業を効率よく行うためのバッチファイルです。

前回みっちりやりましたね(苦笑)。

「Step4.txt」はテキスト形式になっていますが、占いアプリケーションのC#ソースファイルです。

プログラム実行

どんな占いアプリケーションを作っていくのかわからなければ話にならないので、まずは、コンパイルして実際に動かしてみましょう。

「Compile.bat」のC#コンパイラまでのパスをあなたのパソコン環境にあわせて書き換えたら、実行し「Step4.exe」を作ります。

完成した「Step4.exe」を選択しEnterキーを押すか、「Step4.exe」上でダブルクリックして占いアプリケーションを起動します。

すると、「占い」と書かれたウィンドウが開いて、中央に「占う」と書かれたボタンが表示されます。

中央の「占う」ボタンを押すと、今のあなたの運勢がメッセージボックスで表示されます。

占いは普通、「大吉」とか「吉」などで占いの結果が表現されますが、それではつまらないので、以下の5段階で表現することにしました。

「超!ラッキー!」「ラッキー!」「普通」「ちょっとダメ!」「ダメダメ!!」です。

これならだれにでもわかりやすいですからね。

こんな占いアプリケーションを作っていきましょう。

プログラム解説

それでは占いアプリケーションのプログラム解説をします。

「Step4.txt」を開くと以下のようなプログラムが表示されます。

using System;
using System.Drawing;
using System.Windows.Forms;


/********************
Step4クラス
********************/
class Step4
{
/* Mainメソッド */
public static void Main()
{
Application.Run(new MyForm());
}
}


/********************
MyFormクラス
Formクラスを継承
********************/
class MyForm : Form
{
private const int ButtonWidth = 75; // ボタンのよこ幅
private const int ButtonHeight = 25; // ボタンのたて幅

/* コンストラクタ */
public MyForm()
{
FormDesign();
}

/* FormDesignメソッド */
/* ウィンドウをデザインする */
public void FormDesign()
{
StartPosition = FormStartPosition.CenterScreen;

MaximizeBox = false; // 最大化コマンドの無効化
FormBorderStyle = FormBorderStyle.Fixed3D; // サイズ変更コマンドの無効化

Text = "占い";
BackColor = SystemColors.Window;
ClientSize = new Size(ButtonWidth *2, ButtonHeight *2);

// ボタンを作る
Button Btn = new Button();
Btn.Width = ButtonWidth;
Btn.Height = ButtonHeight;
Btn.Text = "占う";
Btn.BackColor = SystemColors.Control;
Btn.Parent = this;
Btn.Location = new Point(ButtonWidth /2, ButtonHeight /2);
Btn.Click += new EventHandler(ButtonClick);
}

/* ButtonClickメソッド */
/* ボタンが押された */
public void ButtonClick(object sender, EventArgs e)
{
Random rnd = new Random(); // 擬似的な乱数を準備する
int number = rnd.Next(0, 5); // 0から4までのどれかが代入される
String result;

if (number == 0)
{
result = "超!ラッキー!";
}
else if (number == 1)
{
result = "ラッキー!";
}
else if (number == 2)
{
result = "普通";
}
else if (number == 3)
{
result = "ちょっとダメ!";
}
else if (number == 4)
{
result = "ダメダメ!!";
}
else
{
result = "エラー!";
}

MessageBox.Show("今のあなたは「" + result + "」です。", "占いの結果");
}
}

外部DLLの読み込み

まずは、このプログラムで利用しているDLLファイルの宣言があります。

using System;
using System.Drawing;
using System.Windows.Forms;

書式は「using DLLファイル名;」ですね。

このような書式で記述すればいくつでも外部のDLLファイルの利用を宣言できます。

今回は、「System.dll」、「System.Drawing.dll」と「System.Windows.Forms.dll」ですね。

Step4クラス

今回は、クラスが2つあり、まず最初に登場するのがこのStep4クラスです。

このクラスには、コンピューターが最初に見に行くMainメソッドがあるので、そういった意味ではメインとなるクラスです。

Mainメソッド

Mainメソッド(関数)は以下の部分です。

public static void Main()
{
Application.Run(new MyForm());
}

Mainメソッドでは、このプログラムを実行させる「Application.Run」命令があるだけです。

「new」命令で後述のMyFormクラスからインスタンスの作成を指示しています。

MyFormクラス

このクラスでウィンドウ(フォーム)のデザイン設計をしたり、「占う」ボタンが押された時の一連の処理を記述しています。

フォーム関連の処理をしているので、Formクラスを継承しています。

メンバ変数

このクラスでは、冒頭部分で以下のメンバ変数が定義されています。

private const int ButtonWidth = 75;
private const int ButtonHeight = 25;

これはボタンの横幅と縦幅を定義する変数です。

「private」は「public」の反対で、この変数のアクセス範囲を限定的なものにしています。

「const」は、この変数の値が定数であることを表しています。

変数というのはその名のとおり、その値が変化するのが普通です。

でもプログラムの中には、今回のボタンの縦幅と横幅のように、変化してほしくない値もあるわけです。

そんなときは、「const」を付けて、この変数の値が定数であることを宣言します。

もちろん「const」を付けなくてもコメントを付けて注意を促しておけば、定数扱いにすることはできます。

でも、他人にプログラムを見せるときや、未来の自分がこのプログラムを見たとき、「const」が付いていれば定数であることを容易に理解してくれます。

あとこれはコンパイラにもよるんですが、「const」が付いているのに途中で値が変化していた場合には、警告を出してくれるものもあります。

「int」というのは、この変数が数字を入れるための変数であるということを宣言しています。

なので、変数「ButtonWidth」と「ButtonHeight」というのは、アクセスできる範囲が限定的で決まった数値が入った変数ということになります。

「ButtonWidth」はボタンの横幅、「ButtonHeight」はボタンの縦幅を記録した変数です。

コンストラクタ

コンストラクタとは、自動的に呼び出されるメソッド(関数)のことです。

プログラム内では、以下の部分がそうです。

public MyForm()
{
FormDesign();
}

メソッド名にクラス名(今回であればMyForm)を使用することにより、これがコンストラクタであることを宣言しています。

コンストラクタは同名のクラス名(今回であればMyFormクラス)が最初に呼び出されたときに一度だけ実行されます。

なので、プログラムの初期設定や、フォームデザインをするのに理想的です。

今回の占いプログラムでも、FormDesignメソッドを呼び出して、フォーム内をデザインさせています。

FormDesignメソッド

FormDesignメソッドでは、フォーム(ウィンドウ)をデザインしています。

どんなデザインかというと、占いアプリケーションのウィンドウ(フォーム)内に「占う」と書かれたボタンが1つ置かれている状態を表現します。

以下の部分がそうですね。

public void FormDesign()
{
StartPosition = FormStartPosition.CenterScreen;

MaximizeBox = false; // 最大化コマンドの無効化
FormBorderStyle = FormBorderStyle.Fixed3D; // サイズ変更コマンドの無効化

Text = "占い";
BackColor = SystemColors.Window;
ClientSize = new Size(ButtonWidth *2, ButtonHeight *2);

// ボタンを作る
Button Btn = new Button();
Btn.Width = ButtonWidth;
Btn.Height = ButtonHeight;
Btn.Text = "占う";
Btn.BackColor = SystemColors.Control;
Btn.Parent = this;
Btn.Location = new Point(ButtonWidth /2, ButtonHeight /2);
Btn.Click += new EventHandler(ButtonClick);
}

FormDesignメソッドの宣言については、名前が違うだけで宣言内容は前回説明したことと同じなので、詳しくはそちらを参照してください。

FormDesignメソッドの中身についても、コメントを読めばだいたいどんなことをどんな順番でやっているのかがわかると思います。

まずは、表示されるウィンドウ(フォーム)がパソコン画面の中央に表示されるように設定します。

「StartPosition = FormStartPosition.CenterScreen;」というのがそうですね。

次に、ウィンドウ(フォーム)にあらかじめ備わっている機能の中から、不要な機能を無効化します。

基本的なウィンドウ(フォーム)というのは、一番上にソフトウェア名が書かれたタイトルバーがあり、その横に最小化、最大化、閉じるボタンが並びます。

さらにウィンドウ(フォーム)の境界線にマウスを持っていくと、そのサイズを自由に変えることができるようになっています。

このような機能が付いていても問題ないならよいですが、今回は、ウィンドウ(フォーム)の大きさを固定したいので、サイズ変更関連の機能を無効化します。

具体的には、以下のようにして最大化コマンドとサイズ変更コマンドを無効化します。

MaximizeBox = false;
FormBorderStyle = FormBorderStyle.Fixed3D;

次に、ウィンドウ(フォーム)のタイトルと背景色を指定します。

これは前回やったので、説明する必要ないですね。

Text = "占い";
BackColor = SystemColors.Window;

これでウィンドウ(フォーム)の外側ができたので、次は内側を作ります。

ウィンドウ(フォーム)の内側はどんなデザインにしましょうか…。

まずは大きさを決めます。

ボタンが1つだけなので、ボタンと同じサイズのウィンドウ(フォーム)にしてもいいんですが、それだとつまらないので、少し大きめなサイズを指定してその中央にボタンを置くことにします。

なので、わかりやすく横幅はボタンの横幅を、縦幅はボタンの縦幅をそれぞれ2倍したサイズにします。

プログラム内でそれらを表現している部分は以下です。

ClientSize = new Size(ButtonWidth *2, ButtonHeight *2);

次は、いよいよボタンを作ります。

まずは、インスタンスを作成し、次にプロパティを設定していくという流れになります。

これは前回ウィンドウ(フォーム)を作ったときと同じ理屈です。

まずは「new」命令でインスタンスを作成し、変数「Btn」にそのデータを格納します。

Button Btn = new Button();

次に、ボタンの横幅、縦幅、ボタンに表示する文字とその背景色を指定します。

Btn.Width = ButtonWidth;
Btn.Height = ButtonHeight;
Btn.Text = "占う";
Btn.BackColor = SystemColors.Control;

これでボタンの外見ができました。

次に、このボタンがどのウィンドウ(フォーム)に張り付くのかを指定します。

Btn.Parent = this;

もちろん、MyFormクラス(このクラス)に付けたいので「this」を指定します。

次に、ボタンが張り付く場所を指定します。

Btn.Location = new Point(ButtonWidth /2, ButtonHeight /2);

貼り付けるボタンの左上の頂点が、「Point(横軸, 縦軸)」で指定するポイントになるようにします。

今回は、ウィンドウ(フォーム)の横幅は、ボタンの横幅を2倍した長さ。

ウィンドウ(フォーム)の縦幅は、ボタンの縦幅を2倍したものです。

ということは、例えばウィンドウ(フォーム)内をボタンで敷き詰めようと思ったら、横に2つ、縦に2つの合計4つボタンが置けますよね。

そして、今回のように中央に1つだけボタンを置こうと思ったら、貼り付けるボタンの頂点というのは、敷き詰めた4つのボタンのそれぞれ中央に位置することになりますよね。

そしてボタンを貼り付けるときは、左上の頂点の座標だけでいいので…。

横軸はボタンの横幅を半分にしたところを、縦軸はボタンの縦幅を半分にしたところを指定すればよいことになります。

これでウィンドウ(フォーム)のどの位置にどんなボタンが張り付くのかが指定できました。

次に、貼り付けたボタンが押された時にどうするのかを指定します。

Btn.Click += new EventHandler(ButtonClick);

ボタンがクリックされた時、コンピューター側では様々な処理が行われます。

そこに「new EventHandler」という命令で「ButtonClick」という名前のメソッドを呼び出すようにするという指定を追加しています。

このような仕組みのことをデリゲートと言ったりします。

これでウィンドウ(フォーム)とボタンのデザイン指定が完了しました。

次は、いよいよボタンが押された時の動きを指定します。

ButtonClickメソッド

「占う」ボタンが押されたら、ButtonClickメソッドが呼び出されます。

具体的な内容は以下のようになっています。

public void ButtonClick(object sender, EventArgs e)
{
Random rnd = new Random(); // 擬似的な乱数を準備する
int number = rnd.Next(0, 5); // 0から4までのどれかが代入される
String result;

if (number == 0)
{
result = "超!ラッキー!";
}
else if (number == 1)
{
result = "ラッキー!";
}
else if (number == 2)
{
result = "普通";
}
else if (number == 3)
{
result = "ちょっとダメ!";
}
else if (number == 4)
{
result = "ダメダメ!!";
}
else
{
result = "エラー!";
}

MessageBox.Show("今のあなたは「" + result + "」です。", "占いの結果");
}

呼び出されたButtonClickメソッドは、擬似的な乱数を用いて数値を取得し、その数値に対してあらかじめ決められた文字列(占い結果)を出力します。

ひとつひとつ内容を見ていきましょう。

まずはButtonClickメソッドの宣言から。

public void ButtonClick(object sender, EventArgs e)

これも今まで出てきたことと同じですね。

ただし今まではカッコ内に何も入っていませんでしたが、今回は何か入っていますね。

カッコ内は引数といって、メソッドが呼び出されたときに、呼び出し側からもらえるデータが入っています。

今回このメソッドを呼び出したのはウィンドウズ側ですから、ウィンドウズ側がボタンが押された時の状況の情報をまとめて渡してくれているんです。

なので引数(カッコ内の文字列)は、システム側で決められた決まり文句みたいなものだと思って今回は無視してください。

次はメソッドの内容に移ります。

まずは占い結果の元となる数値を取得します。

ここでは擬似的な乱数を使っています。

Random rnd = new Random();

擬似的な乱数を準備しています。

何度も出てきたインスタンス作成の書式と同じですね。

次は、実際に値を受け取ります。

int number = rnd.Next(0, 5);

変数「number」に0から4までのどれかが代入されます。

次は、出た数値に対して、文字列を入れるための変数を用意します。

String result;

変数名は「result」で、「String」というのは、これが文字列を入れるための入れ物であることを宣言しています。

次は、出た数値に対して、対応する文字列を変数に入れていきます。

if (number == 0)
{
result = "超!ラッキー!";
}
else if (number == 1)
{
result = "ラッキー!";
}
else if (number == 2)
{
result = "普通";
}
else if (number == 3)
{
result = "ちょっとダメ!";
}
else if (number == 4)
{
result = "ダメダメ!!";
}
else
{
result = "エラー!";
}

このような処理のことを条件分岐といいます。

条件(今回であれば出た数値)に応じて、変数「result」に入れる文字列を変えています。

C#プログラムでこのような条件分岐を記述するには、if文かswitch文を使うのが常套手段です。

今回は、if文にしてみました。

if文とは、もしカッコ内の条件が成立しているときに「{」から「}」の中が実行されるというものです。

もしカッコ内の条件が成立しない場合には、「else」以降が処理されます。

なので今回であれば、変数「number」に出た数値が格納されているので、この変数「number」に対して0から4までの数値の場合の処理を示しています。

ここまでくると「==」というのもなんとなくわかりますよね。

「==」というのは、「==」の左の値と右の値が等しいことを表しています。

なので、0の時は「超!ラッキー!」。

1のときは「ラッキー!」、2のときは「普通」。

3のときは「ちょっとダメ!」、4のときは「ダメダメ!!」。

それ以外の数値が出たときは「エラー!」という文字列を変数「result」に代入します。

最後に、変数「result」を表示させて終了です。

MessageBox.Show("今のあなたは「" + result + "」です。", "占いの結果");

「MessageBox.Show」はダイアログを表示させる命令です。

表示内容については、実際に動かしたものと照らし合わせてみてください。

C#プログラム解説は以上です。