Ir ao conteúdo
  • Cadastre-se

C Simulador de Dado (Linguagem C)


Daniel13

Posts recomendados

@Daniel13    esse seu código não está compilando ,  não sei por que você postou ele e não disse nada do que queria , mas corrigido ele poderia ser assim  :

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
int main()
{
  srand(time(NULL));      // só precisa huma vez no código Todo
  int dado;
  char x[2];
  while(1)
  {
    //__fpurge(stdin);  // esse não consta da linguagem c
    fflush(stdin);      // esse sim , mas em muitos casops não resolve
    printf("Huma Palavra ");
    gets(x);
    printf("voce digitou %s\n",x);
    dado = rand() % 6 + 1;
    printf("\nDado: %d", dado);
    if(x[0] != '0')     //  caractere entre aspas simples
      return 16384;
  }
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Eu acho que uma aproximação assim seria melhor.

Spoiler

/* 
 * Dado
 */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define Q_FACES 6

void
iniciaFacesDado(unsigned char *f);

void
jogaDado(unsigned char *f);

int main(int argumento, char *parametros[])
{
  unsigned char faces[Q_FACES], entrada;
  iniciaFacesDado(faces);

  do {
    printf("\nDigite um numero para adivinhar o numero que vai cair no dado.");
    printf("\nDigite 0 para sair\n:>\t");
    scanf("%hhu%*c", &entrada);

    jogaDado(faces);

    if (entrada) {
      if (entrada > 0 && entrada <= Q_FACES) {
        if (entrada == faces[0]) {
          printf("\nVocẽ acentou!");
        } else {
          printf("\nVocê errou!");
          printf("\nO numero era:%hhu", faces[0]);
        }
      } else {
        printf("\nO dado só tem 6 faces!");
        printf("\nTente novamente.");
      }
    } else {
      printf("\nTchau!");
    }
    printf("\nPressione enter para continuar..");
    getchar();
  } while (entrada);
  return(0);
}

void
iniciaFacesDado(unsigned char *f)
{
  unsigned char contador;
  for (contador = 0; contador < Q_FACES; contador++) {
    f[contador] = contador+1;
  }
}

void
jogaDado(unsigned char *f)
{
  unsigned char indice, contador;
  srand(clock());   /* Muda a semente a cada jogada */
  for (contador = 0; contador < Q_FACES; contador++) {
    unsigned char temp;
    /* Troca a posição das faces */
    indice = rand()%Q_FACES;
    temp = f[indice];
    f[indice] = f[contador];
    f[contador] = temp;
  }
}

 

porque dessa maneira que você fez, você acaba repetindo varias vezes o mesmo numero.

É isso também resolve o seu problema com o seu jogo da jogo da velha, quando você procura um espaço vago no tabuleiro do jogo, o jogo praticamente entra em um loop infinito.    

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

 

 

 

5 horas atrás, Daniel13 disse:

Compila e funciona sim, foi programado no linux. Todas as funções estão corretas. Só postei pra quem quiser usar, ou ver um exemplo de como fazer

 

Daniel, 

 

Não postou nenhuma dúvida e não fez qualquer pergunta então imagino que tenha postado seu programa apenas como exemplo num forum público como é aqui

 

Supondo que seja apenas um exemplo vou dizer algumas coisas sobre seu programa

 

image.png.069eb5a39473cd12d15819cb09c0276d.png

 

int dado;


O valor de dado é recalculado a cada vez dentro do loop e não é mais usado. Não há razão para aparecer 3 vezes no programa. Podia sumir


char x[2];


Usa x apenas para ler do teclado e aí ou errou simplesmente, como @devair1010 tentou te dizer. Como o valor de dado vai estar entre 1 e 6 provavelmente achou que seria uma boa usar '0' para encerrar o programa.
 

Até aí tudo bem, mas podia avisar o infeliz que está rodando o programa que é pra

Citação

"Digite '0' para encerrar"


Se é que era o que pretendia. Me desculpe se não era o caso e o erro era outro. Como não disse provavelmente o usuário vai acabar digitando Control-C para encerrar o programa. E não seria nada demais. Note que ele também precisa adivinhar que o programa continua rodando e "jogando" dados, porque o programa nada diz. Só muda de linha e fica lá parado.
 

E se o programa tivesse avisado você teria talvez testado melhor e percebido que comparou com zero um campo que foi lido via gets(). O retorno de gets() era char*. Mas vai ler ao menos o '\n' e retornar 10. NUNCA vai ler 0. Você devia ter escrito '0' ou o equivalente em decimal, 48.


__fpurge()


Não sei de onde desenterrou isso, mas isso é obsoleto há décadas e não devia ser usado. Veja o que diz o manual:
 

image.png.d5c55d16375485acfbb43685da22c3ec.png

 

Para ter a referência em dois idiomas:
 

Citação

Essas funções --- fpurge() e __fpurge() --- não fazem parte do padrão e não são portáveis. A função fpurge() foi introduzida no BSD 4.4 e não está disponível no Linux. A função __fpurge() foi introduzida no Solaris --- da Sun, Oracle há uns dez anos --- e está presente em glibc 2.1.95 e posterior.

NOTES: em geral é um erro querer descartar dados em buffers de entrada. 

 

gets(x)

 

Essa função é obsoleta e condenada e não deve ser usada de jeito nenhum. Use 

    char *fgets(char *str, int n, FILE *stream)


e escreva

        fgets( x, 2, stdin ); 


como alternativa mais inteligente e que funciona em sistemas das últimas décadas.


Mais uma vez, do manual
 

image.png.cf4314cc3f669ec88882751bebac8a84.png

 

Citação

 

LSB --- Linux Standard Base --- e POSIX.1-2008 definem gets() obsoleta. ISO C11 --- de 2011 --- removeu a especificação de gets() da linguagem C e, desde a versão 2.16, os arquivos de header da glibc não expõem a declaração dessa função se a macro  _ISOC11_SOURCE estiver definida --- e seria bom estar, afinal estamos em 2020.
 

Nunca use gets(). Porque é impossível saber previamente quantos caracteres gets() vai ler, e porque gets() vai continuar a armazenar caracteres  depois do fim do buffer, é extremamente perigoso --- e continua.

 


Seu buffer tem DOIS bytes. :) 

 

srand(time(NULL))


@Midorialertou você: a chamada está no lugar errado. Você roda isso no início, fora de qualquer loop, para reiniciar a sequência de valores a ser retornada por rand(), isso se for importante para você, por exemplo se precisar reproduzir a série.

    dado = 1 + (rand() % 6);
    printf("\nDado: %d", dado);

Nesse caso isso é redundante. dado não é processado exceto nessas duas linhas..

 

if(x[0] == 0 ) return;


OK, não está errado mas não vai acontecer nunca. gets() nunca retorna zero, isso em uma máquina que aceite gets().

 

O que podia ter feito?
 

Algo mais simples, tipo
 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void main ()
{
        srand(time(NULL));
        printf("Tecle Control-C para encerrar\
ou ENTER para continuar\n");
        while(1)
        {
                printf("\nDado: %d", 1 + rand()%6);
                fgetc(stdin);
        };
}

 

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...