Ir para conteúdo
Fórum Script Brasil
  • 0

AJUDA COM JOGO DA FORCA(DESESPERADO)


jpivieira

Pergunta

Galera, esse é um script de um jogo da forca com dois jogadores na linguagem C. Porém eu estou com um pequeno problema: o Jogador 2 tem 5 chances para acertar a palavra proposta pelo Jogador 1, porém o programa só está rodando 4 chances. Gostaria de saber se alguém pode identificar o erro e, se possível, me indicar uma solução. Desde já agradeço <3

 

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

int main(){
    char palavra[50], jogador1[50], jogador2[50], espaco[50]="-", erros[50]=" ", tamanho, tamanho2, letra[50], tentativa[50];
    int chances=5, caractere, caractere2=0, acertos=0, retorna;

         printf("Antes de começarmos, pedimos para que, caso não tenha lido as\n"
                "instruções na seção 'Como jogar', feche o programa, leia-as e,\n"
                "em seguida, volte para modo multiplayer. Caso já tenha lido, de-\n"
                "sejamos um bom jogo aos jogadores!\n\n"
                "Tecle 'v' para continuar...");
                while(getchar() != 'v');
                system("clear");

         printf("Digite o seu nome, Jogador 1: ");
         scanf("%s",&jogador1);
         printf("Digite o seu nome, Jogador 2: ");
         scanf("%s",&jogador2);
         system("clear");

         printf("Sejam bem vindos ao Jogo da Forca, %s e %s!!\n"
                "\nTecle 'v' para continuar...",jogador1, jogador2);
               while(getchar() != 'v');
               system("clear");

        printf("%s, digite a palavra para o/a %s acertar: ",jogador1, jogador2);
        scanf("%s",&palavra);
        system("clear");
///----------------------------------------------------------------------------------------------------------------------------------------------------
///----------A PARTIR DAQUI COMEÇA O CÓDIGO LÓGICO. OS CÓDIGOS ACIMA ERAM APENAS AS APRESENTAÇÕES E AS PRIMEIRAS ENTRADAS---------------------------------------------
///----------------------------------------------------------------------------------------------------------------------------------------------

///----------------------------------------------------------------------------------------------------------------------------------------------
///A FUNÇÃO STRLEN() É A RESPONSÁVEL PELOS TESTES PARA VER SE A LETRA DIGITADA PELO JOGADOR 2 ESTÁ NO VETOR 'PALAVRA'.
///CRIAMOS UMA VARIÁVEL 'TAMANHO' E IGUALAMOS ELA AO STRLEN(PALAVRA), ASSIM, OS TESTES SÓ IRÃO TERMINAR QUANDO A ÚLTIMA
///LETRA FOR TESTADA E ENQUANTO TODAS NÃO FOREM ACERTADAS

        for(caractere=0; caractere<strlen(palavra); caractere++)
             espaco[caractere] = '-';
             tamanho = strlen(palavra);

///-----------------------------------------------------------------------------------------------------------------------------------------------------
///AQUI COMEÇAMOS O LAÇO WHILE QUE VAI ATÉ O FINAL DO PROGRAMA. NO CASO, ELE É CONTROLADO PELO NÚMERO DE CHANCES QUE O JOGADOR 2
///AINDA TEM PARA ACERTAR A PALAVRA
///O PRIMEIRO PRINTF IMPRIME O VETOR 'ESPACO', CORRESPONDENTE AO NÚMERO DE LETRAS DIGITADAS PELO JOGADOR 1
///O SEGUNDO PRINTF PEDE PARA QUE O JOGADOR 2 DIGITE UMA LETRA, QUE POR SUA VEZ SERÁ TRABALHADA DENTRO DO LAÇO WHILE
///O TERCEIRO PRINTF É UMA ESPÉCIE DE VETOR, QUE POR SUA VEZ GUARDA E IMPRIME AS LETRAS INCORRETAS DIGITADAS PELO JOGADOR 2

             while(chances>0){

                   retorna=0;
                   printf("\n\tAinda restam: %d chances",chances);
                   if(chances<0){
                      system("clear");
                      printf("\n\tSuas chances acabaram");
                    }
                   printf("\n\tLetras digitadas: %s\n",erros);
                   printf("\n%s\n",espaco);
                   printf("%s, digite uma letra: ",jogador2);
                   scanf("%s",&letra);


///------------------------------------------------------------------------------------------------------------------------------------------------------
///ASSIM COMO NO PRIMEIRO FOR, NESTE ESTAMOS COMPARANDO A LETRA DIGITADA PELO JOGADOR 2 COM AS LETRAS PRESENTES NO VETOR PALAVRA, PORÉM
///CASO A LETRA ESTEJA DENTRO DO VETOR 'PALAVRA', ELA IRÁ SE ENCAIXAR NO VETOR 'ESPACO'.
///FIZEMOS COM QUE A VARIAVEL 'RETORNA' AUMENTE PARA QUE ASSIM, ELA não DIMINUA NO PROXIMO LAÇO

                   for(caractere=0; caractere<strlen(palavra); caractere++){
                       if(letra[0]==palavra[caractere]){
                          espaco[caractere] = palavra[caractere];
                            retorna++;
                            acertos++;
                       }
                   }

///-------------------------------------------------------------------------------------------------------------------------------------------------------
///--------------------------O IF A SEGUIR SO SERA REALIZADO CASO O PLAYER 2 ERRE A LETRA--------------------------------------------------------

///NESTE CASO, CASO O JOGADOR 1 ERRE A LETRA, A VARIAVEL 'CHANCES' IRÁ DIMINUIR E, CASO AINDA TENHA CHANCES, A LETRA DIGITADA
///VAI PARA O VETOR 'ERROS', CASO CONTRÁRIO ELE AINDA TERÁ UMA ÚLTIMA CHANCE DE ACERTAR A PALAVRA POR COMPLETO

              if(retorna==0 || (chances==5 || chances==4 || chances==3 || chances==2 || chances==1)){
                 chances--;
                  if(chances==0){
                       printf("\n%s, suas chances acabaram, mas agora você tem a chance\n"
                              "de acertar a palavra por completo, digite-a aqui: ",jogador2);
                       scanf("%s",&tentativa);
                       tamanho2 = strlen(tentativa);///AQUI CRIAMOS A VARIÁVEL 'TAMANHO2' PARA FAZER UM PONTE COM A PALAVRA ESCOLHIDA E A
                                                    ///TENTATIVA DE ACERTO POR PARTE DO JOGADOR 2
                       if(tamanho2==tamanho){
                           printf("\n%s, VOCÊ ACERTOU A PALAVRA!! VOCÊ VENCEU A RODADA!!!\n",jogador2);
                           printf("\nA palavra era: %s\n",palavra);
                        break;
                       }
                       else{
                           printf("\n\n%s, você errou a palavra. %s, VOCÊ VENCEU A RODADA!!!\n",jogador2, jogador1);
                           printf("\nA palavra correta era: %s\n",palavra);
                        break;
                       }

                 }

///---------------------O IF ABAIXO FOI FEITO PARA GUARDAR AS LETRAS JÁ DIGITADAS PELO JOGADOR 2--------------------------------------------------

                       else{
                            erros[caractere2] = letra[0];
                            caractere2++;
                       }
            }

///NO CASO ABAIXO, CASO AS LETRAS DIGITADAS E ACERTADAS FOREM DO MESMO TAMANHO QUE A VARIAVEL 'TAMANHO', IGUALADA À STRING 'PALAVRA'
///DIGITADA PELO JOGADOR 1, O PROGRAMA ACABA E IMPRIME O PRINTF ABAIXO

                    if(acertos==tamanho){
                       printf("PARABÉNS, %s, VOCÊ ACERTOU A PALAVRA. VOCÊ VENCEU A RODADA!!!\n", jogador2);
                       printf("\nA palavra era: %s\n",palavra);
                       break;
                    }
                    system("clear");
              }

///----------------------------------------------AQUI ACABA O LAÇO WHILE-------------------------------------------------------------------------------------

   return (0);
}

Editado por jpivieira
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Olhando o código concordo com o q a Mercia perguntou. Meio confuso o negócio ao q está parecendo.

Bem, vamos tentar resolver algumas coisas:

1º -> Respondendo sua pergunta:

Você está fazendo assim:

 if(retorna==0 || (chances==5 || chances==4 || chances==3 || chances==2 || chances==1)){
                 chances--;
                  if(chances==0){
                       printf("\n%s, suas chances acabaram, mas agora você tem a chance\n"
                              "de acertar a palavra por completo, digite-a aqui: ",jogador2);
                       scanf("%s",&tentativa);
                       tamanho2 = strlen(tentativa);

Experimenta decrementar a variável chances depois da verificação com o if, tipo:

 if(retorna==0 || (chances==5 || chances==4 || chances==3 || chances==2 || chances==1)){
                 
                  if(chances==0){
                       printf("\n%s, suas chances acabaram, mas agora você tem a chance\n"
                              "de acertar a palavra por completo, digite-a aqui: ",jogador2);
                       scanf("%s",&tentativa);
					   chances--;
                       tamanho2 = strlen(tentativa);

Daí vê se resolve a questão.

2º -> A mameira como você está verificando se a letra está correta ou seria assim:

for(caractere=0; caractere<strlen(palavra); caractere++)
{
    if(palavra[caractere] == letra)
    {
    	espaco[caractere] = letra;
    	retorna++;
    	acertos++;
    }
}

3º -> Nessa parte onde você pede a letra muda para isso:

char letra;

printf("%s, digite uma letra: ",jogador2);
scanf("%c", &letra);

Assim, na verificação se a letra está correta, o forma como passei deve funcionar

4º -> Outro ponto: Você declarou o nome dos jogadores como uma String. Então para captudar os nomes recomendo fazer assim:

printf("Digite o seu nome, Jogador 1: ");
scanf("%s", jogador1);
printf("Digite o seu nome, Jogador 2: ");
scanf("%s", jogador2);

5º -> Em tentativas, caso sua intenção é q o jogador digite a palavra toda, a mesma coisa:

printf("\n%s, suas chances acabaram, mas agora você tem a chance\n"
       "de acertar a palavra por completo, digite-a aqui: ",jogador2);
scanf("%s", tentativa);

6º -> Você está fazendo várias entradas de dados, por isso é recomendável que, depois da leitura de cada dado você faça algo assim:

char *limpar;

printf("Digite o seu nome, Jogador 1: ");
scanf("%s",&jogador1);
scanf("%c", &limpar); /* Essa linha é ignorada pelo compilador, serve apenas para limpar o buffer de entrada. O mesmo é recomendável fazer depois de cada 						   entrada de dados */
printf("Digite o seu nome, Jogador 2: ");
scanf("%s",&jogador2);
scanf("%c", &limpar);
         
system("clear"); /* Sinceramente não conheço esse comando, então não sei dizer arespeito de sua eficácia. Sei q a maneira como costumo fazer é como 						citada acima */

Essas seriam algumas formas d tornar seu código melhor. 

Mas, sendo sincero, continuo fazendo a mesma pergunta: Os 2 Jogadores jogam simultaneamente?

Se puder explicar de maneira mais detalhada seu código a gente agradece, ok?

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,8k
×
×
  • Criar Novo...