Ir ao conteúdo
  • Cadastre-se

C Problema jogo da forca


Posts recomendados

Olá pessoal, tudo bom?

 

Estou criando um jogo da forca em C e estou enfrentando 2 problemas. O primeiro é a condição de derrota que eu criei. Mesmo se o usuário digitar uma letra certa,  o programa dá a resposta como certa e errada ao mesmo tempo. O boneco vai sendo marcado na forca. Eu tenho que tirar ela de dentro do laço de repetição?

 

E a outra dúvida que tenho é como parar o contador de acertos, pois se o usuário digitar uma letra mais de uma vez, que ela já tenha digitada e que exista na palavra, o contador segue sendo incrementado. Como eu poderia resolver isso? 

 

Falta apenas esses dois pontos para eu terminar o projeto.

Agradeço desde já pela ajuda. Abração!

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<locale.h>
#include <conio.h>

int erros=0, acerto=0, i;
char pergunta[20];
char resposta[]={'_','_','_','_','_','_','_','_','_','_'};
char letra;
char palavra[]={'_','_','_','_','_','_','_','_','_','_'};
int contador=0;


char cabeca=' ';
char tronco=' ';
char bracesq=' ', bracdir=' ';
char pernesq=' ', perndir=' ';

char cabeca2='ô';
char tronco2='|';
char bracesq2='||', bracdir2='||';
char pernesq2='//', perndir2='\\';

void lerpergunta(){//função para ler a pergunta
	FILE *f;
 	f=fopen ("pergunta.foc","r");
 	char c;
 	while(1){
 		c=fgetc(f);
 		if(c==EOF){
 			break;
 			}
 		printf("%c",c);

 	}
 	printf("\n");
 	fclose(f);
 }
void menu(){
	printf("\n----------- Bem vindo ao Jogo da Forca 2.0-----------\n");
	printf("\n\nSeu objetivo e advinhar a palavra que esta escondida");	
	
	printf("\n\n");
}

void desenho(){
	
	printf("\n\n");
	printf("  _______       \n");
	printf(" |/      |      \n");
	printf(" |       %c\n", cabeca);
	printf(" |       %c \n", tronco); 
	printf(" |      %c %c   \n",bracesq,bracdir); 
	printf(" |      %c %c   \n",pernesq, perndir);
	printf(" |              \n");
	printf("_|___           \n");
	printf("\n\n");

}

void lerResposta(){
	FILE *f;
 	f=fopen ("resposta.foc","r");
 	char c;
 	int cont=0;
 	while(1){
 		c=fgetc(f);
 		if(c==EOF){
 			break;}
 		resposta[cont] = c;
 		cont++;

 	}
 	printf("\n");
 	fclose(f);
 	
 	printf("\n");
}

void boneco(){
	if(erros==1){
		cabeca=cabeca2;
	}
	if(erros==2){
		tronco=tronco2;
	}
	if(erros==3){
		bracesq=bracesq2;
	}
	if(erros==4){
		bracdir=bracdir2;
	}
	if(erros==5){
		pernesq=pernesq2;
	}
	if(erros==6){
		perndir=perndir2;
		printf("\nVoce foi enforcado");
	}
}

int main(){
	setlocale(LC_ALL, "Portuguese");
	menu();
	lerpergunta();
	lerResposta();
	while(erros<=6) {
		desenho();
	    fflush(stdin);
		printf("\nDigite uma letra:\n");
		letra = getch();
		for (i=0;i<10; i++) {
			if (resposta[i] == letra) {
					printf("\nLetra contem na palavra!\n");
					palavra[i] = resposta[i];
					acerto++;	
			}
			else if(acerto==10){
				printf("\n\nParabéns, você acertou a palavra garotinho(a)!\n");
				exit(0);
			}
		}
		    if(resposta[i]!=letra){
				printf("\nLetra errada!\n");
				erros++;
				boneco();
			}
		for (i=0;i<10; i++) {
				printf("%c ", palavra[i]);
		}
	}
	return 0;
}

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

Consegui resolver o problema da marcação do bonequinho da forca. Agora o programa faz a marcação corretamente.

Só não consegui resolver o do contador.

 

Ficou assim o código da int main

 

int main(){
	char acertouletra= 0;
	setlocale(LC_ALL, "Portuguese");
	menu();
	lerpergunta();
	lerResposta();
	while(erros<=6) {
		desenho();
	    fflush(stdin);
		printf("\nDigite uma letra:\n");
		letra = getch();
		for (i=0;i<10; i++) {
			if (resposta[i] == letra) {
					palavra[i] = resposta[i];
					acertouletra=1;
			}
		}
		if(acertouletra==1){
			printf("\nLetra contem na palavra\n");
			acerto++;
		}
		else{
			printf("\nResposta errada\n");
			erros++;
			boneco();
		}
		acertouletra=0;
	    if(acerto==9){
	    	printf("\nParabéns, você descobriu a palavra!\n");
	    	printf("\nA palavra secreta é Inglaterra\n");
	    	exit(0);
		}
		for (i=0;i<10; i++) {
				printf("%c ", palavra[i]);
		}
   }
	return 0;
}

 

  • Amei 1
Link para o comentário
Compartilhar em outros sites

@rodrigo springfield      o problema do contador de erros é que  precisa somar o contador de erros  quando a letra digitada for diferente de todas as letras da palavra ,  e não sei como você gravou os dados no arquivo , então se você puder postar um exemplo de como está organizado no arquivo seria melhor para saber como proceder ,  mas então  coloquei o código para funcionar com um arquivo organizado assim  :

nome do arquivo --> pergunta.foc
dados no arquivo -> agentina  Brasil  Uruguai

então seu código com algumas modificações ficou assim  :

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<locale.h>
#include <conio.h>
#include <windows.h>
int erros=0,contador=0,flag,acerto=0,i,Let;
char pergunta[20],letra,cabeca=' ',tronco=' ';
char resposta[10]={'_','_','_','_','_','_','_','_','_','_'};
char palavra[]={'_','_','_','_','_','_','_','_','_','_'};
char bracesq=' ',bracdir=' ',cabeca2='ô';
char pernesq=' ',perndir=' ',tronco2='|';
char bracdir2='|',bracesq2='|',pernesq2='/',perndir2='\\';
/*             0     1    2     3   4     5      6        7        8*/
typedef enum{BLACK,BLUE,GREEN,CYAN,RED,MAGENTA,BROWN,LIGHTGRAY,DARKGRAY,
LIGHTBLUE,LIGHTGREEN,LIGHTCYAN,LIGHTRED,LIGHTMAGENTA,YELLOW,WHITE} COLORS;
/*   9        10         11        12       13          14    15    */
static int __BACKGROUND = BLACK;
static int __FOREGROUND = LIGHTGRAY;

void textcolor (int color, int fundo){/*para mudar a cor de fundo mude o background*/
    __FOREGROUND = color;
    __BACKGROUND = fundo;
    SetConsoleTextAttribute (GetStdHandle (STD_OUTPUT_HANDLE),
    color + (__BACKGROUND << 4));
}
void lerpergunta(){/*//função para ler a pergunta*/
    FILE *f;
    f=fopen("pergunta.foc","r");
    printf("Essas Palavras estão No Arquivo < pergunta.foc >\n");
    printf("A Resposta eh Uma Delas .\n");
    while(fscanf(f,"%s",pergunta)!= EOF){
        printf("%s\n",pergunta);
    }
    fclose(f);
 }
void menu(){
    printf("----------- Bem vindo ao Jogo da Forca 2.0 -----------\n");
    printf("Seu objetivo e advinhar a palavra que esta escondida\n");
}
void desenho(){
    printf("  _______       \n"                );
    printf(" |/      |      \n"                );
    printf(" |       %c     \n",cabeca         );
    printf(" |       %c     \n",tronco         );
    printf(" |      %c %c   \n",bracesq,bracdir);
    printf(" |      %c %c   \n",pernesq,perndir);
    printf(" |              \n"                );
    printf("_|___         "                    );
    for (i=0;i<strlen(pergunta); i++){
        printf("%c ", palavra[i]);
    }
    textcolor(12,14);
    if(erros==6)       /* só um cmando, não precisa de chaves */
        printf("\n\n==========> voce foi enforcado <=========");
    printf("\n");
    textcolor(7,0);
}
void lerResposta(){
    int cont=0;
    FILE *f;
    f=fopen("resposta.foc","r");
    while(fscanf(f,"%s",resposta)!= EOF){
            cont++;
    }
    fclose(f);
}
void boneco(){
    if(erros==1){
            cabeca=cabeca2;
    }
    else{
        if(erros==2){
            tronco=tronco2;
        }
        else{
            if(erros==3){
                bracesq=bracesq2;
            }
            else{
                if(erros==4){
                    bracdir=bracdir2;
                }
                else{
                    if(erros==5){
                        pernesq=pernesq2;
                    }
                    else{
                        if(erros==6){
                            perndir=perndir2;
                        }
                    }
                }
            }
        }
    }
}
int main(){
    setlocale(LC_ALL,"");
    menu();
    lerpergunta();
    lerResposta();
    do{
        boneco();
        desenho();
        if(erros<6){
        printf("            Digite uma letra: ");
            Let   = getch();  /* pega o código ascii da tecla pressionada */
            letra = (char)Let;/* converte um inteiro (código ascii) para char */
        }
        flag=0;               /* bandeira para sinalizar que achou */
        for (i=0;i<strlen(pergunta); i++){
            if (pergunta[i] == letra){
                printf("\nContem Essa Letra Na Palavra!\n");
                palavra[i] = pergunta[i];
                acerto++;     /* soma total de acertos */
                flag=1;
            }
        }
        palavra[i]='\0';      /*coloca o '\0' para indicar o fim da string*/
        if(flag==0 ){
            erros++;          /* soma quantos erros */
            if(erros < 6)
                printf("\n            Letra errada!\n");
        }
        if(acerto==strlen(pergunta)){/* se acertou todas as letras */
            desenho();
            textcolor(15,9);
            printf("\n\nParabéns, você acertou a palavra garotinho(a)!\n\n");
            textcolor(7,0);
            system("pause");
            exit(0);
        }
    }while(erros < 7);
    return 0;
}

 

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

Consegui resolver o problema

 

O código ficou assim

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<locale.h>
#include <conio.h>

int erros=0,contador=0,acerto=0, i, y;
char pergunta[20];
char resposta[10]={'_','_','_','_','_','_','_','_','_','_'};
char palavra[]={'_','_','_','_','_','_','_','_','_','_'};
char cabeca=' ';
char tronco=' ';
char bracesq=' ',bracdir=' ',cabeca2='ô';
char pernesq=' ',perndir=' ',tronco2='|';
char bracdir2='||',bracesq2='||',pernesq2='//',perndir2='\\';

struct Contador{
	int acertou;
	char letra;
}conter;

void lerpergunta(){//função para ler a pergunta
	FILE *f;
 	f=fopen ("pergunta.foc","r");
 	char c;
 	while(1){
 		c=fgetc(f);
 		if(c==EOF){
 			break;
 			}
 		printf("%c",c);

 	}
 	printf("\n");
 	fclose(f);
 }
void menu(){
    printf("----------- Bem vindo ao Jogo da Forca 2.0 -----------\n");
    printf("Seu objetivo e advinhar a palavra que esta escondida\n");
}

void desenho(){
    printf("  _______       \n"                );
    printf(" |/      |      \n"                );
    printf(" |       %c     \n",cabeca         );
    printf(" |       %c     \n",tronco         );
    printf(" |      %c %c   \n",bracesq,bracdir);
    printf(" |      %c %c   \n",pernesq,perndir);
    printf(" |              \n"                );
    printf("_|___         "                    );
    for (i=0; i<10; i++){
        printf("%c ", palavra[i]);
    }
}
    
void lerResposta(){
	FILE *f;
 	f=fopen ("resposta.foc","r");
 	char c;
 	int cont=0;
 	while(1){
 		c=fgetc(f);
 		if(c==EOF){
 			break;
 		}
 		resposta[cont] = c;
 		cont++;
 	}
 	printf("\n");
 	fclose(f);
 	
 	printf("\n");
}

void boneco(){
	if(erros==1){
		cabeca=cabeca2;
	}
	if(erros==2){
		tronco=tronco2;
		cabeca=cabeca2;
	}
    if(erros==3){
    	tronco=tronco2;
		cabeca=cabeca2;
		bracesq=bracesq2;
	}
	if(erros==4){
		tronco=tronco2;
		cabeca=cabeca2;
		bracesq=bracesq2;
		bracdir=bracdir2;
	}
	if(erros==5){
		tronco=tronco2;
		cabeca=cabeca2;
		bracesq=bracesq2;
		bracdir=bracdir2;
		pernesq=pernesq2;
	}
   if(erros==6){
		tronco=tronco2;
		cabeca=cabeca2;
		bracesq=bracesq2;
		bracdir=bracdir2;
		pernesq=pernesq2;
		perndir=perndir2;
		printf("\nVoce foi enforcado\n");
	}
}
int main(){
    setlocale(LC_ALL,"");
    menu();
    lerpergunta();
    lerResposta();
    do{
        boneco();
        desenho();
        fflush(stdin);
        if(erros<6){
	        printf("\nDigite uma letra: ");
	        conter.letra= getch();
        }
        conter.acertou=0;//  sinaliza que achou a letra
        for (i=0;i<10; i++){
            if (resposta[i] == conter.letra){
                printf("\nContem essa letra na palavra!\n");
                palavra[i] = resposta[i];
                acerto++;  
                conter.acertou=1;
            }
            
        }
        
         for (i=0;i<10; i++){
            if (palavra[i] == conter.letra){
                acerto--; 
            }
        }
        
        
        palavra[i]='\0';// comando para não dar erro e indica o fim da string     
        if(conter.acertou==0 ){
            erros++;          /* soma quantos erros */
            if(erros < 6)
                printf("\n            Letra errada!\n");
        }
        
        y=0;
        for(i=0; i<10; i++){
        	if(resposta[i]==palavra[i]){
        		y++;
        	}
        }
        if(y==10){
        	printf("\nVocê ganhou!!!");
        	exit(0);
        }
        
        
    }while(erros < 7);
    return 0;
}

 

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

  • Membro VIP

Olá.

 

51 minutos atrás, rodrigo springfield disse:

Consegui resolver o problema

 

O código ficou assim

 

Testei seu código. Apenas inseri a letra "a" e deu isso...

teste_jogo.png

 

Então, se está utilizando arquivos (que é algo relativamente avançado) ,poderia deveria implementar o respectivo tratamento, ou seja, se o arquivo não foi encontrado ou deu algum problema nele, o programa deveria informar isso... :)

 

ps: é preciso tratar esses monte de Warning também. Não sei direito, mas acho que não pode inserir 2 caracteres em algo que só cabe 1.

 

 

No aguardo.

 

 

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

@rodrigo springfield    no seu arquivo só tem a  palavra Inglaterra ?       

    você está usando o comando fgetc para ler no arquivo   e esse comando só pega uma letra por vez , mas creio que deveria pegar uma palavra inteira ,  então seria melhor usar o comando fscanf  que pega uma palavra  de cada vez   .

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

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!