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:  
Ikkyy

C Saindo do Laço de Repeticacao

Recommended Posts

Fala pessoal, estou estudando Analise e Desenvolvimentos de Sistemas, comprei alguns cursos na internet na linguagem C/C++ pra praticar nas férias e aprender mais sobre a linguagem, inclusive tirei algumas duvidas sobre VisuALG aqui no fórum mesmo, onde o @Simon Viegas me ajudou bastante.

Depois te entender bem a lógica do portugol, passei pro C, numa ordem de aprendizado e como eu não gosto dessas questões que aparecem em sites pra treinar a linguagem, eu segui um dica de programar algo que eu goste, sou viciado em jogos, então estou desenvolvendo um sistema simples de rpg based text, apenas para aprendizagem...

 

Porém estou com um problema que não consigo identificar, estou uns 3 dias tentando resolver, antes de pedir ajuda.

 

Segue meu código completo:

 

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


// define estrutura da ficha do personagem
struct ficha {
    char nome[20];
    int forca;
    int habilidade;
    int vitalidade;
    int armadura;
    int vida;
    int level;
    int experiencia;
    };

struct ficha personagem[10];

    //cria o personagem
void criacao(){
        int forcatotal;
        while(forcatotal != 7){
            printf("Digite o nome do seu Personagem:");
            scanf("%s", &personagem[0].nome);
            printf(" voce tem 7 pontos para distribuir na ficha do seu personagem. \n As caracteristicas sao: Forca, Habilidade, Vitalidade e Armadura.\n Quantos pontos voce gostaria de por em Forca? :");
            scanf("%i", &personagem[0].forca);
            printf("em Habilidade?");
            scanf("%i", &personagem[0].habilidade);
            printf("em Vitalidade?");
            scanf("%i", &personagem[0].vitalidade);
            printf("em Armadura?");
            scanf("%i", &personagem[0].armadura);


            //soma os pontos para conferencia
            forcatotal = personagem[0].forca + personagem[0].habilidade + personagem[0].vitalidade + personagem[0].armadura;
            //checa se todos os pontos foram distribuidos
                if (forcatotal > 7){
                system("CLS");
                printf("voce gastou mais que 7 pontos, crie novamente o seu personagem[0].\n\n" );
                }
                if (forcatotal < 7){
                system("CLS");
                printf("voce gastou menos que 7 pontos, crie novamente o seu personagem[0].\n\n");
                }
                if (forcatotal == 7){
                system("CLS");
                printf("Personagem criado com sucesso.\n");
                    personagem[0].vida = personagem[0].vitalidade * 5;
                    personagem[0].experiencia = 0;
                    personagem[0].level = 1;
                    if (personagem[0].vida == 0){
                        personagem[0].vida = 1;
                    }

                    mostra();
                    system("pause");
                    system("CLS");
                }
            }
}

// mostra ficha do personagem
int mostra()
{
    printf("Nome do Personagem: %s \n", personagem[0].nome);
    printf("");
    printf("Forca: %i \n", personagem[0].forca);
    printf("Habilidade: %i \n", personagem[0].habilidade);
    printf("Vitalidade: %i \n", personagem[0].vitalidade);
    printf("Armadura: %i \n", personagem[0].armadura);
    printf("");
    printf("Pontos de Vida: %i \n", personagem[0].vida);
    printf("Pontos de Experiencia: %i \n", personagem[0].experiencia);
    system("pause");
    system("CLS");

    return 1;


}

// inimigos
int inimigos(){

    strcpy (personagem[0].nome, "Ikkyy");
    personagem[0].forca = 3;
    personagem[0].habilidade = 3;
    personagem[0].vitalidade = 1;
    personagem[0].armadura = 1;
    personagem[0].vida = personagem[0].vitalidade * 5;

    strcpy (personagem[1].nome, "Coelho Selvagem");
    personagem[1].forca = 1;
    personagem[1].habilidade = 2;
    personagem[1].vitalidade = 1;
    personagem[1].armadura = 1;
    personagem[1].vida = personagem[1].vitalidade * 5;

    strcpy (personagem[2].nome, "Goblin Sorrateiro");
    personagem[2].forca = 1;
    personagem[2].habilidade = 2;
    personagem[2].vitalidade = 1;
    personagem[2].armadura = 2;
    personagem[2].vida = personagem[2].vitalidade * 5;

    strcpy (personagem[3].nome, "Esqueleto Guerreiro");
    personagem[3].forca = 3;
    personagem[3].habilidade = 1;
    personagem[3].vitalidade = 2;
    personagem[3].armadura = 1;
    personagem[3].vida = personagem[2].vitalidade * 5;

    return 1;
}

int combate(){
    inimigos();

        // encontra o inimigo
        printf("\nVoce encontrou um %s \n", personagem[1].nome);
        printf("\n Deseja Atacar ou Correr?");
        printf("\n1- Atacar");
        printf("\n2- Correr\n");
        int decisão = 0;
        scanf("%i", &decisão);

        if (decisão == 1){

        // entra no laco sobre vida
        // personagem 1 x personagem 0


            do {
                int dado[6], i, x, y, dano, defesa;
                dado[0] = 0;                dado[1] = 0;                dado[2] = 0;                dado[3] = 0;                dado[4] = 0;                dado[5] = 0;
                x = 0;
                y = 0;

                printf("\nOs resultados dos dados de Habilidade foram:");
                for (i = 0; i < personagem[0].habilidade; i = i + 1){
                            srand((unsigned) time(NULL));
                            dado[i] = (rand() % 6) + 1;
                    //mostra os dados separados
                            printf(" %i", dado[i]);
                        }

               if (dado[0] >= 5|| dado[1] >= 5 || dado[2] >= 5 || dado[3] >= 5 || dado[4] >= 5 || dado[5] >= 5){


                printf("\nOs resultados dos dados de Ataque foram:");
                srand((unsigned) time(NULL));

                    // calcula os dados de ataque
                    for (i = 0; i < personagem[0].forca; i = i + 1){
                            dado[i] = (rand() % 6) + 1;
                    //mostra os dados separados
                            printf(" %i", dado[i]);
                            x = dado[i] + x;
                    }
                    // soma os dados
                            printf("\nA soma dos seus Dados de Ataque foi: %i", x);
                    // // calcula os dados de defesa
                            printf("\n Os resultados dos dados de Defesa foram:");
                            srand((unsigned) time(NULL));
                    // calcula os dados de defesa do inimigo
                    for (i = 0; i < personagem[1].armadura; i = i + 1){
                            dado[i] = (rand() % 6) + 1;
                            printf(" %i", dado[i]);
                            y = dado[i] + y;
                    }
                    // soma os dados
                            printf("\nA soma dos Dados de Defesa foi: %i", y);
                            dano = x - y;
                    // calcula diferenca entre ataque e defesa
                            printf("\n%s recebeu %i de dano", personagem[1].nome, dano);

                    // dano menor ou igual a zero, nao da dano
                    if(dano <= 0){
                            printf("\nVoce nao causou dano ao inimigo.");
                    // dano sendo maior que 0, calcula a vida restante.
                    }else{
                            personagem[1].vida = personagem[1].vida - dano;
                            // printf("\nVoce atacou ele com sua forca e deu %i de dano.", dano);
                            printf("\nAgora o %s tem %d de vida.", personagem[1].nome, personagem[1].vida);
                    }
                    // se defensor estiver sem vida, acabou.
                    if(personagem[1].vida <= 0){
                            printf("\nVoce derrotou %s \n", personagem[1].nome);
                            printf("\nVoce ganhou 5 pontos de experiencia.\n");
                            system("pause");
                            personagem[0].experiencia += 5;
                                if (personagem[0].experiencia >= 10) {
                                     experiencia();
                                }

                            system("CLS");
                            break;
                    }
               }else{
                printf("\n voce nao acertou o %s .\n", personagem[1].nome);
               }
                    // Defesa
                    x = 0;
                    y = 0;
                    dado[0] = 0;                dado[1] = 0;                dado[2] = 0;                dado[3] = 0;                dado[4] = 0;                dado[5] = 0;

                    printf("\nOs resultados dos dados de Habilidade foram:");
                    for (i = 0; i < personagem[1].habilidade; i = i + 1){
                                srand((unsigned) time(NULL));
                                dado[i] = (rand() % 6) + 1;
                    //mostra os dados separados
                                printf(" %i", dado[i]);
                     }

               if (dado[0] >= 5|| dado[1] >= 5 || dado[2] >= 5 || dado[3] >= 5 || dado[4] >= 5 || dado[5] >= 5){


                    printf("\nOs resultados dos dados de Ataque do %s foram:", personagem[1].nome);
                    srand((unsigned) time(NULL));
                            for (i = 0; i < personagem[1].forca; i = i + 1){
                                    dado[i] = (rand() % 6) + 1;
                                    printf(" %i", dado[i]);
                                    x = dado[i] + x;
                            }
                            printf("\nA soma dos Dados de Ataque do %s foi: %i", personagem[1].nome, x);

                            printf("\n Os resultados dos seus dados de Defesa foram:");
                            srand((unsigned) time(NULL));

                            for (i = 0; i < personagem[0].armadura; i = i + 1){
                                    dado[i] = (rand() % 6) + 1;
                                    printf(" %i", dado[i]);
                                    y = dado[i] + y;
                            }
                            printf("\nA soma dos Dados de Defesa foi: %i", y);
                                    dano = x - y;
                                    printf("\n%s recebeu %i de dano", personagem[0].nome, dano);


                            if(dano <= 0){
                                    printf("\nNao causou dano.");
                             }else{
                                    personagem[0].vida = personagem[0].vida - dano;
                            // printf("\nVoce atacou ele com sua forca e deu %i de dano.", dano);
                                    printf("\nAgora voce tem %d de vida.", personagem[0].vida);
                            }

                            if(personagem[0].vida <= 0){
                                    printf("\nVoce foi derrotado %s \n", personagem[0].nome);
                                    gameover();
                                    exit(0);
                            }
               }else{
               printf("\n %s nao te acertou.\n", personagem[1].nome);
               }
            }while (personagem[1].vida <= 0 || personagem[0].vida <= 0);

        }
}


int experiencia()
{
        system("CLS");
        personagem[0].experiencia = 0;
        printf("\nVoce subiu de level !!");
        printf("\nQual atributo voce gostaria de melhorar? !!");
        printf("\n 1- Forca?");
        printf("\n 2- Habilidade?");
        printf("\n 3- Vitalidade?");
        printf("\n 4- Armadura?");
        int decisao2 = 0;
        scanf("%i", &decisao2);

        if(decisao2 == 1){
            personagem[0].forca += 1;
            printf("\nVoce aumentou sua forca!");

        }
        if(decisao2 == 2){
            personagem[0].habilidade += 1;
            printf("\nVoce aumentou sua habilidade!");

        }
        if(decisao2 == 3){
            personagem[0].vitalidade += 1;
            personagem[0].vida += 5;
            printf("\nVoce aumentou sua Vitalidade. \n Pontos de Vida: +5!\n");

        }
        if(decisao2 == 4){
            personagem[0].armadura += 1;
            printf("\nVoce aumentou sua Armadura!");

         }
    return 1;
}



int gameover()
{
    printf("\n _____ _____ _____ _____    _____ _____ _____ _____ ");
    printf("\n|   __|  _  |     |   __|  |     |  |  |   __| __  |");
    printf("\n|  |  |     | | | |   __|  |  |  |  |  |   __|    -|");
    printf("\n|_____|__|__|_|_|_|_____|  |_____| ___/|_____|__|__|\n");

    return 0;
}

//sair do jogo
void sair()
{
    printf("Tchau !!\n");

}



int main() {
{
    int continuar = 1;

    do
    {

    // menu inicial
        printf("+++++++++++++++++++++++++++++++++++");
        printf("\n");
        printf("++++++++ Meu Poderoso RPG +++++++++");
        printf("\n");
        printf("++++++++ 1. Criar Personagem ++++++");
        printf("\n");
        printf("++++++++ 2. Ver Personagem ++++++++");
        printf("\n");
        printf("++++++++ 3. Jogar +++++++++++++++++");
        printf("\n");
        printf("++++++++ 0. Sair ++++++++++++++++++");
        printf("\n");
        printf("+++++++++++++++++++++++++++++++++++");
        printf("\n");

        scanf("%i", &continuar);
        system("CLS");

        switch(continuar)
        {
            case 1:
                criacao();
                break;
            case 2:
                mostra();
                break;
            case 3:
                combate();
                break;
            case 0:
                sair();
                break;

            default:
            printf("Digite uma opcao valida\n");
        }
    } while(continuar);
}

return 0;

}

 

Alguns valores já estão inseridos apenas para testes, para chegar no meu problema, Execute o código, aperta 3 para Jogar, nas situações que o Coelho Selvagem é derrotado, tá certo, o problema é no final dos testes de habilidade tanto do personagem[0] e do [1] , ele encerra o laço após e não volta no meu while/do.

 

Isso começou a acontecer depois que acrescentei o teste de habilidade no combate.

 

Se alguém puder me apontar o problema.

é bem provável que meu código pode ser muito aprimorado, mas não é o caso, quero aprender passo a passo sem pular etapas.

Obrigado pela atenção.

 

 

EDIT: Aproveitar pra tirar uma duvida, quando eu vou usar um valor random (rand) eu sempre preciso por o 
srand((unsigned) time(NULL));
ou ele só precisa ser lido uma vez durante a execução de um código?

 

Editado por Ikkyy
  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Ikkyy   o  

srand(time(NULL)); 

só precisa ser colocado uma vez logo após o

 int main()

e vai funcionar várias vezes para o 

rand()%numero;

seu código está funcionando bem não vi o erro .

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá @devair1010 , obrigado pela ajuda.

 

Então na imagem abaixo acontece um sucesso na primeira rodada do laço while/do

 

LB4YPp6.png

 

o problema é na hora de reiniciar esse laço:

 

uN75Cy0.png

 

como pode ver na imagem acima, o laço

}while (personagem[1].vida <= 0 || personagem[0].vida <= 0);

 

não foi atingido, afinal os valores estão maiores que 0.

 

esse laço normalmente reinicia lá pro começo do código, no DO, após eu adicionar uns testes extras, ele parou de funcionar como o planejado, não era pra sair do laço, afinal não foi atingido o valor para sair dele.

 

Consegui ver agora?

Editado por Ikkyy
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Ikkyy   se você quer que esse laço repita então os sinais no while estão ao contrário

}while (personagem[1].vida <= 0 || personagem[0].vida <= 0);

teria que ser assim :

system("pause");
}while (personagem[1].vida >= 0 || personagem[0].vida >= 0);

mas para ver o que está escrito você precisa colocar uma pausa na linha de cima desse while . 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@devair1010 O loco !! Estou tentando entender em que momento eu inverti isso !! pois funcionava antes hahaha..

 

Obrigado Devair ajudou pacas, eu nao ia reparar nisso, pois como funcionava antes, eu ignorava. !!

 

 

  • 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

×