Oppure

Loading
03/04/10 18:46
edo1493
Sto elaborando un programma in C sul gioco del BlackJack, ho soltanto un piccolo problema..
Le carte le ho posizionate in un vettore [4][13], per estrarre le carte faccio il random delle linee e delle colonne e stampo la carta..
Il problema è che non so come fare il random delle colonne in modo tale che non mi estragga elementi già usciti..

Il random lo eseguo in questo modo:

row = rand()%4;
column = rand()%13;

deck[row][column];

rand in qualche modo deve capire che 12 già la estratto e non lo deve estrarre finche non viene azzerato tutto.

Potrei creare un array, dove inserire tutti i risultati di column e poi confrontare ogni risultato con l'array, se il risultato è presente rieseguo il random...?
aaa
03/04/10 18:53
GuglielmoS
Postato originariamente da edo1493:

Sto elaborando un programma in C sul gioco del BlackJack, ho soltanto un piccolo problema..
Le carte le ho posizionate in un vettore [4][13], per estrarre le carte faccio il random delle linee e delle colonne e stampo la carta..
Il problema è che non so come fare il random delle colonne in modo tale che non mi estragga elementi già usciti..

Il random lo eseguo in questo modo:

row = rand()%4;
column = rand()%13;

deck[row][column];

rand in qualche modo deve capire che 12 già la estratto e non lo deve estrarre finche non viene azzerato tutto.

Potrei creare un array, dove inserire tutti i risultati di column e poi confrontare ogni risultato con l'array, se il risultato è presente rieseguo il random...?

Potresti semplicemente fare un ciclo che continua a generare una posizione di una carta in modo casuale, finchè non viene trovata una posizione valida all'interno del "deck".
Esempio:
do {
    row = rand()%4;
    column = rand()%13;
} while(deck[row][column] != VALORE_PREFISSATO);
// dove VALORE_PREFISSATO indica se la carta è già stata estratta o meno
// ... poi in deck[row][column] ci inserisci il valore della carta
//     che sarà ad esempio: (row*10) + (column)
aaa
03/04/10 21:00
edo1493
Dovrei trovare qualcosa di migliore, considerando che la soluzione la devo usare sia per il mazziere che per il giocatore, la funzione che gestisce il mazziere usa già un do while, penso che un do while dentro un do while, vada in conflitto...provo con quella di salvare i dati nell'array, ma non sono sicuro..altri suggerimenti?
aaa
04/04/10 1:30
TheKaneB
un vecchio algoritmo, ottimo per il tuo problema è il seguente:

- N = numero di carte

- For i=1 to N
- prendi un indice X random, compreso tra i ed N
- scambia la carta di posto X con la carta di posto i
- Next i


il mazzo così scombinato non ripete mai due volte la stessa carta.
Puoi memorizzare il mazzo scombinato da qualche parte, e leggendolo da 0 fino ad N-1 avrai la tua sequenza di numeri random che non si ripetono mai...
aaa
04/04/10 8:43
edo1493
Per il giocatore ho risolto in questo modo:
do {

row = rand() % 4;

column = rand() % 13;

if(sDeck[row][column] == 1) {

sentinella = 1;

}

else {
sentinella = 0;
}

} while (sentinella == 1);

sDeck[row][column] = 1;

Funziona! Per il mazziere proverò la seconda soluzione..

Avrei un altro piccolo problema, ogni volta che l'utente preme 5 dovrei riazzerare tutti i valori, (c'è uno scanf nel main), ora dovrei trovare un modo per azzerare static int sDeck ogni volta che l'utente preme 5.

if(choice == 5) {
richiamo funzione( senza nulla, che deve andare a modificare un vettore in un altra funzione...??) }
aaa
04/04/10 9:22
edo1493
Ho risolto anche il mazziere!!
do{

row = rand() % 4;

column = rand() % 13;

} while(sDeck[row][column] == 1);

sDeck[row][column] = 1;


Ora mi serve una funzione che venga lanciata nel main, per azzerare i due array delle due funzioni...
aaa