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

ajuda num jogo em C

Discussão em 'Programação' iniciada por zzziizzz, 14 de Agosto de 2008. (Respostas: 3; Visualizações: 612)

  1. eh um jogo de carta maior,bem basico em C que fiz,ele esta com um erro,que nao consegui achar,que as vezes quando eu tiro uma carta menor que o computador e eu venço(ou vice versa) o jogo ainda nao esta totalmente completo,precisa de mais algumas coisas
    segue o codigo:




    Código:
    #include <stdio.h>
    #include <time.h>
    
        int carta;
        int di;
        int ap;
        int v;
        int cr;
        di = 100
        srand(time(NULL))
        carta = rand() % 13;
        cr = rand() % 13;
       
    int s()
    {
        if (ap==1)
        {
                  printf("quanto deseja apostar?");
                  scanf("%i",&v);
                  if (v>di)
                  {
                           printf("voce nao tem tanto dinheiro!");
                           s();
                  }
                  else
                  {
                       ver();
                  }
        }
        if (ap==2)
        {
                   main();
        }
    }
       
    int ver()
    {
        getchar();
        printf("a carta do seu oponente eh:");
        switch (cr)
        {
                     case 1 : printf("----\n-  -\n- 1 -\n-  -\n----\n");break;
                     case 2 : printf("----\n-  -\n- 2 -\n-  -\n----\n");break;
                     case 3 : printf("----\n-  -\n- 3 -\n-  -\n----\n");break;
                     case 4 : printf("----\n-  -\n- 4 -\n-  -\n----\n");break;
                     case 5 : printf("----\n-  -\n- 5 -\n-  -\n----\n");break;
                     case 6 : printf("----\n-  -\n- 6 -\n-  -\n----\n");break;
                     case 7 : printf("----\n-  -\n- 7 -\n-  -\n----\n");break;
                     case 8 : printf("----\n-  -\n- 8 -\n-  -\n----\n");break;
                     case 9 : printf("----\n-  -\n- 9 -\n-  -\n----\n");break;
                     case 10 : printf("----\n-  -\n- 10 -\n-  -\n----\n");break;
                     case 11 : printf("----\n-  -\n- J -\n-  -\n----\n");break;
                     case 12 : printf("----\n-  -\n- Q -\n-  -\n----\n");break;
                     case 13 : printf("----\n-  -\n- K -\n-  -\n----\n");break;
        }
              
        if(carta>cr)
        {
                    printf("você ganhou!");
                    di = di+(v*2);
        }
        if(carta<cr)
        {
                    printf("você perdeu");
                    di = di-(v*2);
        }
    } 
    
    int main()
    {
        int ok;
        do               /*AQUIIII*/    
        {         
        printf("voce tem :%i de dinheiro",din);          
        printf("a carta dessa vez e:")
        getchar();
        switch(carta)
        {
                     case 1 : printf("----\n-  -\n- 1 -\n-  -\n----\n");break;
                     case 2 : printf("----\n-  -\n- 2 -\n-  -\n----\n");break;
                     case 3 : printf("----\n-  -\n- 3 -\n-  -\n----\n");break;
                     case 4 : printf("----\n-  -\n- 4 -\n-  -\n----\n");break;
                     case 5 : printf("----\n-  -\n- 5 -\n-  -\n----\n");break;
                     case 6 : printf("----\n-  -\n- 6 -\n-  -\n----\n");break;
                     case 7 : printf("----\n-  -\n- 7 -\n-  -\n----\n");break;
                     case 8 : printf("----\n-  -\n- 8 -\n-  -\n----\n");break;
                     case 9 : printf("----\n-  -\n- 9 -\n-  -\n----\n");break;
                     case 10 : printf("----\n-  -\n- 10 -\n-  -\n----\n");break;
                     case 11 : printf("----\n-  -\n- J -\n-  -\n----\n");break;
                     case 12 : printf("----\n-  -\n- Q -\n-  -\n----\n");break;
                     case 13 : printf("----\n-  -\n- K -\n-  -\n----\n");break;
        }
        printf("apostar? 1=sim  2=nao");
        scanf("%i",&ap);
        s();
        }while(ok==0);
    }
     
    Última edição pelo moderador: 15 de Agosto de 2008
  2. Aparicio

    Aparicio /dev/mod
    Staff Member

    Isso esta muito confuso, não devias declarar essas variáveis todas fora das funções, as funções s e ver são do tipo int mas não retornam nada, na função s deve dar para fazer aquilo sem voltar a chamar a mesma função (recursão), e não se deve chamar a função main entre outros pormenores.
     
  3. MPalhas

    MPalhas Power Member

    não precisas de chamar as funções main() e s() constantemente. quando uma função acaba, o programa volta ao sitio onde ela foi chamada. assim só estás a acumular funções repetidas na memória

    tens também a função ver() que nunca é chamada, pelo menos não encontrei em lado nenhum.

    estás a atribuir um valor aleatório a cada carta logo no inicio, mas depois nunca mais o actualizas. resultado: se for repetir a jogada sem reiniciar o programa, vai ter as mesmas cartas


    próximo:

    Código:
    if(carta>cr)
        {
                    printf("você ganhou!");
                    di = di+(v*2);
        }
        if(carta<cr)
        {
                    printf("você perdeu");
                    di = di-(v*2);
        }
    
    então e se as cartas forem iguais? não verificas isso


    por fim, tu calculas cada carta fazendo um rand() % 13. não sei se isso está certo ou não porque não sei como funciona o rand(), mas de qualquer maneira acho que é sempre possivel que isso dê 0, coisa que não é verificada nos case's.
     
  4. Consu

    Consu Power Member

    Estive a tentar perceber o código e reparei em alguns detalhes:
    1. A tua função s() invoca-se a si própria e chama a função main(). Se alguém jogar durante bastante tempo ou propositadamente for inserindo uma quantia a apostar superior ao valor disponível, resulta em erro de stack. A recursividade tem limites...
    2. O código compila? Julgo que na linha 9 e na linha 10 faltam ;'s.
    3. A variável ok não tem valor inicial, não é alterada em lado nenhum, no entanto surge como condição no while?
    4. O ciclo serve para quê? O valor da carta apenas é calculado uma vez.
    5. Quando usas a operação % 13 obténs um valor entre 0 e 12, suponho que não seja isso que pretendes.
    6. Em caso de empate o dinheiro da aposta é perdido?
    7. Se percebi bem, um jogador pode apostar quantias negativas, ou seja, se perder e ainda ganha dinheiro. Pode inclusive apostar "nada".
    8. Quando um jogador fica sem dinheiro não devia terminar o jogo?

    De seguida deixo-te algumas sugestões:

    1. Não usar variáveis globais a não ser que seja estritamente necessário. Geralmente é uma enorme fonte de bugs;
    2. Se fazes copy & paste de código é sinal que esse código devia estar isolado numa função.
    3. A inicialização deve ser feita na função main() e não num lugar qualquer.
    4. Antes de escreveres código pensa nos passos básicos que tens de efectuar. Geralmente esses passos-chave correspondem a funções.
    Sei que não falei muito sobre o erro, mas creio ser mais importante referir estes pontos para poderes reflectir sobre eles e melhorares o teu código. Analisando cada um deles de certeza que o bug desparece. ;)
     

Partilhar esta Página