Jump to content

Sorteio de palavra através de um ficheiro - jogo da forca


_covinhas_

Recommended Posts

_covinhas_

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 :).

 

void jogar(char ficheiro[]){
	FILE *f;
	jogador_t temp;
	char letra[5],jogador[500];
	char pal [60];
	int qtd=0;
	int tentativas=5,pontos=0,vidas=0,confirmacao,palavrascertas=0,sessao=0,j;
	
	f=fopen(ficheiro,"r");
	
	if (f==NULL){
		printf("Erro ao abrir o ficheiro. Tente novamente!\n\n");
		} 
	
	printf("\n Insira o nome do jogador: ");
	scanf("%s",jogador);
		
	srand(time(NULL));	
	while(!feof(f)) {
		fread(&temp,sizeof(temp),1,f);
		qtd++;
		 }
	
	fclose(f);
	pal=rand()%1;
	tentativas=strlen(pal);
	vidas=tentativas-1;
	
	while (vidas < tentativas){  // 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
		
		printf("\nInsira uma letra: ");
		scanf("%s",letra);
		
		for(j=0;j<tentativas;j++){
			confirmacao=0;
			
			if (letra[0]==pal[tentativas]){ // se a letra for igual alguam das letras das palvras 
				pontos++; //adiona 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",pal);  // jogador é derrotado                                              
					}				
				else{
					printf("A letra esta errada! Ainda tens %i vidas.\n"); // jogador falaha 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 .",pal); 
					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
				}
			}

			}
}

 

Link to post
Share on other sites
HappyHippyHippo

tens razão, o que não faltam são erros no código. no entanto o que terás de fazer não é mais do que o seguinte :

- determinar a  quantidade de palavras existentes no ficheiro

- escolher um número aleatório entre 0 e o número de palavras possíveis (exclusivo)

- ler a palavra do ficheiro (isto para não teres as palavras todas em memória)

- correr o jogo

 

boa sorte

  • Vote 1
IRC : sim, é algo que ainda existe >> #p@p
Link to post
Share on other sites
_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[80], 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;
	jogador_t existe,*p=NULL;	 
	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()%pal;
	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);
		nome++;
	} 
	
	tentativas = strlen(selecionada);	
	
	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]='_';		
		}
    		
		printf("\n %s ",espaco);
		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){
		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) {
		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);
	
}

O código ficou assim, não consigo arranjar maneira de conseguir mesmo fazer o sorteio, já tentei fazer quase todas hipóteses de que me lembrei...  achas que podes me dar uma ajuda a tentar o meu erro ?

 

14 horas atrás, HappyHippyHippo disse:

tens razão, o que não faltam são erros no código. no entanto o que terás de fazer não é mais do que o seguinte :

- determinar a  quantidade de palavras existentes no ficheiro

- escolher um número aleatório entre 0 e o número de palavras possíveis (exclusivo)

- ler a palavra do ficheiro (isto para não teres as palavras todas em memória)

- correr o jogo

 

boa sorte

 

Link to post
Share on other sites
HappyHippyHippo

estás a izer que tens problemas em escolher a pavra, certo ?

mas já te foi dito (sim, eu leio os outros tópicos, muito inteigente em dividir a discução em dois para ver se não tens resposta em nenhum ...) que terás de usar a função rand para tal.

a função rand retorna um valor de 0 a RAND_MAX, logo o que terás de fazer não é obter o resto da divição inteira desse valor pelo valor total de palavras existentes.

----------

ps : o teu código necessita de ser melhorado urgentemente ...

IRC : sim, é algo que ainda existe >> #p@p
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.