ajuda num jogo em C

zzziizzz

Membro
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:
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.
 
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.
 
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. ;)
 
Back
Topo