Ir ao conteúdo

Posts recomendados

Postado

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?

 

  • Curtir 2
Postado

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?

  • Curtir 1
Postado

@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
Postado

@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

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!