1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| unit tirage;
interface
const
maxRows = 6;
maxCols = 9;
maxList = maxRows*maxCols; // ou maxCols*3 ?
type
TImgItem = record
Index : LongInt; // numero de l'image
RefCount : LongInt; // nombre de fois que l'image a été attribué
end;
TImgList = packed array[0..maxList-1] of TImgItem;
TCounter = packed array[0..maxRows-1, 0..maxCols-1] of LongInt;
procedure RandPull(const aRow, aCol: LongInt; var aImgList: TImgList; var aCounter: TCounter);
procedure InitImgList(var aImgList: TImgList);
procedure InitCounter(var aCounter: TCounter);
var
ImgList : TImgList;
Counter : TCounter;
implementation
procedure InitImgList(var aImgList: TImgList);
var N : LongInt;
begin
for N := 0 to maxList-1 do
begin
aImgList[N].Index := N;
aImgList[N].RefCount := 0;
end;
end;
procedure InitCounter(var aCounter: TCounter);
var R,C : LongInt;
begin
for R := 0 to maxRows-1 do
for C := 0 to maxCols-1 do
aCounter[R, C] := 0;
end;
procedure RandPull(const aRow, aCol: LongInt; var aImgList: TImgList; var aCounter: TCounter);
var R, C, IL, N, Rw, Cl:LongInt;
begin
if aRow < 0 then Rw := 0 else if aRow >= maxRows then Rw := maxRows-1 else Rw := aRow;
if aCol < 0 then Cl := 0 else if aCol >= maxCols then Cl := maxCols-1 else Cl := aCol;
// valeur : nombre de paires
N := (Rw*Cl) div 2;
for R := 0 to Rw do
for C := 0 to Cl do
repeat
// on tire un numéro de carte au hasard
IL := random(N);
// si l'image n'a pas été utilisé plus de 2 fois
if aImgList[IL].RefCount < 2 then
begin
aCounter[R,C] := aImgList[IL].Index;
inc(aImgList[IL].RefCount);
end
else
aCounter[R,C] := 0;
until aCounter[R,C] <> 0;
end;
initialization
Randomize;
InitImgList(ImgList);
InitCounter(Counter);
end. |
Partager