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にすると落ちてこないので注意。
ららららーらー
コンテンツ
最新の12件
2023-06-12
2021-02-15
2013-06-19
2012-07-14
2012-02-04
2012-01-06
2011-03-31
2010-08-26
2010-03-15
2009-10-21
2009-02-12
2008-11-18
メニュー編集
- counter: 1484
- today: 1
- yesterday: 0
- online: 1