Тебе нужен алгоритм перемешивания колоды.
По сути, тебе надо сделать их одинаковыми по размеру (ну чтобы не заморачиваться с вычислением положения).
Далее алгоритм выглядит так:
В отдельном масиве (можно констант) держишь координаты для 4х чекбоксов. Функция их перемешивания использует соответсвенно массив из указателей. Ты генеришь число от 1 до 4 и помещаешь в полученную ячейку соотв. первый чекбокс. Генеришь еще одно такое-же число. Если ячейка уже занята, то делаешь кольцевой сдвиг пока не найдешь свободную ячейку. И так для все четырех.
для 4х комбиков выглядит примерно так:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
CheckBox1: TCheckBox;
CheckBox2: TCheckBox;
CheckBox3: TCheckBox;
CheckBox4: TCheckBox;
btShufl: TButton;
procedure FormCreate(Sender: TObject);
procedure btShuflClick(Sender: TObject);
private
{ Private declarations }
FCoords : Array [1..4] Of TPoint;
FBoxes : Array [1..4] Of TCheckBox;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var
I : Integer;
begin
// Init boxes array
FBoxes[1] := CheckBox1;
FBoxes[2] := CheckBox2;
FBoxes[3] := CheckBox3;
FBoxes[4] := CheckBox4;
// Init coor array
For I := 1 To 4 Do
Begin
FCoords[i].X := FBoxes[i].Left;
FCoords[i].Y := FBoxes[i].Top;
End;
end;
procedure TForm1.btShuflClick(Sender: TObject);
var
I : Integer;
Idx, TestIdx : Integer;
FNewBoxes : Array [1..4] Of Integer;
begin
// Zero temp boxes array
For I := 1 To 4 Do FNewBoxes[i] := 0;
// Shufl
Randomize;
For I := 1 To 4 Do
Begin
Idx := Random(4) + 1; // Gen random [1..4]
If FNewBoxes[Idx] = 0
Then FNewBoxes[Idx] := I // Cell empty
Else // Cell not empty
Begin
TestIdx := Idx;
While FNewBoxes[TestIdx] <> 0 Do
Begin
Inc(TestIdx);
If TestIdx > 4 Then TestIdx := 1;
End;
FNewBoxes[TestIdx] := I;
End;
End;
// move boxes
For I := 1 To 4 Do
Begin
FBoxes[FNewBoxes[i]].Left := FCoords[i].X;
FBoxes[FNewBoxes[i]].Top := FCoords[i].Y;
End;
end;
end.