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



7ピース全定義したところで、
Pieceオブジェクトのshapeに、
どれかのピースを適当に代入する処理を作ります。
Formのpublicに新しい手続きを追加します。
本当はTPieceに載せるのが正しいのですが、
今回は、配列を引数に持つ、っていう、ちょいムズなところを
避けるのでご了承。
  public
   { Public 宣言 }
   (略)
   procedure SetRandomShapeToPiece(target:TPiece);
   procedure CopyBlockImageToField(x,y:integer;block:TBitmap);
 end;
えー、相変わらず長い長い名前ですが・・・
1文字打つ Ctrl+Space をどんどん使ってみてください。
引数targetに渡したTPieceのインスタンスに、
PieceShapeTables:Array[0..6,0..3,0..3]of Boolean;
から、一つ選んで入れるわけですな。
ただ、ここでRandom関数を使うので、
Randomizeしておかないといけません。
あと、さっき作ったInitも実行しておかないと意味なしです。
SRSTP(略してみた)の実装部の前に、
Form.onCreateを編集
procedure TForm1.FormCreate(Sender: TObject);
begin
   Randomize;
   InitPST;
   (だいぶ略)
end;
じゃぁSRSTP実装部
procedure TForm1.SetRandomShapeToPiece(target:TPiece);
var num,i,j:integer;
begin
   num:=Random(7);
   For i:=0 to 3 do begin
       For j:=0 to 3 do begin
           target.shape[i,j]:=PieceShapeTables[num,i,j];
       end;
   end;
end;
変数の意味
num  どのピースを選ぶかの乱数を保存するところです。
3次元配列で一次元目になります。
i カウンタ変数。ピースのy座標用
j カウンタ変数。ピースのx座標用
まずnumに乱数を入れます。
Randomは「0〜引数-1」の乱数を返す関数でした。
今回は「0〜7-1」で、「0〜6」を返してくれます。
で、この二重forループは、
今回もうおなかいっぱい出てるんで大丈夫ですよね。
ループの中心で、
target[i,j](iはy、jはx用なので
に、
PST[num,i,j]をはめて終了です。
numはピースセットの番号ですから、一次元目の要素番号なわけです。
二次元目と3次元目はyとxなのでiとjですね。
そしたら、Form.onCreateの、
shapeの手動代入部分を書き換えます。
   Piece:=TPiece.Create;
   Piece.Init(5,-3,30,MapBlocks);
   Piece.shape[0,1]:=True;
   Piece.shape[1,1]:=True;
   Piece.shape[2,1]:=True;
   Piece.shape[2,2]:=True;
   Piece:=TPiece.Create;
   Piece.Init(5,-3,30,MapBlocks);
   SetRandomShapeToPiece(Piece);
実行するたびに違う形が落ちてきたら成功です。
落下速度が遅いって人は、
Initの第3引数の30を小さくしてみてください。
0にすると落ちてこないので注意。

img1.png

ららららーらー