Du skal teste alle, men det går stinkende hurtigt, faktisk kan du ikke nå at stave til IB inden det er gjort, med mindre vi snakker flere millioner entries, men nu ligner det jo noget Poker, så der er nok ikke så mange
procedure check_Valid(isvalid : integer); var x, y : integer; begin for x := 0 to MaxSuits do begin for y := 1 to MaxCard do begin if Valid[x][y] = true then isvalid := isvalid+1; end; end; end;
Suits: array[0..MaxSuits] of string = ('Spades', 'Diamonds', 'Clubs', 'Hearts');
var Form1: TForm1; Valid: array[0..MaxSuits, 1..MaxCard] of boolean;
implementation
{$R *.dfm}
procedure check_Valid(var isvalid : integer); var x, y : integer; begin isvalid := 0; for x := 0 to MaxSuits do begin for y := 1 to MaxCard do begin if Valid[x][y] = true then isvalid := isvalid+1; end; end; end;
function select_card(tekst: TLabel) : string; var suit,number : string; ransuit, rannumber, valid_card : integer;
begin
Randomize; ransuit := random(3); rannumber := random(MaxCard)+1; if Valid[ransuit][rannumber] = false then begin check_Valid(valid_card); if valid_card > 0 then tekst.Caption := 'No more cards' else select_card(tekst); end else begin suit := Suits[ransuit]; number := Numbers[rannumber]; Valid[ransuit][rannumber] := false; tekst.Caption := suit+' '+number; end; end;
procedure TForm1.Button1Click(Sender: TObject); begin select_card(label1); end;
procedure TForm1.FormCreate(Sender: TObject); var x,y : integer;
begin
for x := 0 to MaxSuits do begin for y := 1 to MaxCard do begin Valid[x][y] := true; end; end;
end;
procedure TForm1.Button2Click(Sender: TObject); var x,y : integer;
begin
for x := 0 to MaxSuits do begin for y := 1 to MaxCard do begin Valid[x][y] := true; end; end; Label1.Caption := '';
end;
end.
---------------------------------
Den popper frem og siger: 'No more cards' når den ikke skal. Det burde den først sige når der ikke er flere.
Du kunne lave den ikke-rekursivt. Hvis der er kort tilbage, så vælgt eet tilfældigt. Hvis den er optaget lægger du een til, indtil du finder en ledig. (Og ryger du ud over kanten starter du forfra).
Det kan gøres anderledes, men det er bedre end det du har nu ;)
hvis du mener at jeg skal gøre det omvendt, så prøvede jeg sådan her:
-----------------------------------
function select_card(tekst: TLabel) : string; var suit,number : string; ransuit, rannumber, valid_card : integer;
begin
Randomize; ransuit := random(3); rannumber := random(MaxCard)+1; check_Valid(valid_card); if valid_card <> 0 then begin if Valid[ransuit][rannumber] = false then select_card(tekst) else begin suit := Suits[ransuit]; number := Numbers[rannumber]; Valid[ransuit][rannumber] := false; tekst.Caption := suit+' '+number; end; end else tekst.Caption := 'No more cards'; end; ------------------------------------------------
Sorry - jeg overså din bemærkning fra for 4 dage siden. Men ok, du har en løsning. Jeg samler slet ikke på point, tak. Det er vel ok selv at svare og acceptere eget svar.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.