1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

[C]Baralhador de cartas

Discussão em 'Programação' iniciada por Ruanes, 8 de Novembro de 2008. (Respostas: 7; Visualizações: 1313)

  1. Ruanes

    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
     
  2. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    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: 8 de Novembro de 2008
  3. Ruanes

    Ruanes Power Member

    n_cartas=40 porque não jogo com todas as cartas.
     
  4. Kayvlim

    Kayvlim Undefined Moderator
    Staff Member

    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.
     
  5. Ruanes

    Ruanes Power Member

    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]
     
  6. Neptune

    Neptune 1st Folding then Sex

    À 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.
     
  7. Ruanes

    Ruanes Power Member

    Eu não mostrei todo o codigo, mas sim preenchi a matriz das cartas por baralhar.

    Foi uma falta de atenção, obrigado.

    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.
     
  8. Ruanes

    Ruanes Power Member

    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.
     

Partilhar esta Página