ma questo algoritmo lo dovrai usare per più giocatori? se si allora devi memorizzare anche le carte che hai già dato in precedenza...
adesso io ho immaginato ad esempio che tu faccia un gioco di ramino, gli altri giocatori rischiano di ricevere le carte già date al giocatore precedente.
per evitare ciò è necessario memorizzare le carte già date a livello condiviso per tutte le chiamate a quel metodo (quindi diciamo un campo a livello di classe).
questo è quello che ho utilizzato io per un pokerroom (poker all'italiana scritto in c#) :
codice:
private int[] DaiCarte(ref Tavoli tavolo, int IDgiocatore)
{
int idTavolo = tavolo.ID;
int[] result = new int[5];
int min = (10 - tavolo.Giocatori.Count) * 4;//questo serve per adeguare il numero di carte al numero di giocatori al tavolo per mano(necessario per il poker all'italiana)
for (int i = 0; i < 5; i++)
{
result[i] = Carta(tavolo.Carte.ToList(), min);//chiamo il metodo che da la carta passando le carte già "uscite" è il numero di giocatori present al tavolo (in gioco oppure fuori gioco il numero non cambia in una mano)
Carte ca = new Carte();//creo una nuova carta
ca.Valore = result[i];//attribuisco il valore numerico
ca.ID_Tavolo = tavolo.ID;// ci possono essere più tavoli e quindi ne memorizzo l'id
ca.ID_Giocatore = IDgiocatore;// memorizzo a chi è stata attribuita la carta
ca.Eliminata = false;// questo serve quando viene cambiata la carta per evitare che venga richiamata in gioco
ca.Data = DateTime.Now;// è un po complesso spiegare il perchè ma a me serviva...
tavolo.Carte.Add(ca);//aggiungo la carta alla lista delle carte già uscite
}
return result;
}
private int Carta(List<Carte> CarteInGioco, int min)
{
int random = -1;
bool ok = false;
while (!ok)//imposto un ciclo che determina se la carta è ok (non in uso)
{
Random r = new Random(DateTime.Now.Millisecond);
random = r.Next(0, 52);
Carte c = null;
try
{
c = CarteInGioco.Single(p => p.Valore == random);
}
catch { }
if (c == null&&(random<4|random>=min))//controllo se esiste già la carta nel mazzo (in caso di carta null non esiste) e che sia minore del minimo (esempio se si gioca in 4 la carta minore è il 6) ad esclusione ovviamente delle prime 4 (0-3) che rappresentano gli assi che sono sempre presenti
{
ok = true;//esco dal ciclo
}
}
return random;//restituisco la carta
}
dovevo migliorare il tutto (era una prova anche se devo dire che la velocità è maggiore di quanto mi aspettavo) ma poi mi sono fermato perchè non sono ancora arrivate le autorizzazioni dal monopolio e il cliente è in stand by.