procedure TForm1.Button1Click(Sender: TObject);
var
ainit:array[1..54] of boolean;
i,j,k:integer;
begin
for i:=1 to 54 do
  ainit[i]:=false;
  randomize();
  for i:=1 to 54 do begin
    abutton[i].Tag:=random(55-i)+1;
    k:=0;
    for j:=1 to abutton[i].Tag do
    begin
      k:=k+1;
      while ainit[k] do
      begin
        k:=k+1;
      end;
    end;
  ainit[k]:=true;
  abutton[i].Tag:=k;
  abutton[i].Picture.Bitmap.LoadFromResourceName(hinstance,('lv'+inttostr(139+k)));
  end;
end;
以上的第三个FOR循环我怎么也不能理解,哎,真是太笨了,脑子总是转不过来,请高手帮忙啊,谢谢,请帮我详细解释一下上面的算法,abutton是timage类,这个不重要的

解决方案 »

  1.   

    while那个循环?就是一直找到还没有发出去的ainit[k]牌嘛
      

  2.   

    var
      ainit: array[1..54] of boolean;
      i, j, k, T: integer;
    begin
      for i := 1 to 54 do ainit[i] := false; //标记每张没都没被抽出
      randomize(); //播下随机种子
      for i := 1 to 54 do begin
        T := random(55 - i) + 1; //随机从第几张开始抽牌
        k := 0; //记数
        for j := 1 to T do begin
          k := k + 1;
          while ainit[k] do //如果已经被抽过则跳到下一张
            k := k + 1;
        end;
        ainit[k] := true; //打上被抽过的标记
        T := k;
      end;
    end;//--------------------------------------------------------------------
    var
      vList: TList;
      I, J, T: Integer;
    begin
      Randomize; //播下随机种子
      vList := TList.Create;
      try
        for I := 1 to 54 do vList.Add(Pointer(I)); //得到一副顺序排列的扑克
        for I := 1 to 54 do begin
          J := Random(vList.Count); //从余下的扑克中随机选一张
          T := Integer(vList.Items[J]);
          vList.Delete(J); //抽取完后从列表中删除      AButton[I].Tag := T;
          AButton[I].Picture.Bitmap.LoadFromResourceName(HInstance,
            Format('lv%d', [139 + T]));
        end;
      finally
        vList.Free;
      end;
    end;