個人の目次へ - 全体の目次へ
前の章へ - 次の章へ

2章・Web教材の構成について

 ではここでは、どのような教材が出来たのか、またどのようにオブジェクト指向プログラミングを解説していくのかについて説明します。

2−1 教材の全体的な構成

この教材の構成は、4つの章で構成ししています。1章では、オブジェクト指向プログラミングの歴史や現状、将来について解説しました。それを踏まえて実際にオブジェクト指向プログラミングについて学習することになります。2章から4章では、例題となるプログラムを実際に作成して学習します。

以下がこの教材の目次となります。

第1章  オブジェクト指向プログラミング

1-1.歴史 1-2.現状 1-3.未来

第2章  ボールが動くプログラム

2-1.概要 2-2.プログラムの作成 2-3.分析・設計 2-4.解説

第3章 もぐらたたき

3-1.概要 3-2.プログラムの作成 3-3.分析・設計 3-4.解説 

3-5.プログラムの改良

第4章

複数のフォームを持つプログラム

 目次は、Web教材の画面を左右に分割した左側の部分にまとめて、リンクをはり、自由に目的の部分を参照できるようにしました。図で示すとこのようになります。

2−2 教材での解説方法

ここでは実際に教材でオブジェクト指向プログラミングの解説をどのように行ったのか、また解り易くするためにどのような方法をとったのかを説明します。

この教材でオブジェクト指向プログラミングを学習してもらう上で、例題となるプログラムを3つ用意しました。これは利用者がオブジェクト指向プログラミングについての知識を習得するためには、実際にプログラムを作成してもらったほうがよいと思ったためです。また、対象となる、プログラミングBを受講した学生にとって理解し易いものにするため、例題のプログラムは実際にプログラミングBのテキストに乗っているものを使いました。

教材では、これら3つの例題プログラムそれぞれに対して、@この例題で学習してほしい点とこれから作るプログラムの概要Aプログラムを作るB作ったプログラムに対する分析・設計の観点からの解説C作ったプログラムに対するプログラミングの観点からの解説という順番で学習を進めることにしました。この理由は、最初に学習してほしい点を提示することで、利用者はまとを絞って学習することが出来ると思ったためです。また、解説しながらプログラムを作るのではなく、先にプログラムを作ってから解説を見ることで、プログラムを作る作業とプログラムの解説を読む作業のそれぞれに集中することが出来るようになり、学習し易くなると思ったためです。

また、利用者がプログラムを作成する上で参考となるように、各プログラムの実行ファイルをダウンロード出来るようにし、実行画面を確認出来るようにしました。

2−3 例題プログラムの解説

ここでは、教材で使用した3つの例題プログラムについて簡単に解説します。ここで解説することは、これらのプログラムが例題となるために工夫した点についてです。プログラムの詳しい内容は論文に付属してあるフロッピーを参考にしてください。

@ ボールが動くプログラム

 このプログラムは1999年度プログラミングBの講義で使われたテキストの応用課題43を参考にしています。

 このプログラムは操作盤というフォームの開始ボタンを押すと、表示盤というフォームにあるPaintBoxコンポーネント上を動く速さの違う赤と青の2つのボールが動くというものです。操作盤フォームのNameプロパティはFormControlでユニット名はControlとしました。また、表示盤フォームのNameプロパティはFormDisplayでユニット名はDisplayとしました。そして出現する赤いボールはTballAというフォームを持たないユニットだけの1つのクラスとして作りました。それを継承し、色と動く速さを変えたTballBというクラスを作りました。

 実行画面は以下のようになります。

 操作盤フォームの開始ボタンがクリックされると、表示盤のPaintBoxコンポーネントに緑の四角形を描画させ、赤と青の2つのボールを作り出し、TimerコンポーネントのEnabledプロパティをTrueにします。

procedure TFormControl.ButtonstartClick(Sender: TObject);
begin
 FormDisplay.Display_Yield;
 BallA.Ball_Yield;
 BallB.Ball_Yield;
 Timer1.Enabled:=True;
end;

 ここにあるBallA.Ball_Yieldの内容はこのようにしました。

procedure TBallA.Ball_Yield;
begin
 Ball_Init;
 Speed;
 Ball_Draw;
end;

 このようにTballAクラスは、Ball_Yieldが呼び出されると、3つの手続きを呼び出すようにしました。Ball_Initではボールの描画位置である変数xcとyc、ボールの半径である変数rに値を代入します。次にSpeedでボールの動く速さを決める変数dxとdyに値を代入します。そして最後にBall_Drawでは円を描画するCircleという手続きと、先に値を代入した変数を使ってボールを表示盤に描画します。以下はそれぞれの手続きの内容です。

procedure TBallA.Ball_Init;

begin

 xc:=Round(FormDisplay.PaintBox1.Width/2);

 yc:=Round(FormDisplay.PaintBox1.Height/2);

 r:=10;

end;

procedure TBallA.Speed;

begin

Randomize;

 dx:=2+Random(4);

 dy:=2+Random(4);

end;

procedure TBallA.Ball_Draw;

begin

 Circle(xc,yc,r,clRed);

end;

Procedure TBallA.Circle(xc,yc,r:Integer; cl:TColor);

begin

 FormDisplay.PaintBox1.Canvas.Pen.Color:=cl;

 FormDisplay.PaintBox1.Canvas.Brush.Color:=cl;

 FormDisplay.PaintBox1.Canvas.Ellipse(xc-r,yc-r,xc+r,yc+r);

end;

 次にTballAを継承して作った新しいTballA型のTballBクラスについて説明します。

type

  TBallB = class(TBallA)

 2つ目のボールは青色で、最初のボールよりも速く動くようにします。そのためTballBでオーバーライドしている手続きはSpeedとBall_Drawです。

procedure TBallB.Speed;

var

  Newdx,Newdy:integer;

begin

  Newdx:= Getdx+5;

  Newdy:= Getdy+5;

  Setdx(Newdx);

  Setdy(newdy);

end;

procedure TBallB.Ball_Draw;

begin

Circle(Getxc,Getyc,Getr,clBlue);

end;

A モグラたたきをするプログラム

 このプログラムは2001年度プログラミングBの講義で使われたテキストの『第6章ビジュアルプログラミング応用編―Timerを利用したプログラム』の『モグラたたきゲームの作成』に載っているプログラムを参考にしています。

 このプログラムは表示盤というフォームの開始ボタンをクリックすると、ゲームが始まりButtonコンポーネントで表現した9個のモグラが出現したり消えたりします。同時に制限時間をカウントしていて、時間が来たらゲームが終了します。表示盤フォームのNameプロパティはFormDisplayで、ユニット名はDisplayとしました。また、モグラをTBMoguraAというフォームを持たない1つのTButton型のクラスとして作りました。これはDelphiコンポーネントであるButtonコンポーネントからメソッドやプロパティを継承するためです。そしてTBMoguraAから9個のモグラを複製しました。

 実行画面はこのようになります。

 モグラはButtonコンポーネントで表現することにしたので、TBMoguraAはTbutton型のクラスであると宣言します。

type

 TBMoguraA = class(TButton)

 TballAクラスとの違いは、DelphiのButtonコンポーネントを継承して作っているということです。そのため、Buttonコンポーネントの外観についてプログラミングしなくてもよくなり、また、Buttonコンポーネントが持つCreateメソッドを使えるようになります。ここではCreateメソッドの中でButtonコンポーネントのプロパティを変更しました。

constructor TBMoguraA.Create (AOwner: TComponent);

begin

inherited Create (AOwner);

    Parent:=FormDisplay;

    Left:= 150;

    Top:= 50;

    Caption:='モグラ';

    Visible:=true;

    Enabled:=false;

   end;

B 改良したモグラたたきをするプログラム 

 前に作ったプログラムとゲームセンター等に実在するモグラたたきと比べた時に、不自然な点があることを指摘して、実際のモグラたたきをモデルにしたプログラムを作ることにしました。このプログラムは前に説明したモグラたたきをするプログラムに変更を加えて作ります。

 前のプログラムのようにモグラを複製で作ると、TBMoguraAのMoveという手続きではランダムで出現位置を決めるPositionAからPositionIという手続きのどれかを呼び出し、出現します。

procedure TBMoguraA.Move;

begin

case Random(2) of

  0:

   begin

    case Random(8) of

     0: PositionA;

     1: PositionB;

     2: PositionC;

     3: PositionD;

     4: PositionE;

     5: PositionF;

     6: PositionG;

     7: PositionH;

     8: PositionI;

    end;

   end;

  1:

    Visible:=false;

end;

end;

procedure TBMoguraA.PositionA;

begin

 Top:=50;

 Left:=50;

 Visible:=true;

end;

 PositionBからPositionIについては省略します。

 複製でモグラを作ると、実行しただけの段階では、全てのモグラのLeftプロパティとTopプロパティが同じになるため、1箇所に重なって出現してしまいます。そのため、9個のモグラは9箇の出現位置を移動しなければならなくなりました。その問題を解決するために、モグラを継承で作ることにしました。TBMoguraAから残りの8個のモグラを継承し、Createメソッドをオーバーライドして、LeftプロパティとTopプロパティの値はPositionBからPositionIを呼び出して代入することにしました。

constructor TBMoguraB.Create (AOwner: TComponent);

begin

inherited Create (AOwner);

    Parent:=FormDisplay;

    PositionB;

    Caption:='モグラ';

    Visible:=true;

    Enabled:=false;

   end;

 この結果、モグラは出現位置を移動しなくてもよくなったので、基本クラスであるTBMoguraAのMoveメソッドをこのように書き換えました。

procedure TBMoguraA.Move;

begin

case Random(2) of

  0:

    Visible:=true;

  1:

    Visible:=false;

end;

end;

C複数のフォームを持つプログラム

このシステム中に含まれるプログラムについて、まずカラースロットマシンは1999年度プログラミングBの講義で使われたテキストの基礎課題63を参考にしています。また、反射神経テストは1999年度プログラミングBの講義で使われたテキストの応用課題22を参考にしています。そしてボールが動くプログラムは1999年度プログラミングBの講義で使われたテキストの応用課題43を参考にしています。モグラたたきをするプログラムは、2001年度森田専門ゼミナールのプログラミングトレーニング第2段階の課題である、モグラたたきゲーム(動き回るモグラ)を参考にしました。

このプログラムでは、カラースロットマシン、反射神経テスト、ボールが動くプログラム、モグラたたきをといった4つのフォーム(プログラム)を作りました。ここでは4つのフォームに共通の要素を抜き出して、抽象的なフォームを作り、そこからフォームを継承してプログラムを作るという方法で作ります。実行画面には以下のような4つのフォームが出現します。

カラースロットマシンと反射神経テストを作るために、ベースフォームという2つのButtonコンポーネントとTimerコンポーネントを使ったプログラムを持つ簡単なフォームを作り、そこからフォームを継承して作りました。また、ボールが動くプログラムとモグラたたきをするプログラムは、ベースフォームから継承して作ったPaintBoxコンポーネントとそこに緑で四角形を描画する手続きを持つNew_ベースフォームより継承して作りました。

ベースフォームにはTimerコンポーネントの操作について記述しておきます。

procedure TForm1.Button1Click(Sender: TObject);

begin

 Timer1.enabled:=true;

end;

procedure TForm1.Button2Click(Sender: TObject);

begin

 Timer1.enabled:=false;

end;

また、New_ベースフォームには、ベースフォームのButton1Clickメソッドをオーバーライドして、PaintBoxコンポーネントに四角形を描画する手続きを記述しました。

Procedure TForm4.Rect(x1,y1,x2,y2:integer; cl:TColor);

begin

  PaintBox1.Canvas.Pen.Color:=cl;

  PaintBox1.Canvas.Brush.Color:=Cl;

  PaintBox1.Canvas.Polygon([Point(x1,y1),Point(x2,y1)

              Point(x2,y2),Point(x1,y2)]);

end;

procedure TForm4.Display_Draw;

begin

  Rect(0,0,PaintBox1.Width,PaintBox1.Height,clGreen);

end;

procedure TForm4.Button1Click(Sender: TObject);

begin

 inherited;

  Display_Draw;

end;

 以下に、全てのフォームの継承関係を簡単に図で表します。

このプログラムの中のボールが動くプログラムとモグラたたきで使われているボールとモグラは、先にクラスとして作ったものをプロジェクトに追加して使いました。Delphiにある、『プロジェクトに追加』ボタン(赤で囲った部分)をクリックし、追加しました。

 そして、プロジェクトファイルに変更を書き、追加したユニットやそれを使うユニットには、参照するクラスやユニットの名前を書き換えて使います。