Algoritme til udskrivning af kort spil

Tags:    c++

<< < 12 > >>
Hejsa

Jeg har lavet følgende kode som skal simulerer et kort spil.
Det skal simulerer at man vender et kort fra bunken, udskriver koordinaterne til dette kort og ændrer værdien til 1, sådan at den ikke udskriver de samme koordinater igen.
Pt. er det ikke vigtigt hvad den udskriver, men mere at den udskriver alle "kortene" i tilfældig rækkefølge.

Mit problem er dog at den (selvfølgelig) bliver langsommere og langsommere til at finde tallene. Kan jeg ændre koden på en måde så det ikke går langsommere, samtidig med at jeg beholder tilfældigheden intakt?

Fold kodeboks ind/udC++ kode 




12 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 27 karma
Sorter efter stemmer Sorter efter dato
Hej Stefan.

Prøv at smide din srand() op i starten af koden. Det er nemlig en lidt heavy funktion, og da den bliver brugt til at lave et seed til rand(), behøver den kun at blive kaldt én gang.

Jeg ville gøre sådan:
Fold kodeboks ind/udC++ kode 


Det burde få hastigheden lidt op :)



Hmm...srand() er ikke en tung funktion overhovedet, den sætter værdien af en variabel og ca. ikke mere end det.

Problemet med din kode er, at du sætter seed til det samme hele tiden i ét sekund. Sekundet efter sætter du den til en ny værdi, og det gør du så igen i et sekund.

Derfor vil de to kald til rand() returnere de samme to værdier uafbrudt i et sekunds intervaller.

Løsningen er ganske rigtigt kun at kalde srand() én gang, men ikke fordi, den er tung, men fordi du ellers vil få de samme to værdier fra rand() hver gang.


En anden, nok lidt mere optimal, metode ville være, at blande et array af kort strukturer/objekter, og så bare skrive dem ud fra en ende af.



Indlæg senest redigeret d. 14.02.2012 22:54 af Bruger #2695
Hvis du laver et array med alle 52 kort og blander dem, kan du trække kortene fra en ende af, og behøver ikke satse på at ramme et kort der tilfældigvis ikke er trukket før. Når du skal trække det sidste kort er der 1/52 chancer for at du rammer det rigtige.
I praksis betyder det måske ikke det store...



Hej Stefan.

Prøv at smide din srand() op i starten af koden. Det er nemlig en lidt heavy funktion, og da den bliver brugt til at lave et seed til rand(), behøver den kun at blive kaldt én gang.

Det burde få hastigheden lidt op :)


Tusind tak! Det hjalp virkelig! Fra at tage omkring 3 minutter og 30 sekunder tager det under 1 sekund nu! xD




En anden, nok lidt mere optimal, metode ville være, at blande et array af kort strukturer/objekter, og så bare skrive dem ud fra en ende af.


Altså fylde et array ud med tallene fra 1 til 52 og så blande dem? Hvorfor skulle det være mere optimalt?

Synes nu at det virker mere logisk sådan her hvor at der er 4 koordinater til de fire typer af kort og og så 13 koordinater til hvert af værdierne.



Jeg ville svare, men Bertel sagde det.
Desuden er det jo også dét, som bedst simulerer virkeligheden. Man blander en bunke kort og trækker fra bunken et kort ad gangen.



Indlæg senest redigeret d. 15.02.2012 14:04 af Bruger #2695
Hvis du laver et array med alle 52 kort og blander dem, kan du trække kortene fra en ende af, og behøver ikke satse på at ramme et kort der tilfældigvis ikke er trukket før. Når du skal trække det sidste kort er der 1/52 chancer for at du rammer det rigtige.
I praksis betyder det måske ikke det store...


Tror nu ikke det betyder det store, men vil alligevel lære at lave det på denne måde.
Bare lave et array med tal fra 1 til 52, eller lave en matrice med 4 rækker og 13 kolonner som her?
Og hvilken algoritme kan jeg bruge til at blande tallene så?



Tja...hvordan du repræsenterer koretene er jo lidt op til dig selv. Jeg selv ville bruge structs ala denne:
Fold kodeboks ind/udKode 


Jeg ville så have et array med alle kort og et array med pointere til disse structs, og så ville jeg bare blande arrayet med pointere. Normalt ville jeg aldrig blande/sortere objekter, for de kan være store, så jeg blander/sorterer altid pointere til objekterne...pointere fylder 4 eller 8 bytes afhængig af om det er en 32 bit eller 64 bit maskine.

Det ville jeg gøre ved at rende igennem alle pointerne og ombytte den med en anden pointer et tilfældigt sted i arrayet. Noget i stil med:
Fold kodeboks ind/udKode 


Så går man ikke fejl i byen.




Jeg ville så have et array med alle kort og et array med pointere til disse structs, og så ville jeg bare blande arrayet med pointere. Normalt ville jeg aldrig blande/sortere objekter, for de kan være store, så jeg blander/sorterer altid pointere til objekterne...pointere fylder 4 eller 8 bytes afhængig af om det er en 32 bit eller 64 bit maskine.


Fylder en pointer så meget?
F.eks. et helt almindeligt heltal, int eller hvad det kaldes, fylder 4 byte, burde en pointer til dette heltal så ikke fylde mindre?



Man kan slet ikke sige så sikkert hvor meget en pointer fylder.



<< < 12 > >>
t