A ver que te parece esta solución (sin testar):
Código:
void Baraja::Barajear()
{
char *aux[40];
int i,num;
// las 40 cartas en orden
aux[ 0]="B01";aux[ 1]="B02";aux[ 2]="B03";aux[ 3]="B04";aux[ 4]="B05";
aux[ 5]="B06";aux[ 6]="B07";aux[ 7]="B10";aux[ 8]="B11";aux[ 9]="B12";
aux[10]="C01";aux[11]="C02";aux[12]="C03";aux[13]="C04";aux[14]="C05";
aux[15]="C06";aux[16]="C07";aux[17]="C10";aux[18]="C11";aux[19]="C12";
aux[20]="E01";aux[21]="E02";aux[22]="E03";aux[23]="E04";aux[24]="E05";
aux[25]="E06";aux[26]="E07";aux[27]="E10";aux[28]="E11";aux[29]="E12";
aux[30]="O01";aux[31]="O02";aux[32]="O03";aux[33]="O04";aux[34]="O05";
aux[35]="O06";aux[36]="O07";aux[37]="O10";aux[38]="O11";aux[39]="O12";
// inicalizar la semilla.
// el jugador ya tiene que haber apretado como mínimo una vez un botón
// o siempre saldrá la misma serie
GpSrand(GpTickCountGet());
// se ordena las 40 cartas
for (i=39; i >= 0; i--)
{
// representar la accion de barajear
GpRectFill(NULL, &gpDraw[nflip], 0, 0, 320, 240, 0x00);
GpTextOut(NULL, &gpDraw[nflip], 5, 220, "Barajeando...", 0xff);
GpRectFill(NULL, &gpDraw[nflip], 5, 235, 5*(40-i), 240, 0xff);
// numero aleatorio del 0 al número_de_cartas_que_quedan_por_repartir - 1
num = GpRandN(i);
// coloca la carta que ha salido en la posición que sigue
carta[39-i] = aux[num];
// sacamos la carta de la lista de cartas que quedan por repartir
gm_memcpy(&aux[num], &aux[num + 1], (i - num) * sizeof(aux[0])));
GpSurfaceFlip(&gpDraw[nflip++]);
nflip&=0x01;
}
// numero cartas repartidas
num_monton=0;
}
No sé lo que pasará con GpRand() cuando i == 0. A lo mejor hay que hacer un test aparte.
En cuanto a tu semilla, la idea no es hacer una simple lectura de los botones, sinó que hay que esperar a que el jugador haya apretado un botón.
Lo que suelo hacer es usar GPSrand() cuando el usuario escoge la opción START de mis juegos.
Oankali.
Marcadores