Jump to content
_covinhas_

Jogo da "Forca"

Recommended Posts

_covinhas_
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include <ctype.h>
#define N 500
#define PAL 100


typedef struct jogador_s {
	char palavra[300];
	struct jogador_s *seg;
}jogador_t;

jogador_t *insere_lista(jogador_t contem,jogador_t *p){ 
	jogador_t *aux,*aux1; // 2 ponteiros auxiliares
	aux=p;
//por inicio ou à cabeça
	if(p==NULL){ // Se não existir nada na lista, insere dados
		p=(jogador_t*) malloc(sizeof(jogador_t)); // aloca na memória
		*p=contem; //aquilo que estiver no ponteiro armaneza
		p->seg=NULL; // aponta para NULL
		return p;
	}

	while (aux->seg!=NULL) {  // se não tiver vazia, procura por "espaço" vazio
		aux=aux->seg;
	}
//faz a função anterior
	aux1=(jogador_t *)malloc(sizeof(jogador_t));  // aloca na memória
	*aux1=contem;
	aux->seg=aux1;
	aux1->seg=NULL;
	return p;
}
jogador_t *pede_dados(jogador_t *p){
	jogador_t novo;
	
	printf("Inserir palavra: "); 
	scanf("%s",novo.palavra);
	// pede os dados e irá à funçao da insere_lista 
	p=insere_lista(novo,p);
	printf("Foi adicionado com sucesso!\n\n");
}
jogador_t *alterar(jogador_t *p){ 

	jogador_t novo,velho;
	jogador_t*aux;    // PONTEIRO AUXULIAR 
	int cont=0;
	aux=p;

	do{	
	cont=0;
	p=aux;
	printf("Introduza a palavra que pretende alterar:");
	scanf("%s",novo.palavra);
	// se a lista não tiver vazia irá verificar se existe algum número na lista
	while(p!=NULL){
		if (strcmp(p->palavra,velho.palavra)){      // verifica se exista    
  			cont++; // caso exista -> contabiliza 
			}
		p=p->seg; //aponta para próximo 
		}
	if(cont==0){
		printf("Palavra não existe!\n" ); // caso não exista, diz que não existe o nº inventário
		}
						
	} while( cont!=1); 	 			
	p=aux;
	
	printf("Insira a palavra nova: ");
	scanf("%s",novo.palavra); 			// pede os novos dados 
	while(p!=NULL){  // se a lista não tiver vazia, copia os dados novos ou substitui os anteriores

		if(strcmp(p->palavra,novo.palavra)){ 			         
		  strcpy(p->palavra,novo.palavra);          // copia a palavra nova
			}
		p=p->seg; // ponta para o próximo
	}
	p=aux;
	printf("Alterado com sucesso!\n");
	return p;
}

jogador_t mostra(jogador_t *p){
	if (p==NULL){
		printf("Lista está vazia!\n"); 
		exit(-1);// como ponteiro de p == NULL , logo a lista está vazia
		}	
	do{		
		printf("\n %s    \n",p->palavra); 		
	 p=p->seg; // mostra até sempre encontrar um elemento, caso contrário p == NULL pará de mostrar
	} while(p!=NULL);
}

jogador_t *le_ficheiro(jogador_t *p,char ficheiro[]){
  jogador_t existe;
  FILE *f;
  f=fopen(ficheiro,"r+b");
  
  if(f==NULL){
    printf("Erro ao abrir o ficheiro,tente novamente!\n\n"); }
    
  while(fread(&existe,1,sizeof(jogador_t),f)>0){
    p=insere_lista(existe,p);
  	}
  return p;
  fclose(f);
}

jogador_t guardar(jogador_t *p,char ficheiro[]){
	FILE *f;
	f=fopen(ficheiro,"w+b");
	if(f==NULL){
		printf("Erro ao abrir o ficheiro,tente novamente!\n\n");
		}
	while(p!=NULL){
		fwrite(p,1,sizeof(jogador_t),f);
		p=p->seg; // se for diferente de NULL, passa para o seguinte vai sempre guardando ou escrevendo no documento
		}
	fclose(f);

}



void jogar(char ficheiro[]){
	FILE *f;
	char letra[5],jogador[500],selecionada[800], palavras[PAL][50],espaco[20],c,letra1 = '\n';	
	int tentativas,pontos=0,vidas=7,confirmacao=0,palavrascertas=0,sessao=0,j=0,nome=0;
	int gera;
	int pal=0;
		 
	srand(time(NULL));
	
	f=fopen(ficheiro,"r+b");
	
	if (f==NULL){
		printf("Erro ao abrir o ficheiro! \n");
	}
	while(fread (&c, sizeof(char), 1, f)) {
            if(c == letra1) {
                pal++;
		}
	}
	gera=rand()%10; //gere uma palvra
	strcpy(selecionada,palavras[gera]); // 
	printf("A palavra seleciona e %s\n",selecionada); 
		
	if (nome==0){	
		printf("\n Insira o nome do jogador: ");
		scanf("%s",jogador); //pede o nome
		nome++;  //incrementa um vez ,pois assim sempre que reinciar o jogo não pergunta o nome novamente
	} 
	
	tentativas = strlen(selecionada); // tamanho da palavra selcionada		
	
	
	while (vidas > 0){  // enquanto as vidas forem inferiores ao comprimento da palavra(tentativas) --> jogo corre
		sessao++;		
		printf("\n\nDe momento, esta na %iª jogada e tem %i pontos. \n Tem %i palavras certas.",sessao,pontos,palavrascertas); //inf. para o jogador
		
		for(j=0;j<strlen(selecionada);j++){
			espaco[j]='_';		// conta os espaco da palvra selcionada
		}
    		
		printf("\n %s ",espaco); // coloca o espaço da palvr a a ser adivinha
		printf("\nInsira uma letra: ");
		scanf("%s",letra);
		
		for(j=0;j<tentativas;j++){
						
			if (letra[0]==selecionada[tentativas]){ // se a letra for igual alguam das letras das palvras 
				espaco[j]=selecionada[j];
				pontos++; //adiciona uma ponto
				confirmacao++; // adiciona se for igual a letra algumas das letras fda palavra em jogo caso contrário fica com 0
				}
			}
			if (confirmacao==0){ //caso não tenha sido confirmado,logo a letra não seja igual -> jogador perde
				vidas--; //retira uma vida ao jogador
				if (vidas==0){ //caso as vidas sejam 0 == 0 , termina o jogo
					printf("GAME OVER! \n A palavra seria %s.\n",selecionada);  // jogador é derrotado                                              
					}				
				else{
					printf("A letra esta errada! Ainda tens %i vidas.\n"); // jogador falha uma tentativa
					}
				
			} else {
				if (pontos==tentativas){					//caso os pontos que sido iguais às tentativas (por cada letra da palavra em jogo) --> jogador vence		 	
					
					printf("PARABENS! A palavra e: %s .",selecionada); 
					palavrascertas++; //conta palavra acertada
					//jogarnov(jogador,palavrascertas,sessao,pontos); // mensagem de fim do jogo
				}else{
					printf("A letra esta correta."); // letra está corrta e prosegue --> jogador certou letra
				}
			}

			}
	fclose(f);
}
	
void jogarnov(char jogador[600],int palavrascertas,int sessao,int pontos) {
	int sessao1=1,op;
	char ficheiro[] = "filmes.dat";
	
	printf("\n\n\nTERMINOU O SEU JOGO!\n Deseja jogar novamente? Sim [1] ou Nao [2].\n");
	scanf("%i",&op);
	
	if (op==1){  //caso o jogador queira jogar novamente 
		printf("---------------------------------------\n");
		printf("|||      JOGADOR     *   %s        |||\n",jogador);
		printf("|||    	PONTUACAO    *        %i    |||\n",pontos);
		printf("|||  PALVRAS CERTAS  *        %i    |||\n",palavrascertas);
		printf("|||    	JOGADAS      *        %i    |||\n",sessao);
		printf("|||    	 SESSAO      *        %i    |||\n",sessao1);
		printf("---------------------------------------\n");
		jogar(ficheiro); 		
		}
		sessao1++;
		
	if(op==2) { // termina o jogo e encerra o programa
		printf("---------------------------------------\n");
		printf("|||      JOGADOR     *   %s        |||\n",jogador);
		printf("|||    	PONTUACAO    *        %i    |||\n",pontos);
		printf("|||  PALVRAS CERTAS  *        %i    |||\n",palavrascertas);
		printf("|||    	JOGADAS      *        %i    |||\n",sessao);
		printf("|||    	 SESSAO      *        %i    |||\n",sessao1);
		printf("---------------------------------------\n\n"); 
		exit(-1);
		}
	
	}
int main (){
	char ficheiro[] = "filmes.dat";
	jogador_t *p = NULL;
	int op,op1;
	
	do{
	p=le_ficheiro(p,ficheiro);
	printf(" ================================== \n");
	printf(" ||  Menu do Jogo da Forca       ||	\n");
	printf(" ----------------------------------\n"); 
	printf(" ||	1. Dicionario       	 ||	\n");
	printf(" ||	2.Jogar		         ||	\n");
	printf(" ================================== \n");
	printf("Escolha a sua opcao:");
	scanf("%i",&op);
	
	if (op==1){
		do{	
		p=le_ficheiro(p,ficheiro);	
			printf(" \n\n*** DICIONARIO ***	\n");
			printf("1. Ver palavras.	\n");
			printf("2. Adicionar palavras.\n");
			printf("3. Alterar palavras.\n");
			printf("4. Sair. \n");
			printf("Escolha a sua opcao:");
			
			scanf("%i",&op1);
			
			switch(op1){
				case 1:
					mostra(p);			
					
				break;
				case 2:
					p=pede_dados(p);
					guardar(p,ficheiro);
					
				break;
				case 3:
					p=alterar(p);
					guardar(p,ficheiro);
					
				break;
				case 4:
					return 0;
				break;
				
				}
			}while (op1!=4);
			
		}	
	
	
	if (op==2){	
		printf("Bem-vindo ao Jogo da Forca! \n");
		jogar(ficheiro);
		}
	
	}while (op!=3);
	
}

Olá! Vim pedir ajuda relativamente um jogo da forca, o enunciado deste exercício pede que tenha um ficheiro disponível com diversas palavras que o jogador possa adicionar, alterar e visualizar a partir desse ficheiro e outra parte evidentemente que é para jogar, mas visto que não estou a entender como poderei fazer a parte do sorteio da palavra o jogo não corre na execução. Aqui fica a minha tentativa resolução. Provavelmente o código terá outros erros... Ainda estou em fase de experimentação . 

 

Share this post


Link to post
Share on other sites
Tim§id€

Boas, não percebi muito bem a tua duvida. Mas pq não crias da seguinte maneira, tens um ficheiro .txt onde cada linha contem uma palavra, este ficheiro por sua vez é lido por opção do utilizador ou automático, a qual será possível modificar ou adicionar novas palavras.
Após teres lido o ficheiro é fácil manipulares os dados, podes fazer um random que escolhe um linha do array onde guardaste as frases e "jogas" a partir de ai ou simplesmente usas pelo index do array. Não sei se é bem está a tua duvida ou não.

Edited by Tim§id€
  • Vote 1

...º(>_<)º...

Share this post


Link to post
Share on other sites
_covinhas_

Olá! Bem a minha dúvida é a seguinte: eu tenho que fazer "sorteio" em que tenho que escolher uma  palavra desse ficheiro. O meu problema é que não estou a fazer contabilização das palavras correctamente e provavelmente não estou a usar a função correta -> gera=rand()%;

Share this post


Link to post
Share on other sites
Tim§id€

Então se precisas de fazer um sorteio a melhor maneira para o teu caso é com random. Se ao leres as palavras do ficheiro guardas num array, podes simplesmente fazer 
gera=rand() % 10; que te retorna um valor de 0-9 mas para nao gerar a palavra mais que uma vez podes simplesmente ter um array que guarda os números já gerados ( é apenas uma das muitas possibilidades)  ou assim que usaste a palavra vais remover essa palavra do array etc... . Quando tu falas em ficheiro estas a referir .txt etc. certo?


...º(>_<)º...

Share this post


Link to post
Share on other sites
_covinhas_

Binário,

Qd executo aparece assim:

https://i.postimg.cc/mrdNQBsp/VqcumBg.png

Código:

o[]){
	FILE *f;
	char letra[5],jogador[500],selecionada[800], palavras[PAL][50],espaco[20],c,letra1 = '\n';	
	int tentativas,pontos=0,vidas=7,confirmacao=0,palavrascertas=0,sessao=0,j=0,nome=0;
	int gera;
	int pal=0;
		 
	srand(time(NULL));
	
	f=fopen(ficheiro,"r+b");
	
	if (f==NULL){
		printf("Erro ao abrir o ficheiro! \n");
	}
	while(fread (&c, sizeof(char), 1, f)) {
            if(c == letra1) {
                pal++;
		}
	}
	gera=rand()%10; //gere uma palvra
	strcpy(selecionada,palavras[gera]); // 
	printf("A palavra seleciona e %s\n",selecionada); 

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.