[Delphi] kaartspel 21-en ontwerpen.. hellup

Pagina: 1
Acties:

  • Cerntje
  • Registratie: September 2003
  • Laatst online: 18-08 18:11
Voor school moeten we het kaartspel '21-en' ontwerpen in Delphi. Na de ontwerpfase op tafel hebben al een aardig concept bedacht en gingen we aan de slag met coderen. Alleen jah, wij zijn niet echt programmeergoden :+

Misschien kunnen jullie ons verder helpen B) :

Het spel bestaat uit 4x52 kaarten, vraag me niet waarom maar het staat zo in de opdrachtomschrijving. Wanneer het programma opgestart wordt ziet men eerst een beginscherm waar een naam ingevoerd kan worden. Vervolgens kan men op 'spelen' drukken en verschijnt er een nieuw venster waar het werkelijk spel gespeeld gaat worden. Hier duiken de problemen op.

Namelijk:

- De kaarten worden aangemaakt:

Delphi:
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
procedure maakKaarten(var kaarten : kaartarray);
var
   tkaart : string[5];
   tletter : string[2];
   tvalue : integer;
   tkaartsoort : string[8];
   tkaartsoortchar : char;
   a,b,c : integer;

begin
     c := 0;
     for a := 1 to 13 do begin
         case a of
              1 : begin tkaart := 'Aas'; tletter := ' A'; tvalue := 1; end;
              2 : begin tkaart := 'Twee'; tletter := ' 2'; tvalue := 2; end;
              3 : begin tkaart := 'Drie'; tletter := ' 3'; tvalue := 3; end;
              4 : begin tkaart := 'Vier'; tletter := ' 4'; tvalue := 4; end;
              5 : begin tkaart := 'Vijf'; tletter := ' 5'; tvalue := 5; end;
              6 : begin tkaart := 'Zes'; tletter := ' 6'; tvalue := 6; end;
              7 : begin tkaart := 'Zeven'; tletter := ' 7'; tvalue := 7; end;
              8 : begin tkaart := 'Acht'; tletter := ' 8'; tvalue := 8; end;
              9 : begin tkaart := 'Negen'; tletter := ' 9'; tvalue := 9; end;
              10 : begin tkaart := 'Tien'; tletter := '10'; tvalue := 10; end;
              11 : begin tkaart := 'Boer'; tletter := ' J'; tvalue := 10; end;
              12 : begin tkaart := 'Koningin'; tletter := ' Q'; tvalue := 10; end;
              13 : begin tkaart := 'Koning'; tletter := ' K'; tvalue := 10; end;
         end;
         for b := 1 to 4 do begin
             case b of
                  1 : begin tkaartsoort := 'Schoppen'; tkaartsoortchar := chr(6); end;
                  2 : begin tkaartsoort := 'Ruiten'; tkaartsoortchar := chr(4); end;
                  3 : begin tkaartsoort := 'Klaveren'; tkaartsoortchar := chr(5); end;
                  4 : begin tkaartsoort := 'Harten'; tkaartsoortchar := chr(3); end;
             end;
             inc(c);
             kaarten[c].kaart := tkaart;
             kaarten[c].letter := tletter;
             kaarten[c].value := tvalue;
             kaarten[c].kaartsoort := tkaartsoort;
             kaarten[c].kaartsoortchar := tkaartsoortchar;
         end;
     end;
end; 


- De kaarten moeten dan geschud worden:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure switch(var a,b : kaart);
var
   temp : kaart;
begin
     temp := b;
     b := a;
     a:= temp;
end;

procedure schudden(var kaarten : kaartarray; var times : integer);
var
   c, card1, card2 : integer;

begin
     times := times + 1;
     for c := 1 to 208 do begin
         kaart1 := random(208) +1;
         kaart2 := random(208) +1;
         switch(kaarten[kaart1], kaarten[kaart2]);
     end;
     huidigKaart         := 0;
end;


Hier worden dus alle 208 kaarten geschud en in een array geplaatst. Weet iemand hoe ik de array in Delphi kan bekijken zodat ik zeker weet dat bijvoorbeeld de kaart Harten 7 op plaats 3 van de array bevindt?

- En als dat gedaan is moeten de kaarten toegewezen worden aan de speler en de bank. En dan moet voor elke kaartwaarde ook nog de bijbehorende kaart op 'tafel' te voorschijn komen.

Kortom, nog een hoop te doen. Maar heeft iemand verder suggesties om het aan te pakken?!

Thx in advance _/-\o_

[ Voor 7% gewijzigd door curry684 op 15-09-2003 21:28 . Reden: [code]-tags zijn mooi he :) ]


  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 20-08 21:53
Doe allereerst je code in dit forum tussen [ code=delphi] an [/ code] tags. Gebruik daarnaast indentering om het geheel leesbaar te maken.

Gebruik de mogelijkheid van enumerated constanten:
Delphi:
1
2
3
4
const 
  KaartSoort: array[1..4] of string =('Schoppen','Klaveren','Harten','Ruiten')
  KaartSoortChar: array[1..4] of char =(#6,#5,#3,#4)
  enz...


Op die manier kan je die case select vervangen door
code:
1
2
  kaarten[c].kaartsoort := kaartsoort[b];
  kaarten[c].kaartsoortchar := kaartsoortchar[b];



Je vraagt voor de rest hoe er 208 kaarten geschud kunnen worden. Ik ben de tel kwijt, maar ik kom niet verder dan a (1 t/m 13) maal b (1 t/m 4) = 52 kaarten.

In de procedure 'Schudden' haal je de variabele card1, card2 door de war met kaart1 en kaart2. Om de waarde van een array/variabele te zien tijdens de uitvoering, zet je op de betreffende regel een breakpoint. (links in de kantlijn links klikken met de muis (er verschijnt een rood cirkeltje) en stel dan een wacth in: View -> Debug Windows -> watches. En type daar de naam van de variabele of van de array in.

PS: een andere snelle manier van schudden (en betrouwbaar dan wisselen van kaarten) is om de kaarten 1 voor 1 af te lopen dus beginnen met Schoppen Aas en die dan een plek geven in je stapel.

  • Cai
  • Registratie: December 2001
  • Laatst online: 21-08 11:47

Cai

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for a := 1 to 13 do begin
         case a of
              1 : begin tkaart := 'Aas'; tletter := ' A'; tvalue := 1; end;
              2 : begin tkaart := 'Twee'; tletter := ' 2'; tvalue := 2; end;
              3 : begin tkaart := 'Drie'; tletter := ' 3'; tvalue := 3; end;
              4 : begin tkaart := 'Vier'; tletter := ' 4'; tvalue := 4; end;
              5 : begin tkaart := 'Vijf'; tletter := ' 5'; tvalue := 5; end;
              6 : begin tkaart := 'Zes'; tletter := ' 6'; tvalue := 6; end;
              7 : begin tkaart := 'Zeven'; tletter := ' 7'; tvalue := 7; end;
              8 : begin tkaart := 'Acht'; tletter := ' 8'; tvalue := 8; end;
              9 : begin tkaart := 'Negen'; tletter := ' 9'; tvalue := 9; end;
              10 : begin tkaart := 'Tien'; tletter := '10'; tvalue := 10; end;
              11 : begin tkaart := 'Boer'; tletter := ' J'; tvalue := 10; end;
              12 : begin tkaart := 'Koningin'; tletter := ' Q'; tvalue := 10; end;
              13 : begin tkaart := 'Koning'; tletter := ' K'; tvalue := 10; end;
         end;
        


Dit ies niet zo netjes, geef je kaart de "unieke" waarde bij Tletter, gebruik bij je afdruk functie iets van een case: (syntaxis kan fout zijn)


Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int kaart[1..4][1..13] // De eerste geeft de kleur aan de tweede het nummer

begin
int t1,t2;
t1=random();
t2=random();

afdrukken(t1,t2);
end

function afdrukken(int kleur,nummer)
Begin
case kleur of
0:write ("Harten");
1:write ("Ruiten");
2:write ('Schoppen");
3:write ("Klaver");
end case;
case nummer of
0:write("1");
10:write("Boer"); //etc etc etc
End;


beter nog is het gebruik van enumerated constanten zoals jvdmeer aangaf, maar daar weet ik de syntaxis helemaal niet van en zou ik je alleen maar in de war brengen met verkeerd advies

[ Voor 16% gewijzigd door Cai op 16-09-2003 08:41 ]


Verwijderd

Laten we eerst eens rustig gaan nadenken over hoe je de kaarten het best kunt definieren, rangschikken en opslaan.

Aangezien we de kaarten in 4 types/kleuren met 13 waarden kunnen onderscheiden kunnen we dit het beste eerst definieren:
Delphi:
1
2
3
type
  TKaartSoort=(ksHarten, ksRuiten, ksSchoppen, ksKlaveren);
  TKaartWaarde=(kwTwee, kwDrie, kwVier, kwVijf, kwZes, kwZeven, kwAcht, kwNegen, kwTien, kwBoer, kwVrouw, kwHeer, kwAas);

Alhoewel we nu een standaard definitie hebben van de kaarten hebben we nog geen waarden kunnen toekennen, ik heb geen delphi bij de hand dus zal dit uit het blote hoofdje moeten doen, bovendien is het een tijd geleden dat ik heb ge-21-ed dus moest ik diep graven naar de waardes; enfin, als de bedoeling maar duidelijk is.
Delphi:
1
2
const
  TKaartWaarden : Array[TKaartWaarde] of Byte = (2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11);

Aangezien een kaart uit een waarde en een type/kleur bestaat willen we die gemeenschappelijk opslaan:
Delphi:
1
2
3
4
5
type
  TKaart = Record
    KaartWaarde: TKaartWaarde;
    KaartType: TKaartType;
  end;

Nu we alle definities voor de kaarten hebben kunnen we verder met het reserveren van de plaatsen voor de kaarten.
code:
1
2
3
4
5
type
  TKaarten = Array[1..52] of TKaart;

var
  KaartSpel: TKaarten;

Nu nog even de kaarten schudden en dan ben je al een behoorlijk stuk op weg.
code:
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
procedure Schudden;
var
  Gesorteerd: TKaarten;
  Geplaatst[1..52] of Boolean;
  I, J, K: Integer;
begin
  K:=1;
  for I:=Ord(Low(TKaartWaarde)) to Ord(High(TKaartWaarde)) do    
    for J:=Ord(Low(TKaartType)) to Ord(High(TKaartType)) do
      with Gesorteerd[K] do
      begin
        KaartWaarde := TKaartWaarde(I);
        KaartType := TKaartType(J);
        inc(K);
      end;
  // Nu geschud in variable KaartSpel plaatsen
  // Eerst gaan we de array geplaatstlse vullen zodat we weten welke kaarten wel of niet geplaatst zijn.
  for I:=1 to 52 do
    GeplaatstFalse;
  // En nu schudden maar
  Randomize;
  for I:=1 to 52 do          
  begin
    J:=Random(52)+1;
    if not Geplaatst[J] then
    begin
      KaartSpel[J].KaartWaarde := Gesorteerd[I].KaartWaarde;
      KaartSpel[J].KaartType := Gesorteerd[I].KaartType;      
    end;
end;

Het zou best kunnen dat er wat foutjes in geslopen zijn maar ik denk dat je de essentie wel snapt, en daar gaat het om, toch!?

  • Cai
  • Registratie: December 2001
  • Laatst online: 21-08 11:47

Cai

Aangezien een kaart uit een waarde en een type/kleur bestaat willen we die gemeenschappelijk opslaan:
Delphi:
nope dat wil je niet, als je het kaartsoort weet, weet je de waarde ook. Dus je slaat niet beide waarde op

Verwijderd

Cai schreef op 17 September 2003 @ 08:45:
[...]


nope dat wil je niet, als je het kaartsoort weet, weet je de waarde ook. Dus je slaat niet beide waarde op
Dacht het dus lekker wel, want later loop je tegen je display aan en hoe wou je dat weer gaan versieren? De harten-vrouw is evenveel waard als de schoppen-vrouw bijvoorbeeld, toch wil je i.v.m. met het weergeven op het scherm onderscheid tussen de twee en niet alleen een vrouw tonen!

  • Cerntje
  • Registratie: September 2003
  • Laatst online: 18-08 18:11
Heren,

dankjewel voor jullie hulp. We zijn nu al een heel stuk opgeschoten met het programma. Wanneer het programma volledig afgerond is zal ik jullie ervan op de hoogte brengen.

Maar het ziet er nu een stuk rooskleuriger uit :+
Pagina: 1