[delphi7] kaarten in array

Pagina: 1
Acties:
  • 62 views sinds 30-01-2008

  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 05-12-2025
edit:
ok, te weinig info, maar geef me dan wel ff de tijd om mijn topic te updaten graag!!!


n00b question, maar ik hoop dat iemand me kan/wil helpen,

ik moet voor een opdracht van school 52 kaarten (dus de 4 kaartsoorten harten, klaver, schoppen, ruiten met bijbehorende waarden (A=1, J=10, Q=10, K=10)) door mekaar in een array hebben, wat dus gebruikt kan worden voor 21-en, ook moet ik even weten hoe ik deze kaarten weer uit het array toe ken aan een image.

hier is laatst ook al een topic over geweest maar hier zijn we niet veel verder mee gekomen. hoop dat dit genoeg info is.. alvast bedankt! _/-\o_

ok niet genoeg info dus: we hebben het volgende geprobeerd:

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
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
type
  TKaartSoort=(ksHarten, ksRuiten, ksSchoppen, ksKlaveren);
  TKaartWaarde=(kwTwee, kwDrie, kwVier, kwVijf, kwZes, kwZeven, kwAcht, kwNegen, kwTien, kwBoer, kwVrouw, kwHeer, kwAas);

const
  TKaartWaarden : Array[TKaartWaarde] of Byte = (2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 11);

type
  TKaart = Record
    KaartWaarde: TKaartWaarde;
    KaartSoort: TKaartSoort;
  end;

type
  TKaarten = Array[1..52] of TKaart;

var
  KaartSpel: TKaarten;
  FGame: TFGame;
  Bet: integer;
  Credit: integer;
  Credit2: integer;
  huidigekaart : integer;
  Kaart : Integer;

......

procedure Schudden;
var
  Gesorteerd: TKaarten;
  I, J, K: Integer;
begin
  K:=1;
  for I:=Ord(Low(TKaartWaarde)) to Ord(High(TKaartWaarde)) do
    for J:=Ord(Low(TKaartSoort)) to Ord(High(TKaartSoort)) do
      with Gesorteerd[K] do
      begin
        KaartWaarde := TKaartWaarde(I);
        KaartSoort := TKaartSoort(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
  // En nu schudden maar
  Randomize;
  for I:=1 to 52 do
  begin
    J:=Random(52)+1;
    begin
      KaartSpel[J].KaartWaarde := Gesorteerd[I].KaartWaarde;
      KaartSpel[J].KaartSoort := Gesorteerd[I].KaartSoort;
    end;
end;
end;


dit werkt niet, in het array komen nu alleen harten 2's voor: dus hij pakt van beide catagorien de 1e waarde en koppelt die 52 keer...

Verwijderd

waarom gebruik je geen random per kaart,
daarna kijken of de random waarde nog niet gebruikt is in je array,
en weer terug naar begin (tot je alle kaarten hebt gehad)

  • scorenborgo
  • Registratie: Oktober 2002
  • Laatst online: 19-06-2025
zekerz een n00b question haha neej geintje niels :)
Kom er net achter dat dit Justin is zit in andere klas :+
We hebben namelijk zelfde opdracht
(oeps :'( )

modbreak:
Dit is de HK niet. Bullshitreplies worden hier niet op prijs gesteld.
(Evenals het weg-editten van modbreaks).

[ Voor 255% gewijzigd door whoami op 22-09-2003 14:12 ]


  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 05-12-2025
ok klinkt logisch... maar hoe doe ik dat? (ben niet echt bekend met arrays)

[nils en ron jullie zijn niet grappig :P]

[ Voor 24% gewijzigd door 0M3G4 op 22-09-2003 14:03 ]


  • Dracula78
  • Registratie: Februari 2002
  • Laatst online: 28-06 22:05
De methode die ik hiervoor gebruikte, was deze:
- Initialiseer het kaartspel met de gesorteerde array
- Herhaal de onderstaande 3 stappen voldoende vaak (100 is meestal goed geschud)
- Kies een willekeurige kaart (1-52)
- Kies een andere willekeurige kaart (1-52)
- Verwissel ze

Dit is in elk geval een 'natuurlijke' manier van kaarten schudden, maar misschien niet random genoeg...

code:
1
2
3
for I:=1 to 52 do
// En nu schudden maar
Randomize;

Ik neem aan dat die eerste for statement daar niet hoorde, anders voer je alleen 52 keer een Randomize statement uit... niet echt nuttig ;)

Hoe kun je verder garanderen dat je met "J:=Random(52)+1;" alle waarden van 1 tot 52 een keer gehad hebt? De kans is groot dat je een keer een dubbele J krijgt, en er dus later 1 mist.
Je zou wel zoiets kunnen doen:
code:
1
2
3
repeat
   J := Random(52) + 1;
until KaartSpel[J].KaartWaarde = 0;

Op die manier zoek je dus naar een willekeurige nog niet geinitialiseerde kaart (moet je ze waarschijnlijk wel eerst allemaal op 0 zetten, of doet Delphi dat zelf)...

3720 Wp @ StecaGrid 3600 Coolcept PVOutput Tech-blog


  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 28-05 11:50

BoomSmurf

Am-Ende!

Ten eerste, hier in mijn Delphi komen er wel degelijk verschillende combinaties uit, niet alleen harten 2.

Ten tweede:

code:
1
2
3
  for I:=1 to 52 do
  // En nu schudden maar
  Randomize;


Dit gaat natuurlijk nergens over, je kan net zo goed gewoon 1 keer Randomize aanroepen.

Ten derde, heb je nu dubbele kaarten in je array zitten, wat natuurlijk niet kan. Als ik een normaal pak kaarten ga schudden krijg ik nooit opeens 3 ruiten koningen natuurlijk. Je zult dus moeten registreren welke kaarten je al gebruikt hebt.

Ten vierde, volgens mij is de Aas zowel 1 als 11, wat het beste uitkomt op dat moment voor de speler. (Weet ik niet zeker trouwens - kan ik zijn dat ik het met een ander spel verwar)

  • 0M3G4
  • Registratie: Januari 2003
  • Laatst online: 05-12-2025
ok kijken of het hiermee lukt, ik ga het proberen, maar hoe wijs ik een willekeurige kaart uit het array aan een image toe

edit:
klopt, maar de waarden van de aas zijn van latere zorg...

[ Voor 24% gewijzigd door 0M3G4 op 22-09-2003 14:16 ]


  • Dracula78
  • Registratie: Februari 2002
  • Laatst online: 28-06 22:05
Ik neem aan dat het gaat om een plaatje van de speelkaart? Dan zou ik geen kaart aan een image toewijzen, maar andersom (bv. door je TKaart record/class uit te breiden met een TImage veld). Moet je zelf maar even puzzelen welke image bij welke kaart hoort...

3720 Wp @ StecaGrid 3600 Coolcept PVOutput Tech-blog


  • BoomSmurf
  • Registratie: Maart 2003
  • Laatst online: 28-05 11:50

BoomSmurf

Am-Ende!

Je zou wel zoiets kunnen doen:
code:
1
2
3
repeat
   J := Random(52) + 1;
until KaartSpel[J].KaartWaarde = 0;
Is ook niet echt efficient :+ Het zou natuurlijk kunnen dat dit 10 jaar loopt en er in die tijd nooit net die ene waarde die je moet hebben uit de random komt rollen. De kans is klein, maar toch (kan me goed voorstellen dat de leraar het fout zou rekenen).

Je zou kaarten die je gehad hebt kunnen verwisselen zodat deze altijd op het einde komen (en de niet gebruikte dus vooraan), en dan de Random met de maximale waarde van de laatste kaart gebruiken, zodat je altijd een ongebruikte kaart trekt.

De methode van Dracula om met een hele stapel randoms (laten we zeggen 10 * 52) simpelweg kaarten in de array om te wisselen lijkt me trouwens een betere manier om te schudden en minder werk.

Over het toekennen aan een image, tja. Hoe wil je dit zien? Als je voor elke kaart een aparte image hebt, zou je ze op kaartsoort - kaartwaarde gesorteerd in een imagelist kunnen zetten (als het kleine images zijn), de index berekenen uit de ordinale waardes, bijvoorbeeld

code:
1
 index := (ord(kaartsoort) * ord(high(kaartsoort)) + ord(kaartwaarde));


Moet je image weergave component natuurlijk wel aan de imagelist hangen.

Als het echte bestanden zijn op je harddisk zou je de bestandsnamen uit de ordinale waardes kunnen halen, zelfde als index maar dan met "IntToStr(index);".

  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Dit gaat teveel de kans uit van "Geef mij de code zodat ik het kan copy-pasten".

In principe is dit dus een script request geworden, voor huiswerk mag je soms zelf wel wel denken voordat je het vraagt.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR

Pagina: 1

Dit topic is gesloten.