[C]Baralhador de cartas

Ruanes

Power Member
OI, fiz um codigo que (supostamente)baralha cartas. O problema é que o programa tá sempre a dizer "A baralhar cartas..." Mas depois nunca mais acaba.

Aqui está o codigo
Código:
[SIZE=2]
[LEFT][/SIZE][B][SIZE=2][COLOR=#7f0055]while[/B][/COLOR][/SIZE][SIZE=2](1)
{
[/SIZE][B][SIZE=2][COLOR=#7f0055]if[/B][/COLOR][/SIZE][SIZE=2](n_cartas==0) [/SIZE][B][SIZE=2][COLOR=#7f0055]break[/B][/COLOR][/SIZE][SIZE=2];[/SIZE]
[SIZE=2]Inic_Random();
v1=[/SIZE][B][SIZE=2][COLOR=#642880]rand[/B][/COLOR][/SIZE][SIZE=2]()%4;
v2=[/SIZE][B][SIZE=2][COLOR=#642880]rand[/B][/COLOR][/SIZE][SIZE=2]()%10;
[/SIZE][B][SIZE=2][COLOR=#7f0055]if[/B][/COLOR][/SIZE][SIZE=2](cartas_o[v2][v1]==50) [/SIZE][B][SIZE=2][COLOR=#7f0055]continue[/B][/COLOR][/SIZE][SIZE=2];
[/SIZE][B][SIZE=2][COLOR=#7f0055]else[/LEFT]
[/B][/COLOR][/SIZE][SIZE=2][LEFT]{
cartas_d[i]=cartas_o[v2][v1];[/SIZE][SIZE=2][COLOR=#3f7f5f]//Coloca a carta no baralho das cartas baralhadas[/LEFT]
[/COLOR][/SIZE][SIZE=2][LEFT]cartas_o[v2][v1]=50;
n_cartas--;
}
i++;[/LEFT]
}
[/SIZE]
Só aqui uma explicações:
- n_cartas é um inteiro que diz quando é que já não sobram cartas para baralhar.
- Inic_Random() é uma função com o seguinte corpo:
Código:
[B][SIZE=2][COLOR=#7f0055]
[LEFT]void[/B][/COLOR][/SIZE][SIZE=2][COLOR=#000000] [B]Inic_Random[/B]()[/COLOR][/SIZE][SIZE=2][COLOR=#3f7f5f]//Inicia o baralhador de cartas[/LEFT]
[/COLOR][/SIZE][SIZE=2][LEFT]{
[/SIZE][B][SIZE=2][COLOR=#7f0055]long[/B][/COLOR][/SIZE][SIZE=2] ultime;
[/SIZE][B][SIZE=2][COLOR=#642880]time[/B][/COLOR][/SIZE][SIZE=2](&ultime);
[/SIZE][B][SIZE=2][COLOR=#642880]srand[/B][/COLOR][/SIZE][SIZE=2](([/SIZE][B][SIZE=2][COLOR=#7f0055]unsigned[/B][/COLOR][/SIZE][SIZE=2]) ultime);[/LEFT]
}
[/SIZE]
- cartas_o é um vector em que as cartas estão substituidas por numeros e está organizado por naipes (ou seja 40 cartas -> 10 cartas pelos 4 naipes).
- 50 é o valor que atribui para dizer que a carta "já foi baralhada"
- cartas_d é um vector com todas as 40 cartas
 
Troca o while(1) por while(n_cartas > 0) e tira o if(n_cartas==0) break;. A forma como isso está feito agora é redundante.

Inicializas n_cartas=52 antes do while? É que senão, o que se passa é que n_cartas = -1, -2, -3, ..., -oo, daí o programa nunca parar (nunca chega a ser 0)

edit - dá também uma vista de olhos a este tópico: http://www.techzonept.com/showthread.php?t=313819 ;)
 
Última edição:
Isso é o mais irrelevante neste momento... o que interessa é se inicializas ou não.

Se inicializares, então convém mesmo mostrares mais do código.
 
Código:
[B][SIZE=2][COLOR=#7f0055]
int[/B][/COLOR][/SIZE][SIZE=2][COLOR=#000000] n_cartas=40;[/COLOR][/SIZE][SIZE=2][COLOR=#3f7f5f]//Numero de cartas[/COLOR][/SIZE]
[SIZE=2][COLOR=#3f7f5f][B][SIZE=2][COLOR=#7f0055]int[/B][/COLOR][/SIZE][SIZE=2][COLOR=#000000] v1,v2;[/COLOR][/SIZE]
[SIZE=2][B][SIZE=2][COLOR=#7f0055]int[/B][/COLOR][/SIZE][SIZE=2][COLOR=#000000] i=0;[/COLOR][/SIZE]
[SIZE=2][B][SIZE=2][COLOR=#7f0055]int[/B][/COLOR][/SIZE][SIZE=2][COLOR=#000000] cartas_o[10][4];[/COLOR][/SIZE]
[SIZE=2][B][SIZE=2][COLOR=#7f0055]int[/B][/COLOR][/SIZE][SIZE=2][COLOR=#000000] cartas_d[40];[/COLOR]
[/SIZE][/SIZE][/SIZE][/SIZE][/COLOR][/SIZE]
e depois:
Código:
[SIZE=2]
[LEFT][/SIZE][B][SIZE=2][COLOR=#642880]printf[/B][/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#2a00ff]"A baralhar as cartas..."[/COLOR][/SIZE][SIZE=2]);
[/SIZE][B][SIZE=2][COLOR=#7f0055]while[/B][/COLOR][/SIZE][SIZE=2](n_cartas==0)
{
Inic_Random();
v1=[/SIZE][B][SIZE=2][COLOR=#642880]rand[/B][/COLOR][/SIZE][SIZE=2]()%4;
v2=[/SIZE][B][SIZE=2][COLOR=#642880]rand[/B][/COLOR][/SIZE][SIZE=2]()%10;
[/SIZE][B][SIZE=2][COLOR=#7f0055]if[/B][/COLOR][/SIZE][SIZE=2](cartas_o[v2][v1]==50) [/SIZE][B][SIZE=2][COLOR=#7f0055]continue[/B][/COLOR][/SIZE][SIZE=2];
[/SIZE][B][SIZE=2][COLOR=#7f0055]else[/LEFT]
[/B][/COLOR][/SIZE][SIZE=2][LEFT]{
cartas_d[i]=cartas_o[v2][v1];[/SIZE][SIZE=2][COLOR=#3f7f5f]//Coloca a carta no baralho das cartas baralhadas[/LEFT]
[/COLOR][/SIZE][SIZE=2][LEFT]cartas_o[v2][v1]=50;
n_cartas--;
}
i++;
}
[/SIZE][B][SIZE=2][COLOR=#642880]system[/B][/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#2a00ff]"cls"[/COLOR][/SIZE][SIZE=2]);
[/SIZE][B][SIZE=2][COLOR=#642880]printf[/B][/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#2a00ff]"Cartas Baralhadas\n\n"[/COLOR][/SIZE][SIZE=2]);[/LEFT]
[/SIZE][SIZE=2][/SIZE]
 
À primeira vista, não estás a preencher a matriz das cartas por baralhar e o ciclo while é com != e não ==. Mas posso desde já dizer-te que dessa forma vais ter um programa computacionalmente bastante lento que pode ficar quase eternamente a executar.
 
À primeira vista, não estás a preencher a matriz das cartas por baralhar
Eu não mostrei todo o codigo, mas sim preenchi a matriz das cartas por baralhar.

e o ciclo while é com != e não ==.
Foi uma falta de atenção, obrigado.

Mas posso desde já dizer-te que dessa forma vais ter um programa computacionalmente bastante lento que pode ficar quase eternamente a executar.
Sim, eu sei. Até porque eu não tenho a certeza se o programa funciona, mas tive bastante tempo á espera que acabasse de baralhar as cartas.
Se tiveres uma ideia melhor para eu o fazer, ideias são sempre bemvindas.
 
alterei um pouco um programa, visto que apenas distinguia as cartas por naipes no vector e quando as mudava deixavam de se distinguir.

Código:
[SIZE=2]
[/SIZE][B][U][SIZE=2][COLOR=#7f0055]char[/B][/COLOR][/SIZE][SIZE=2] cartas_o[2][10][4]={{[/SIZE][SIZE=2][COLOR=#2a00ff]"21"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"31"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"41"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"51"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"61"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"D1"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"J1"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"K1"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"71"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"A1"[/COLOR][/SIZE][SIZE=2]},{[/SIZE][SIZE=2][COLOR=#2a00ff]"22"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"32"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"42"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"52"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"62"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"D2"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"J2"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"K2"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"72"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"A2"[/COLOR][/SIZE][SIZE=2]},{[/SIZE][SIZE=2][COLOR=#2a00ff]"23"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"33"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"43"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"53"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"63"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"D3"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"J3"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"K3"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"73"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"A3"[/COLOR][/SIZE][SIZE=2]},{[/SIZE][SIZE=2][COLOR=#2a00ff]"24"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"34"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"44"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"54"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"64"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"D4"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"J4"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"K4"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"74"[/COLOR][/SIZE][SIZE=2],[/SIZE][SIZE=2][COLOR=#2a00ff]"A4"[/COLOR][/SIZE][SIZE=2]}};[/SIZE][SIZE=2][COLOR=#3f7f5f]//Vector com as cartas ordenadas; 1=Espadas; 2=Copas; 3=Paus; 4=Ouros;
[/U][/COLOR][/SIZE]
aqui o compilador da-me dois warnings:
-(near initialization for 'cartas_o')
-excess elements in array initializer

Código:
[SIZE=2]
[LEFT][/SIZE][B][SIZE=2][COLOR=#7f0055]while[/B][/COLOR][/SIZE][SIZE=2](n_cartas!=0)
{
Inic_Random();
v1=[/SIZE][B][SIZE=2][COLOR=#642880]rand[/B][/COLOR][/SIZE][SIZE=2]()%4;
v2=[/SIZE][B][SIZE=2][COLOR=#642880]rand[/B][/COLOR][/SIZE][SIZE=2]()%10;
[/SIZE][B][SIZE=2][COLOR=#642880]printf[/B][/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#2a00ff]"Faltam baralhar: %d\n"[/COLOR][/SIZE][SIZE=2],n_cartas);
[/SIZE][B][SIZE=2][COLOR=#642880]system[/B][/COLOR][/SIZE][SIZE=2]([/SIZE][SIZE=2][COLOR=#2a00ff]"cls"[/COLOR][/SIZE][SIZE=2]);
[/SIZE][B][SIZE=2][COLOR=#7f0055]if[/B][/COLOR][/SIZE][SIZE=2]([/SIZE][B][SIZE=2][COLOR=#642880]strcmp[/B][/COLOR][/SIZE][SIZE=2](cartas_o[v2][v1],[/SIZE][SIZE=2][COLOR=#2a00ff]"50"[/COLOR][/SIZE][SIZE=2])==0) [/SIZE][B][SIZE=2][COLOR=#7f0055]continue[/B][/COLOR][/SIZE][SIZE=2];
[/SIZE][B][SIZE=2][COLOR=#7f0055]else[/LEFT]
[/B][/COLOR][/SIZE][SIZE=2][LEFT]{
[/SIZE][B][SIZE=2][COLOR=#642880]strcpy[/B][/COLOR][/SIZE][SIZE=2](cartas_d[i],cartas_o[v2][v1]);[/SIZE][SIZE=2][COLOR=#3f7f5f]//Coloca a carta no baralho das cartas baralhadas[/LEFT]
[/COLOR][/SIZE][SIZE=2][LEFT][/SIZE][B][SIZE=2][COLOR=#642880]strcpy[/B][/COLOR][/SIZE][SIZE=2](cartas_o[v2][v1],[/SIZE][SIZE=2][COLOR=#2a00ff]"50"[/COLOR][/SIZE][SIZE=2]);
n_cartas--;
}
i++;[/LEFT]
}
[/SIZE]
mudei o vector para strings e acrescentei a informação de quantas cartas faltam baralhar para ter um melhor controle do programa.

O problema é que enquanto está a baralhar as cartas, a uma certa altura (quase sempre diferente)o programa dá erro.

não sei bem o problema porque não costumo trabalhar com vectores.
 
Back
Topo