|
|
#1
|
||||
|
||||
4 Чек бокса
Здравствуйте . У меня такой вопрос может кто знает как решить .
У меня есть 4 чек бокса на форма, располагаются они симметрично друг от друга т е в виде квадрата. Мне нужно рендумом менять их место расположения так что бы они перемешались и не налегали друг на друга . но вот как сделать так что бы рендумом они могли встать только в конкретно 4 позициях и не налеч друг на друга ?? помогите пожалуйста |
#2
|
|||
|
|||
Тебе нужен алгоритм перемешивания колоды.
По сути, тебе надо сделать их одинаковыми по размеру (ну чтобы не заморачиваться с вычислением положения). Далее алгоритм выглядит так: В отдельном масиве (можно констант) держишь координаты для 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. |