Ir ao conteúdo
  • Cadastre-se

C Jogo da Forca completo (Programado em C)


Daniel13

Posts recomendados

Jogo da forca completo, programado em C. Pode servir pra alguns de vocês aprenderem alguns conceitos de programação em C, no programa eu usei a criação de arquivos, alocação dinâmica de memória e uso de algumas funções. Tentei fazer uma "interface" pra ficar um pouco mais "bonitinho" (dentro dos limites da linguagem).

Segue abaixo o código:

 

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#include <time.h>

#include <string.h>



//adiciona as palavras e a respectiva dica nos arquivos

void grava (FILE *arquivodepalavras, FILE *arquivodedicas)

{

	char *inserir, *dica;	

	inserir = (char *)malloc(40*sizeof(char));	

	dica = (char *)malloc(40*sizeof(char));	

	*inserir = 1;

	arquivodepalavras = fopen ("PALAVRAS.txt", "a");

	arquivodedicas = fopen ("DICAS.txt", "a");

	

  while(*inserir!=0)

  {

		printf("Insira a palavra: ");

		__fpurge(stdin);

		gets(inserir);

		

		if(*inserir!=0)

		{			

			printf("Insira a dica da palavra: ");

			__fpurge(stdin);

			gets(dica);			

			fprintf(arquivodepalavras, "%s", inserir);			

			fprintf(arquivodepalavras, "\n");

			fprintf(arquivodedicas, "%s", dica);			

			fprintf(arquivodedicas, "\n");			

			

		}	

	}

	printf("\n");

	

	fclose(arquivodepalavras); fclose(arquivodedicas);

	free(inserir); free(dica);

}



//função que contabiliza o tempo 

double tempo()

{

 struct timeval tv;

 

 gettimeofday(&tv,0);

 

 return (tv.tv_sec+tv.tv_usec/1e6);

}



//gera a palavra aleatória e pega a dica da mesma

void palavrasecreta(FILE *arquivodepalavras, char *palavrasecreta, FILE *arquivodedicas, char *dicadapalavra)

{

	char *ler;

	int *numerorandomico, *tamanho, *i;

	

	arquivodepalavras = fopen ("PALAVRAS.txt", "r");

	arquivodedicas = fopen ("DICAS.txt", "r");	



	numerorandomico = (int *)malloc(sizeof(int));

	tamanho = (int *)malloc(sizeof(int));

	ler = (char *)malloc(sizeof(char));

	i = (int *)malloc(sizeof(int));

	

	*tamanho = 0;

	

	while((*ler=getc(arquivodepalavras))!=EOF)

		if(*ler=='\n')

			(*tamanho)++;

	

	rewind(arquivodepalavras);		

	

	srand(time(NULL));

	*numerorandomico = 1+rand()%(*tamanho);

	

	for(*i=0; *i<(*numerorandomico); (*i)++)

		fgets(palavrasecreta, 50, arquivodepalavras);	



	for(*i=0; *i<(*numerorandomico); (*i)++)

		fgets(dicadapalavra, 50, arquivodedicas);			

	

 	fclose(arquivodepalavras); fclose(arquivodedicas);

 	free(numerorandomico); free(tamanho); free(ler); free(i);

}



//calcula o tamanho da palavra pra gerar os "traços" no tabuleiro

int checatamanho(char *palavrasecreta)

{

	int i;	

	i = strlen(palavrasecreta)-1;	

	return i;

}



//gera os "traços" no tamanho da palavra escolhida

void riscos (char *secret, int *tamanhodapalavra)

{

	int i;

	

	for(i=0; i<(*tamanhodapalavra); i++)

		secret[i] = '_';

}



//imprime o tabuleiro do jogo juntamente com a dica

void tabuleiro(char *palavrasecreta, int *numeroerros, int *condicaotermino, char *palavramisteriosa, char *dicadapalavra)

{

	system("clear");

	system("clear");

		

	switch(*numeroerros)

	{ 

		case 0:

			printf("__________\n|         |\n|\n|\n|\n|\n|\n|\t%s\n\nA dica é: %s", palavrasecreta, dicadapalavra);

			break;

		case 1:

			printf("__________\n|         |\n|         o\n|\n|\n|\n|\n|\t%s\n\nA dica é: %s", palavrasecreta, dicadapalavra);	

			break;

		case 2:

			printf("__________\n|         |\n|         o\n|         |\n|\n|\n|\n|\t%s\n\nA dica é: %s", palavrasecreta, dicadapalavra);	

			break;

		case 3:

			printf("__________\n|         |\n|         o\n|        /|\n|\n|\n|\n|\t%s\n\nA dica é: %s", palavrasecreta, dicadapalavra);	

			break;

		case 4:

			printf("__________\n|         |\n|         o\n|        /|\\ \n|\n|\n|\n|\t%s\n\nA dica é: %s", palavrasecreta, dicadapalavra);	

			break;

		case 5:

			printf("__________\n|         |\n|         o\n|        /|\\ \n|        /\n|\n|\n|\t%s\n\nA dica é: %s", palavrasecreta, dicadapalavra);	

			break;

		case 6:

			printf("__________\n|         |\n|         o\n|        /|\\ \n|        / \\ \n|\n|\n|\t%s\n", palavrasecreta);						

			printf("\n\n==============\nVOCÊ PERDEU!!!\n==============\n\n");

			printf("\nA palavra era: %s\n", palavramisteriosa);		

			(*condicaotermino)=0;		

			break;	

	}											

}



//testa se você acertou ou errou

void testerro (int *tamanhopalavra, int *erros, char *palavra, char *secreto, char *letra)

{

	int i, certa=77, certa2=0, certa3=0, certa4=0;

			

	for(i=0; i<(*tamanhopalavra); i++)

		if(*letra==palavra[i])

		{

			certa=i;

			break;

		}

			

		for(i=(certa+1); i<(*tamanhopalavra); i++)

			if(*letra==palavra[i])

			{

				certa2=i;

				break;

			}



		for(i=(certa2+1); i<(*tamanhopalavra); i++)

			if(*letra==palavra[i])

			{

				certa3=i;

				break;

			}		



		for(i=(certa3+1); i<(*tamanhopalavra); i++)

			if(*letra==palavra[i])

			{

				certa4=i;

				break;

			}	

			

	if(certa==77 && certa2==0 && certa3==0 && certa4==0)

		(*erros)++;				

	else	

	{

		if(certa!=77)

			secreto[certa] = *letra;

		if(certa2!=0)

			secreto[certa2] = *letra;

		if(certa3!=0)

			secreto[certa3] = *letra;		

		if(certa4!=0)

			secreto[certa4] = *letra;			

	}					

}



int vitoria(char *palavra, char *secreto, int *tamanhodapalavra, int *termino)

{

	int i, checagem=0;

	

	for(i=0; i<(*tamanhodapalavra); i++)

		if(secreto[i]==palavra[i])

			checagem++;

	

	if(checagem==(*tamanhodapalavra))

	{

		system("clear");

		system("clear");

		printf("\n\n==============\nVOCÊ GANHOU!!!\n==============\n\n");

		(*termino)=0;						

	}	

	checagem=0;	

}



void main ()

{

	//declarando as variaveis

	int i, j, t=0;

	FILE *arquivopalavras, *melhorestempos, *arquivodicas;

	char *palavra, *segredo, *letra, *dicas;

	int *opcao, *tamanhopalavra, *numeroerros, *condicaodefim, *condicaodefim2;

	double tempoinicial,tempofinal,auxiliar, seutempo;

	melhorestempos = fopen("Tempos.txt", "a");

	

	//reserva espaço na memoria 

	palavra = (char *)malloc(40*sizeof(char));

	dicas = (char *)malloc(40*sizeof(char));	

	opcao = (int *)malloc(sizeof(int));

	tamanhopalavra = (int *)malloc(sizeof(int));

	segredo = (char *)malloc(40*sizeof(char));

	numeroerros = (int *)malloc(sizeof(int));

	letra = (char *)malloc(sizeof(char));

	condicaodefim = (int *)malloc(sizeof(char));

	condicaodefim2 = (int *)malloc(sizeof(char));

		

	*numeroerros = 0; *condicaodefim = 1; *condicaodefim2 = 1;



	//menu inicial	

	system("clear");

	system("clear");	

			printf("================================================================================\nFAZER\t\t\tCÓDIGO\n\nADICIONAR PALAVRAS\t1\nJOGAR\t\t\t2\n\n================================================================================\n");

	printf("O que fazer: ");		

	scanf("%d", opcao);	



	//abre a função que adiciona palavras/dicas	

	if(*opcao==1)

		grava(arquivopalavras, arquivodicas);	

				

	//inicia o jogo				

	else if(*opcao==2)

	{

		tempoinicial = tempo();

		palavrasecreta(arquivopalavras, palavra, arquivodicas, dicas);

		*tamanhopalavra = checatamanho(palavra);

		riscos(segredo, tamanhopalavra);



		while(*condicaodefim==1 && *condicaodefim2==1)

		{

			tabuleiro(segredo, numeroerros, condicaodefim, palavra, dicas);

			printf("\nInsira uma letra: ");

			__fpurge(stdin);		

			gets(letra);		

			testerro(tamanhopalavra, numeroerros, palavra, segredo, letra);

			tabuleiro(segredo, numeroerros, condicaodefim, palavra, dicas);

			vitoria(palavra, segredo, tamanhopalavra, condicaodefim2);						

		}



	//término do jogo		



		if((*condicaodefim2)==0)

		{	

			tempofinal = tempo();

			seutempo = tempofinal - tempoinicial;

			fprintf(melhorestempos, "%.3lf segundos\n", seutempo);

			fclose(melhorestempos);	

			

		//abre o arquivo e mostra os tempos na tela

		melhorestempos = fopen("Tempos.txt", "r");	 

		

		while((*letra=getc(melhorestempos))!=EOF)

			if(*letra == '\n')

				t++;

		

		double vet[t];

		char seg[50];

				

		rewind(melhorestempos);

		

		for(i=0; i<t; i++)

		 fscanf(melhorestempos, "%lf%s", &vet[i], seg); 

		

		for(i=0; i<t; i++)

		 for(j=i; j<t; j++)

			if(vet[i]>vet[j])

			{

				auxiliar = vet[i];

				vet[i] = vet[j];

				vet[j] = auxiliar;

			}

		 

		fclose(melhorestempos);

		

		melhorestempos = fopen("Tempos.txt", "w");	

				

		for(i=0; i<t; i++)

			fprintf(melhorestempos, "%.3lf %s\n", vet[i], seg);			

			

		fclose(melhorestempos);

		

		melhorestempos = fopen("Tempos.txt", "r");			

		

		printf("Seu tempo foi: %.3lf segundos\n\n", seutempo);

		

		printf("===============\nMELHORES TEMPOS\n\n");

		while((*letra=getc(melhorestempos))!=EOF)

			printf("%c", *letra);	

		printf("===============\n\n");			 

				

		fclose(melhorestempos);					

		}		

		else

		 fclose(melhorestempos);		

	}

		free(palavra); free(opcao); free(tamanhopalavra); free(segredo); free(numeroerros); free(letra); 	free(condicaodefim); free(condicaodefim2); free(dicas);							

}

Qualquer dúvida podem perguntar, vou tentar responder ao máximo. Em breve vou terminar um jogo da velha, pode ser interessante também. Desconsiderem qualquer eventual excesso de coisas no código.

 

  • Curtir 1
  • Amei 1
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...