Avatar billede tjacob Juniormester
13. marts 2002 - 15:39 Der er 2 kommentarer og
1 løsning

Rnd og Randomize

Jeg er ved at forsøge at kopiere Freecell (Napoleon) kabalen der følger med Windows. Det gøres ved brug af Cards.dll og

tilhørende API-kald. Ingen problemer med gameplay m.m.

Mit problem er, at jeg gerne vil lave de samme spil, som i originalen. (-i win98 er der 32.000, og i XP er der 1.000.000).

Det gøres ved at generere 52 psudorandom tal, Hvor seed-værdien (bruges med Randomize) er spillets nummer.

Men jeg kan IKKE få de samme talkombinationer! Det kan muligvis skyldes at Rnd og Randomize kompileres anderledes end Rand()

og sRand(), som er de tilsvarende C++ funktioner,der anvendes i originalen.

Talgeneratoren er offentlig. -Jeg poster den i en kommentar efter dette spm.

Jeg har oversat koden således, men det virker som sagt ikke:

Function GivKort(ByVal GameNr As Integer) As Long
    Dim Bunke1(51) As Integer, i As Long, Rest As Integer
    Dim Bunke2(51) As Integer

    For i = 0 To 51
        Bunke2(i) = i
    Next i

    Rnd (-1)
    Randomize GameNr
    Rest = 52
    For i = 0 To 51
        j = (Int(32768 * Rnd)) Mod Rest
        Bunke1(i) = Bunke2(j)
        Rest = Rest - 1
        Bunke2(j) = Bunke2(Rest)
    Next i

End Function

Jeg sætter de 52 kort ind i Bunke1() i stedet for et array, som i originalen, men det er jo kun en kosmetisk forskel.

Med seedværdi (GameNr) 1, skal denne talrække genereres (i denne rækkefølge):
41, 5, 34, 40, 17, 26, 24, 18, 49, 48, 35, 19, 1, 44, 50, 10, 7, 51, 33, 45,
43, 3, 2, 8, 12, 16, 39, 46, 14, 0, 13, 27, 11, 37, 15, 38, 30, 4, 42, 25, 21,
31, 29, 47, 20, 9, 28, 36, 23, 32, 6, 22

-Håber der er en der har en ide.
Avatar billede tjacob Juniormester
13. marts 2002 - 15:39 #1
Her er den oprindelige C++ kode:

From: jimh@exmsft.com (Jim Horne)

I'm happy to share the card shuffle algorithm, but I warn you,
it does depend on the rand() and srand() function built into MS
compilers.  The good news is that I believe these work the same
for all our compilers.

I use cards.dll which has it's own mapping of numbers (0-51) to
cards.  The following will give you the idea.  Play around with
this and you'll be able to generate all the games.

Go ahead and post the code.  People might as well have fun with it.
Please keep me posted on anything interesting that comes of it. 
Thanks.

_______________________________________________________________


#define    BLACK          0              // COLOUR(card)
#define    RED            1

#define    ACE            0              // VALUE(card)
#define    DEUCE          1

#define    CLUB            0              // SUIT(card)
#define    DIAMOND        1
#define    HEART          2
#define    SPADE          3

#define    SUIT(card)      ((card) % 4)
#define    VALUE(card)    ((card) / 4)
#define    COLOUR(card)    (SUIT(card) == DIAMOND || SUIT(card) ==
HEART)

#define    MAXPOS        21
#define    MAXCOL          9    // includes top row as column 0
CARD    card[MAXCOL][MAXPOS];    // current layout of cards, CARDs are
ints

    int  i, j;                // generic counters
    int  col, pos;
    int  wLeft = 52;          // cards left to be chosen in shuffle
    CARD deck[52];            // deck of 52 unique cards

    for (col = 0; col < MAXCOL; col++)          // clear the deck
        for (pos = 0; pos < MAXPOS; pos++)
            card[col][pos] = EMPTY;

    /* shuffle cards */

    for (i = 0; i < 52; i++)      // put unique card in each deck loc.
        deck[i] = i;

    srand(gamenumber);            // gamenumber is seed for rand()
    for (i = 0; i < 52; i++)
    {
        j = rand() % wLeft;
        card[(i%8)+1][i/8] = deck[j];
        deck[j] = deck[--wLeft];
    }
Avatar billede tjacob Juniormester
13. marts 2002 - 19:53 #2
Er spørgsmålet uforståeligt?
Svar et eller andet!!!
Der MÅ være nogen der både kender VB og C++.
Avatar billede tjacob Juniormester
15. marts 2002 - 10:39 #3
Guess not!

-Lukker spørgsmålet.

/tjacob
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