kortspil uden tilbagelægning

Tags:    c++

Hej!
Jeg begyndte at kede mig forleden og startede på en idé jeg har tænkt på et stykke tid nu - og nu sidder jeg så fast...

Meningen er at programmet skal trække et tilfældigt spillekort (ud af 52), kalde en funktion, og så ellers starte forfra til alle 52 har været igennem.
Problemet er bare, at hvis dette skal fungere, må der ikke være tilbagelægning (det samme kort må ikke trækkes 2 gange), så jeg skal kunne gemme alle de tilfældige tal, som mit program tildeler int kortNummer og hver gang der trækkes et nyt kort, skal kortets nummer (det tilfældige tal) sammenlignes med alle de andre, allerede brugte, tal. Hvis tallet er brugt før, skal der genereres et nyt tal (som selvf. også tjekkes...)
Dette gav sikkert ingen mening, så jeg vedlægger også lidt uoverskuelig kode :)

Fold kodeboks ind/udKode 


Jeg tænkte på at implementere en array til tildele tal fra 1-52 og så bruge en random_shuffle, men for det første har jeg ingen anelse om hvordan jeg senere skulle tjekke for allerede brugte tal, og for det andet kunne de eksempler jeg fandt på google kun shuffle en gang og rækkefølgen vil således blive den samme hver gang.
Nogen forslag til hvad jeg kan gøre?

[Redigeret d. 13/08-05 23:52:30 af Mikkel Kjeldsen]



10 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 1 karma
Sorter efter stemmer Sorter efter dato
er ikke så kendt indenfor dette sprog men kunne du ikke lave en anden funktion med et array hvor de brugte kort bliver tilføjet og så hver gang du trækker et kort tjekker du først om det er blevet brugt og er det ikke det bliver kortet sendt videre ellers køres kort fuinktionen igen?



Er ikke helt sikker på hvad du vil, men kunne du ikke bare have 2 std::list (eller anden container), en kaldet IkkeTrukket, den anden kaldet Trukket, start med at fylde IkkeTrukket med alle 52 kort og lad IkkeTrukket forblive tom, hver gang du skal have et nyt kort kan du bare vælge et tilfældigt kort i IkkeTrukket, fjerne det fra IkkeTrukket, tilføje det til Trukket og returnere kortet.


[Redigeret d. 13/08-05 22:43:11 af Ebnuv]



Det burde være muligt at shuffle flere gange:

Fold kodeboks ind/udKode 


[Redigeret d. 13/08-05 22:53:34 af Bertel Brander]



ja - der kan sagtens shuffles flere gange, men det er ikke problemet. Jeg vil gerne have programmet til at shuffle tilfældigt hver gang programmet startes (forfra.)
Koden du (Bertal Brander) kom med, viser samme output hver gang, så programmet kan i teorien kun køres 2 gange, før det gentager sig selv - kan man ikke lave en random_shuffle der faktisk er tilfældig hver gang?

Ang. containere, så har jeg ikke hørt om dem, andet end at åbne tutorial'en her på siden, for så at lukke igen, da jeg konkluderede at den var for lang :p

[Redigeret d. 13/08-05 23:23:52 af Mikkel Kjeldsen]



Man kan godt lave det så den kommer med nye tilfældige tal hver gang:

Fold kodeboks ind/udKode 


Der kommer en udgave med array's om et øjeblik.



Med array:
Fold kodeboks ind/udKode 


[Redigeret d. 13/08-05 23:39:29 af Bertel Brander]



Præcist! Begge virker endda med kun et shuffle (mindre kode :))
Jeg kigger lidt mere på det imorgen og prøver at implementere en af dem i min kode, nok den jeg forstår bedst =)
Foreløbigt tak for hjælpen...

An eye for an eye only ends up making the whole world blind!

[EDIT]
Fold kodeboks ind/udKode 


hvorfor lige %13?

[EDIT 2]
Der er selvfølgelig 13 tal på hver linje - klart ;)

[EDIT 3]
Hvis du lægger et svar, så får du point Bertel :)

[Redigeret d. 14/08-05 15:31:37 af Mikkel Kjeldsen]



Det er ikke nogen god ide at rette i et indlæg lang tid efter at det er postet, på den måde er det ikke sikkert at andre bliver opmærksom på dine kommentarer.

Jeg samler ikke på point, så lav selv et svar og accepter det, så får du pointene tilbage & spørgsmålet bliver lukket.



Øhh... Nå!
Jeg er bare vant til at spørgsmål opdateres ved ændringer :)




Jo, de bliver opdateret, men måden jeg finder ud af hvilke tråde jeg skal læse er ved at se på "udvalgte tråde", her bliver spørgsmålet ikke markeret som nyt hvis man retter i et eksisterende spørgsmål.



t