コラム / テトリスぽいもの / 6



MapBlocksの定義を更新
   TMapBlocks = Class(TObject)
   private
   public
       //変数定義
       Blocks:Array[0..19,0..9] of Boolean;
       function isBlock(x,y:integer):Boolean;
   end;
さて、function という新しい言葉が出てきました。
手続きの定義は、procedure でした。
これは、関数の定義です。
関数は、値を返す命令でしたね。
ここは、
interface>type>function
ですから、定義部の方です。名前だけを決めます。
定義部での構文はこうなります。
function 関数名 引数: 返り値の型;
procedureに、:返り値の型 がついただけです。
今回は、返り値はBooleanなので、論理型です。
x,yで与えられた位置のマスが、ブロックがあるか無いかを返します。
フィールドの外なら絶対、「ある」を返します。
じゃぁ、実装部を書きましょう。
implementationの下に書き足します。
implementation

{$R *.dfm}

function    TMapBlocks.isBlock(x,y:integer):Boolean;
begin

end;
こう。
全体としてはこんな関係になってます。

img1.png

では、以下のコードを入れてください。
function    TMapBlocks.isBlock(x,y:integer):Boolean;
begin
   if (x<0)or(9<x)or(y<0)or(19<y) then begin
       Result:=True;//フィールドの外は埋まっている
       Exit;//終了
   end;
   //範囲内に収まっていたら
   Result:=Blocks[x,y];//そのまま返す
end;
はじめにif文がありますね。
なにやら「or」と 書いてあります。
「orは、論理演算子です。両辺の論理和を返します。」
難しく言ってみました。
論理和っていうのは、
「どっちかが正しいなら正しい」
という論理値演算の事です。
今回の場合で言えば、
(x<0) または (9<x) または (y<0) または  (19<y)
のどれかが真ならば真
という事になっています。
例えば・・・
「駅から5分か、家賃が安いなら買います」
といったケースの場合、
買い決定:= 駅から5分以内 or 家賃が安い;
と かけます。
さて、この条件、それぞれ、
x<0
xが0より小さい、すなわち、一番左の列(0)より左を指定した
9<x
xが9より大きい、すなわち、一番右の列(9)より右を指定した
y<0
yが0より小さい、すなわち、一番上の列(0)より上を指定した
19<y
yが19より大きい、すなわち、一番したの列(19)より下を指定した
と、どれか一つでもあってれば、
指定範囲がフィールドからはみ出ることになるので、
どれか一つがあっていた時点(つまりor演算)で、then以下に進みます。
Result:=True;
functionは関数で、返り値を返すのでしたね。
Delphiでは、関数の中で、関数自身の返り値は、Resultという特別な変数になります。
functionが終わったとき、Resultの値が返り値となります。
ここでは、Result:=True ですから、
はみ出ていたら真を返す となります。
isBlock関数、つまり、「指定した場所がブロックか」という関数なので、
「フィールドの外にはいけないという事を示すため、
 フィールドの外はブロックだ と 返すことにしました。」
で、exit;で、functionを抜け、
ResultがTrueなので、isBlock関数は真を返すことになりますとさ。
C言語ユーザーへ
(C言語では、return 1; とやったら、返り値の指定と同時に終わりますが、
 Delphiでは返り値の代入と命令の終了はばらばらです!
 (そのおかげで、int ret;とかの宣言は省けるけど まぁ、どうなんだろ)
)
さて、4つの比較文がFalse、つまり、フィールドの中だった場合は、
Result:=Blocks[x,y];
ですが、そのままです。
Blocksは、ブロックがあれば真、無ければ偽 の、フラグの表でしたから、
引数、x,yで指定されたマスのBlocksの値は、
そのまま、そのマス(x,y)に、ブロックがあるかないか
と同じです。
あ、xとyは引数ですよ。
引数は、その命令の中で、変数と同じように参照できるのでした。
マップクラスっぽいものができたところで、
裏画面とかの実装をすることにしましょう。