Simulador de mestre de jogo de RPG

Já imaginou montar seu próprio jogo de RPG utilizando conceitos básicos da linguagem C de programação? E além disso ser o mestre de seu próprio jogo?

Rpg

Você irá aprender tudo isso neste tutorial de como fazer seu próprio Simulador! Deixando que a sorte guie seus aventureiros durante as batalhas enfrentadas nos cenários e situações criadas por você mesmo!

 

Índice

  •  Versão 1.
    • Primeiro Passo – Criação do Personagem
      • 1.1 Escolha do nome
      • 1.2 Escolha da Classe
      • 1.3 Distribuição dos pontos de habilidades
    • Segundo Passo – Descrevendo ambientes
    • Terceiro Passo – Fazendo escolha de rotas e de interações
    • Quarto Passo – Rolando dados
    • Quinto Passo – Combate
  • Versão 2 – Utilizando Arquivos
    •  Primeiro Passo – Criando Arquivos
    •  Segundo Passo – Lendo Arquivos
    •  Terceiro Passo – Abrindo os Arquivos

 

Versão 1. Primeiro Passo – Criação do Personagem

Como primeiro passo, teremos a iniciação do personagem cujo qual será inserido na história a ser narrada pelo Simulador de Mestre. Será necessário fazer um menu inicial de interação nesse caso, onde será pedido ao usuário que entre com o nome do personagem, seguido da escolha de uma das classes disponíveis: Guerreiro ou Mago e logo após, serão distribuídos os pontos de habilidades, que serão diferentes para cada uma das classes.

Escolha do nome

Aqui faremos com que o jogador escolha o nome de seu personagem. Armazenaremos seu nome em uma variável do tipo char como mostrado abaixo:

   char nome[30];
   printf("Qual é seu nome aventureiro? \n");
   scanf("%s", &nome);

Lembre-se que você tem a liberdade de escrever os textos de seu gosto dentro da função “printf”, então, crie-as ao seu critério!

Escolha da Classe

Aqui faremos com que o jogador escolha sua classe. Você sempre possui a liberdade de que forma abordar o jogador através dos textos dentro dos “printf”. Faça com que ele escolha através de um breve menu, armazenando essa escolha em uma variável para que possamos utilizá-la sempre que quisermos levar em conta a classe do jogador.

   int classe;
   printf("Seja bem vindo %s às catacumbas do Imperador Dragão\n", nome);
   printf("Escolha sua classe %s: \n 1. Guerreiro\n 2. Mago\n", nome);
   scanf("%d", &classe);

Distribuição dos pontos de habilidades

Agora iremos fazer com que o jogador distribua seus pontos de habilidade de acordo com a classe escolhida. Como o código mostrado aqui é apenas um exemplo, coloquei apenas 5 pontos para serem distribuídos entre as habilidades mais marcantes para cada uma das classes:

      int forca, armadura, destreza, poder_habilidade, pen_magica, hp = 10;
      char escolha_classe[20];

Antes de tudo, deveremos criar variáveis para armazenar cada uma das habilidades que iremos utilizar como feito no trecho de código acima.

      if(classe==1){
              escolha_classe[20] = "Guerreiro";
              printf("\nVocê selecionou a classe dos Guerreiros, fortes, resistentes e agressivos.\n");
              printf("nAtribua com sabedoria seus pontos de habilidade.\nVocê tem apenas 5 pontos para distribuir: \n");
              do{
               printf("Digite os pontos de força, destreza e armadura respectivamente:\n");
               scanf("%d%d%d",&forca, &armadura, &destreza);
                   if (forca+armadura+destreza>5)
                       printf("\nVocê não possui pontos suficientes para essa distuibuição.\n");
              }while(forca+armadura+destreza>5);
              }
      else{
           escolha_classe[20] = "Mago";
           printf("\nVocê selecionou a classe dos Magos. Sábios, misteriosos e  misticos.\n");
           printf("nAtribua com sabedoria seus pontos de habilidade.\nVocê tem apenas 5 pontos para distribuir: \n");
           do{
               printf("Digite os pontos de poder de habilidade, armadura e penetração mágica respectivamente:\n");
               scanf("%d%d%d",&poder_habilidade, &armadura, &pen_magica);
                   if (poder_habilidade+armadura+pen_magica>5)
                       printf("\nVocê não possui pontos suficientes para essa distuibuição.\nTente novamente:\n");
           }while(poder_habilidade+armadura+pen_magica>5);
           }

` O laço “do while” deve ser feito para que os pontos de habilidade distribuídos não ultrapassem o limite estipulado pelo mestre.

 

Segundo Passo – Descrevendo ambientes

Você poderá a todo momento utilizar da função “printf” para descrever os cenários nos quais o personagem se encontra. Seja criativo, fale do cheiro, da luminosidade, do clima, das características das paredes, dos objetos no chão. Todo essa atmosfera criada pelos textos incrementam muito mais seu Simulador de mestre de RPG.

Exemplo:

  printf("Você enfim adentra as catacumbas.\n As lendas que contaram daquele lugar seriam verdadeiras?\n
  A atmosfera é sombria. O vento sopra como assobios de alguma entrada que vem das profundezas daquela escuridão\n");

 

Terceiro Passo – Fazendo escolha de rotas e de interações

Agora iremos fazer com que o personagem faça a escolha das rotas desejadas pelo mesmo. Faremos isso de uma forma bem simples, descreveremos as escolhas possíveis para aquele cenário em forma de um menu, depois leremos a escolha dele e armazenaremos em uma variável. Logo após, faremos lações de “if else” para descrevermos os lugares decorrentes das escolhas dos mesmos.

  int escolha_rota_1, voltar;
  printf("Você está na entrada das catacumbas, o cheiro forte está em todo lugar.\n No meio da escuridão você percebe que há
  dois caminhos. Um para a direita e outro para a esquerda.\n");
   do{
      printf("Qual camiho deseja seguir:\n1- DIREITA\n2-ESQUERDA\n");
      scanf("%d",&escolha_rota_1);
          if(escolha_rota_1==1){
             printf("\nVocê escolhe o caminho da direita.\nLogo ao entrar percebe que está muito escuro.\n
                      Dando passos bem curtos e cautelosos você procura por algo ao seu alcance.\n");
             printf("Deseja voltar?\n1- Sim\n2-Não\n\n");
             scanf("%d",&voltar);
         }
         else{
            printf("Voce escolheu o caminho da esquerda\n Logo ao entrar você se depara com um orc morto no chão. 
                    O lugar parece nao ter saida, ");
            printf("Deseja voltar?\n1- Sim\n2-Não\n\n");
            scanf("%d",&voltar);
         }
     }while(voltar==1);

Utilizamos o “do while” junto a uma variável “voltar” e armazenaremos nela a escolha feita pelo jogador caso queira voltar. O laço fará que o jogador volte a opção anterior caso deseje voltar.

 

Quarto Passo – Rolando dados

Para que os dados sejam rolados, criaremos sempre circunstâncias para isso, por exemplo: Um orc irá te atacar, role um dado para tentar esquivar. Iremos utilizar o seguinte sistema para a análise dos resultados:

Se o número rolado for 0 ou 1, o personagem terá tirado falha crítica, ou seja, o que tiver de pior para acontecer, acontecerá. Em caso de investigação de ambientes, provavelmente encontrará um inimigo ou algo que prejudique sua aventura.

Se o número rolado for entre 2 e 5, o personagem não alcançará sucesso em sua tentativa, porém não sofrerá represália após a rolagem. Em caso de investigação de ambientes, não encontrará nada útil.

Se o número rolado for entre 6 e 10, o personagem alcançará sucesso em sua tentativa, ou no caso de investigação de ambientes, ele irá encontrar algo bem útil para sua aventura.

Para fazer esse sorteio em seu código, utilizaremos da função “srand” como mostrado abaixo:

       char rolar_dado[10];
       int numero_sortido1;

Aqui serão criados as variáveis para armazenar o comando de rolagem do dado e para armazenar o número sorteado respectivamente.

       printf("Você opta por investigar o saguão. Será rolado um dado de sorte para saber seu destino.\n
               Digite um comando para rolar o dado:\n");
       scanf("%s",&rolar_dado);
       srand(time(NULL));
       numero_sortido1=(rand() % 10);
       printf("\n%d\n", numero_sortido1);
       if(numero_sortido1<2){
          printf("Seu personagem pisou em um osso seco no chão e o barulho atraiu um orc que passava por ali perto\n");
       }
       else if(numero_sortido1<6){
          printf("Você não encontrou nada em sua busca\n");
       }
       else{
          printf("Você encontrou uma poção de restaurar H.P.");
          pot_hp = pot_hp + 1;
      
       }

No caso a variável pot_hp corresponde a variável criada no começo do código, e diz respeito a quantidade e de poções para recuperação de vida perdida no decorrer da aventura. Corresponde ao mestre escolher com quantas poções o aventureiro irá começar.

As poções somente serão usadas durante o combate caso seus pontos de vida se aproximem de 0;

 

Quinto Passo – Combate

Para realizar o combate, usaremos sempre do passo acima, onde foi ensinado como sortear um numero aleatoriamente. Antes de tudo, devemos criar uma “ficha” para o inimigo. De forma bem simples, criaremos variáveis para sua força e pontos de vida.

  int orc_forca = 5;
  int orc_hp = 2;

Usaremos esses atributos como parâmetro durante o combate. Veremos agora como será o decorrer do confronto.

  int escolha_confronto, tentar_novamente;
  printf("Você acaba de se deparar com o orc, que te acaba por te encurralar junto a parede.\n Ele é bem maior que você, seus 
         músculos enormes suados cheiram como um cadáver em estado de putrefação. Ele segura um machado de duas mãos.\n O orc
         diz algumas palavras em sua língua nativa, porem você as interpreta como VOCÊ MORRE AQUI!\n");
  do{
     printf("O que você deseja fazer?\n 1-Atacá-lo.");
     scanf("%d",&escolha_confronto);
     if(escolha confronto==1){
        printf("Role o dado para tentar ataca-lo\n");
        scanf("%s",&rolar_dado);
        srand(time(NULL));
        numero_sortido1=(rand() % 10);
        printf("%d\n", numero_sortido1);
        if(numero_sortido1<2){
           printf("Você se apavora ao tentar ataca-lo e acaba escorregando ao fazer o movimento e bate a cabeça no chão.\n");
           hp--;
        }
        else if(numero_sortido1<6){
           printf("Você tenta acertá-lo, porem o orc se esquiva de seu golpe"\n);
        }
        else{
           printf("Você o acerta em cheio! Belo golpe!!!!\n");
           if(classe==1)
           orc_hp = orc_hp - (forca +(destreza-1));
           else
           orc_hp =  orc_hp - (poder habilidade + (pen_magica-1));
        }
        //AGORA SERÁ A VEZ DO ORC ATACAR!!!!!!
        printf("O orc prepara o machado para te atacar! prepare-se!");
        srand(time(NULL));
        numero_sortido1=(rand() % 10);
        if(numero_sortido1<6){
           printf("O orc grita ferozmente e tenta acertá-lo, porém por pouco você desvia!\n");
        else{
           printf("O orc lhe acerta o machado em cheio! Você vê sangue voando para todo lado!\n");
           hp = hp - (orc_forca-armadura);
        
   }while(orc_hp>0||hp>0);
       if(orc_hp==0)
          printf("Você acerta o golpe bem no meio dos olhos do orc. Sangue escorre pelo chão. O grande e asqueroso monstro 
                  está morto agora\n");
       if(hp==0)
          printf("O orc lhe acertou o machado bem em seu pescoço. O sangue e a força da contusão o impede de dizer suas
                 ultimas palavras. Você está morto.");

 

Versão 2 – Utilizando Arquivos

Nessa versão, deixaremos com que as situações resultantes sejam inseridas em arquivos de textos externos ao código, cujos quais serão lidos e analisados durante a execução do problema, o que pode resultar em uma interação mais fácil e pratica entre jogadores, sendo que para que se mude a historia, basta apenas que se altere as frases dos arquivos.

 

Primeiro Passo – Criando Arquivos

Nesse passo criaremos dentro do diretório C: de nosso computador, uma pasta com o nome RPG, dentro da mesma, teremos duas pastas: Ambientes e NPC. A pasta “Ambientes” irá conter os arquivos relacionados aos lugares que o personagem passará durante a aventura e a pasta “NPC” irá conter as ações dos inimigos e aliados que encontrar no decorrer da aventura.

Rpg_1 Rpg_2

Dentro das pastas, iremos criar arquivos do tipo “.txt”, e dentro deles iremos colocar as possíveis fala de interação entre cenário/jogador ou npc/jogador.

Vamos seguir as seguintes regras, como sabemos do tópico de “Rolando Dados”, temos: Se o número rolado for 0 ou 1, o personagem terá tirado falha crítica, ou seja, o que tiver de pior para acontecer, acontecerá. Em caso de investigação de ambientes, provavelmente encontrará um inimigo ou algo que prejudique sua aventura. Esse caso será correspondente ao texto da primeira linha do arquivo.

Se o número rolado for entre 2 e 5, o personagem não alcançará sucesso em sua tentativa, porém não sofrerá represália após a rolagem. Em caso de investigação de ambientes, não encontrará nada útil. Esse caso será correspondente ao texto da segunda linha do arquivo.

Se o número rolado for entre 6 e 10, o personagem alcançará sucesso em sua tentativa, ou no caso de investigação de ambientes, ele irá encontrar algo bem útil para sua aventura. Esse caso será correspondente ao texto da terceira linha do arquivo.

Rpg_3

Rpg_4

Não iremos saltar linhas entre as frases escritas no arquivo. Lembre-se que a linha é contada apenas depois do “enter”.

Para mostrar corretamente os acentos veja Gerador_de_lero-lero#Exibir_acentos_em_C.

 

 

Segundo Passo – Lendo Arquivos

Para lermos o arquivo de nosso desejo no código, devemos criar uma variável para estipular o caminho a ser seguido. O restante do trecho do código irá fazer com que o computador abra o arquivo e o leia até o fim do mesmo. Para verificar o processo do trecho de código a seguir veja:Sorteador_de_Horóscopo#Sexto_Passo_-_Leitura_das_frases.

  char caminho_1[100] = "C:\\RPG\\Ambientes\\saguao_1.txt";
  FILE *txt;
  txt = fopen(caminho_1, "r");
  char *linhas[100];
  char buffer[1000] = "";
  int count = 0;
  while (! feof(txt) ) {
  	if( fgets(buffer, 1000, txt) != NULL) {
  	      linhas[count] = strdup(buffer);
  	      count++;
  	}
  }
  fclose(txt);

 

 

Terceiro Passo – Abrindo os Arquivos

Como dito no primeiro passo, nessa versão utilizaremos as frases dos arquivos para representar as interações com os cenários e outros npc’s da aventura. Seguindo isso, o trecho de código abaixo irá demonstrar como será selecionada a frase de acordo com o número sorteado pelo dado.

  if(escolha_rota_1==1){
       printf("Será rolado um dado de sorte para saber seu destino.\nDigite um comando qualquer para rolar o dado:\n");
       scanf("%d",&rolar_dado);
       srand(time(NULL));
       numero_sortido1=(rand() % 10);
       printf("\n%d\n", numero_sortido1);

Até aqui é exatamente o mesmo passo realizado pela versão simples do simulador.

       if(numero_sortido1<2){
         if(count > 0) {
		  fputs(linhas[0], stdout);
        }
       }
      else if(numero_sortido1<6){
        if(count > 0) {
		  fputs(linhas[1], stdout);
        }
       }
       else {
            if(count > 0) {
		  fputs(linhas[2], stdout); 
        }
       }
       }

No trecho acima, iremos ler e mostrar na tela a linha do arquivo correspondente a situação do numero sorteado pelo jogador. Lembre-se de que a primeira linha do arquivo é a linha 0, a segunda linha do arquivo é a linha 1 e assim por diante.

Podemos utilizar os arquivos para a interação dos NPC’s, porém devemos criar uma variável diferente do tipo char e atribuir o caminho para chegar até o arquivo do npc que desejamos. Veja por exemplo:

  char caminho_2[100] = "C:\\RPG\\NPC\\orc_1.txt"

O restante é a mesma coisa do exemplo citado anteriormente. Agora é só implementar no restante do código e você terá sua Versao 2 do Simulador de Mestre de RPG!