Avatar billede stefmeister Nybegynder
01. marts 2005 - 17:43 Der er 21 kommentarer og
1 løsning

Teste om indholdet i et array er false

Hej...

hvis jeg nu har et array der hedder sådan her:

Valid: array[0..MaxSuits, 1..MaxCard] of boolean;


og jeg i starten af programmet definere dem alle til true.

Hvordan kan jeg så nemt teste om alle er sat til false? skal jeg teste alle sammen igennem? eller er der en smart funktion?
Avatar billede stoney Nybegynder
01. marts 2005 - 17:51 #1
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

Stoney
Avatar billede stefmeister Nybegynder
01. marts 2005 - 18:07 #2
nå okay...

har du en smart function så man nemt kan teste om de alle er false?
Avatar billede stefmeister Nybegynder
01. marts 2005 - 18:18 #3
jeg har stykket dette sammen:

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;


men synes ikke helt at det virker ordentligt.
Avatar billede nca Juniormester
01. marts 2005 - 18:34 #4
Du skal sætte var foran isvalid, så dit procedurehoved ser således ud:

procedure check_Valid(var isvalid : integer);
Avatar billede erikjacobsen Ekspert
01. marts 2005 - 18:39 #5
Det er også værd at overveje at sætte
  isvalid=0;
i proceduren.
Avatar billede stefmeister Nybegynder
01. marts 2005 - 18:52 #6
den virker stadig ikke efter hensigten.

her er min kode:

--------------------------------

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const

  MaxCard = 13;
  MaxSuits = 3;
  MaxPokerCards = 4;
  MaxDeck = 52;

  Numbers: array[1..MaxCard] of string =
  ('2', '3', '4', '5', '6', '7', '8', '9', '10', 'Jack', 'Queen', 'King',
    'Ace');

  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.
Avatar billede erikjacobsen Ekspert
01. marts 2005 - 19:08 #7
Det skal vel ikke være
if valid_card > 0 then
men
if valid_card = 0 then
Avatar billede stefmeister Nybegynder
01. marts 2005 - 19:30 #8
når man har trykket ca. 40 gange skriver den:

"Project Project1.exe raised exception class EStackOverflow with message 'Stack overflow'. Process stopped. Use Step or Run to continue."
Avatar billede erikjacobsen Ekspert
01. marts 2005 - 19:34 #9
Jah, din select_card er lidt sjov. Du kan jo risikere at den vælger et allerede
taget kort mange gang i træk. Tænk noget mere over det.
Avatar billede stefmeister Nybegynder
01. marts 2005 - 19:39 #10
ja det er det. Men jeg ved ikke hvordan jeg skal lave den ellers?
Avatar billede erikjacobsen Ekspert
01. marts 2005 - 19:53 #11
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 ;)
Avatar billede stefmeister Nybegynder
01. marts 2005 - 20:03 #12
den forstod jeg ikke helt?

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;
------------------------------------------------

men det gir samme resultat.
Avatar billede erikjacobsen Ekspert
01. marts 2005 - 20:06 #13
Det gør ingen forskel, nej. Jeg siger, at du kunne overveje at lave den ikke-rekursivt.
Avatar billede stefmeister Nybegynder
01. marts 2005 - 20:10 #14
hvad vil det sige, ikke-rekursivt?
Avatar billede erikjacobsen Ekspert
01. marts 2005 - 20:12 #15
Det er rekursivt når en procedure eller funktion kalder sig selv.
Avatar billede stefmeister Nybegynder
01. marts 2005 - 20:14 #16
okay...

men hvordan kan jeg få den til at vælge et nyt kort, uden at starte igen?
Avatar billede erikjacobsen Ekspert
01. marts 2005 - 20:34 #17
En while-løkke kan være nyttig i den situation.
Avatar billede stefmeister Nybegynder
01. marts 2005 - 20:39 #18
kan du give et eksempel?
Avatar billede stefmeister Nybegynder
05. marts 2005 - 13:22 #19
jeg har fundet en løsning.

smider du et svar?
Avatar billede erikjacobsen Ekspert
05. marts 2005 - 14:38 #20
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.
Avatar billede stefmeister Nybegynder
05. marts 2005 - 15:15 #21
ok...
Avatar billede stefmeister Nybegynder
05. marts 2005 - 15:15 #22
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester