Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
rodrigo springfield

C Problema jogo da forca

Recommended Posts

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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
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

Compartilhar este post


Link para o post
Compartilhar em outros sites

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 2

Compartilhar este post


Link para o post
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   .

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações 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

×