色当て その2 ( INI ファイルを使おう )

前回作成した色当てゲームをもう少し遊びやすく ( あまり改善されてませんが (^^;) してみましょう。前回の状態で遊んで見ますと、色を選択してから OK ボタンを押した後の「自分のパネル」と「コンピュータのパネル」の色が合っているかどうかの判定の演出が少し分かりにくいような感じがしています。

そこで今回は、「コンピュータのパネル」を判定時のときだけ表示させるようにし、そして判定し終わった後、ユーザーに「さらに続けるかどうか」の選択をしてもらうようにしてみたいと思います。それでは、前回作成したフォームを拡張します。下の図を見てください。

このように、若干ボタン、ラベルなどを追加しました。下に配置したボタン( Button2, Button3 )で、ユーザーに「続けるかどうか」の選択をしてもらうようにします。 また、右側に配置したラベルには、今までの「正解数、不正解数」の表示をさせたいと思います。

それでは、プログラムを見てみます。

implementation

{$R *.dfm}

// グローバル変数
var
  Hit: Integer; // 正解
  Miss: Integer; // 間違い

.............................
procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;

  Label5.Caption := IntToStr(Hit); // 正解数の表示
  Label6.Caption := IntToStr(Miss); // 不正解数の表示

  Label3.Caption := '色を選択して下さい';
  Panel2.Visible := False; // パネルを非表示に
  Button2.Enabled := False; // ボタンを使用不可に
  Button3.Enabled := False;

end;
.............................
procedure TForm1.Button1Click(Sender: TObject);
begin
  case Random(3) of
    0: Panel2.Color := clRed;
    1: Panel2.Color := clYellow;
    2: Panel2.Color := clBlue;
  end;

  JudgeColor;
  
  Panel2.Visible := True;
  Button1.Enabled := False;

  Label5.Caption := IntToStr(Hit);
  Label6.Caption := IntToStr(Miss);

  Label4.Caption := '続けますか?';
  Button2.Enabled := True;
  Button3.Enabled := True;

end;

procedure TForm1.JudgeColor;
begin
  if Panel1.Color = Panel2.Color then
  begin
    Label3.Caption := '当たりです!';
    Inc(Hit); // 正解数に1を足す
  end else
  begin
    Label3.Caption := '残念、はずれです。';
    Inc(Miss); // 不正解数に1を足す
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Close; // 閉じます。
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Panel2.Visible := False;
  Label3.Caption := '色を選んで下さい';
  Label4.Caption := 'チャレンジ中...';
  Button1.Enabled := True;
  Button2.Enabled := False;
  Button3.Enabled := False;
end;

Button2 の Caption プロパティを OK、Button3 の Caption プロパティを Cancel にして下さい。 ここで、実行してみてください。前回の時よりは「自分のパネル」と「コンピュータのパネル」の色判定の演出が若干( 本当に少しですが(^^;) 分かりやすくなったと思います。 また、ここではグローバル変数として「 Hit 」「 Miss 」を宣言しました。これは、その名の通り、「自分のパネル」と「コンピュータのパネル」が同じ場合は Hit を +1 、違う場合は Miss を +1 としています。要は正解数と不正解数です。

さて、ここからが今回のテーマである「 INI ファイル 」についてやっていきます。今回のゲームには正解数と不正解数を表示させるようにしました。これらの値は、一旦ゲームを終了し、再び再開すると、全て0にリセットされてしまいます。この値をゲーム終了時に保存し、再開時に読み込むようにすれば、前回の続きから始めることが出来ます。それを可能にするのが INI ファイルです。なんだか聞きなれない用語なので難しく感じてしまうかもしれませんが、使うことはとても簡単です。

Delphi には INI ファイルの為の TIniFile クラスが存在しますので、これを利用してやります。

unit MainFrm;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, IniFiles;

.................................
type
  TForm1 = class(TForm)
    Bevel1: TBevel;
    RadioGroup1: TRadioGroup;
.................................
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private 宣言 }
  public
    { Public 宣言 }
    procedure JudgeColor;
  end;
..................................
procedure TForm1.FormCreate(Sender: TObject);
var
  IniFile: TIniFile;
begin
  IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) +
    'data.ini');
  // INI ファイルを読み込む
  try
    Hit := IniFile.ReadInteger('ColorGame', 'Hit', 0);
    Miss := IniFile.ReadInteger('ColorGame', 'Miss', 0);
  finally
    IniFile.Free; // 忘れず開放
  end;

  Randomize;

  Label5.Caption := IntToStr(Hit);
  Label6.Caption := IntToStr(Miss);

  Label3.Caption := '色を選択して下さい';
  Panel2.Visible := False;
  Button2.Enabled := False;
  Button3.Enabled := False;

end;

..................................
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  IniFile: TIniFile;
begin
  IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) +
    'data.ini');
  // INI ファイルに書き込む
  try
    IniFile.WriteInteger('ColorGame', 'Hit', Hit);
    IniFile.WriteInteger('ColorGame', 'Miss', Miss);
  finally
    IniFile.Free; // 忘れず開放
  end;

end;

これで、おしまいです。具体的に何をやっているのかといいますと、単に INI ファイルに対して「読み書き」をしているだけです。書き込む為のメソッドには WriteInteger の他に WriteString、WriteBool があり、読み込む為のメソッドには ReadInteger の他に ReadString、ReadBool があります。それぞれのメソッドのパラメータの意味は、実際に作成された INI ファイルをみてみると、すぐ分かると思います。また、ReadInteger の第3パラメータは、それぞれその項目が無かった場合に使われるデフォルト値です。

今回作成された INI ファイルをみてみますと以下のようになっていました。

[ColorGame]
Hit=12
Miss=19

今回は、INI ファイルを使用してデータの読み書きをやってみました。ここでは単に「今までの正解数、不正解数」に対してのみですが、他にも「最高何回連続して、色当てに成功したか」等、機能を追加してやると、面白みに幅が出てくると思います。


up next
Last update: 2002/5/19