Capítulo 15: Projeto Prático - Sistema de Batalha RPG ⚔️🔮

Parabéns por chegar até aqui! Neste capítulo, vamos juntar tudo o que aprendemos (Variáveis, Condicionais, Repetição, Funções e Structs) para criar um Sistema de Batalha de RPG em Turnos, com o tema Final Fantasy!


📖 O que vamos construir?

Um pequeno jogo onde o jogador (Guerreiro) enfrenta um monstro (Dragão) em turnos. Cada um pode atacar, e o jogo termina quando a vida de um deles chega a zero!


📖 Exemplo Guiado: O Código do Jogo

Vamos criar a estrutura do jogo usando structs e funções para organizar o código.

  1. Crie o arquivo batalha_rpg.c na pasta src/:
#include <stdio.h>
#include <string.h>
 
// Estrutura para os personagens
struct Personagem {
    char nome[20];
    int vida;
    int ataque;
};
 
// Função para realizar o ataque
void atacar(struct Personagem *atacante, struct Personagem *defensor) {
    printf("%s atacou %s!\n", atacante->nome, defensor->nome);
    defensor->vida -= atacante->ataque;
    if (defensor->vida < 0) defensor->vida = 0;
    printf("%s ficou com %d de vida.\n\n", defensor->nome, defensor->vida);
}
 
int main() {
    struct Personagem jogador;
    struct Personagem monstro;
    int turno = 1;
    int acao;
 
    // Inicializando o Jogador
    strcpy(jogador.nome, "Cloud");
    jogador.vida = 100;
    jogador.ataque = 20;
 
    // Inicializando o Monstro
    strcpy(monstro.nome, "Sephiroth");
    monstro.vida = 80;
    monstro.ataque = 25;
 
    printf("=== BATALHA INICIADA ===\n");
    printf("%s vs %s\n\n", jogador.nome, monstro.nome);
 
    // Loop de Batalha
    while (jogador.vida > 0 && monstro.vida > 0) {
        printf("--- Turno %d ---\n", turno);
        printf("Sua vez! Deseja [1] Atacar ou [2] Fugir? ");
        scanf("%d", &acao);
 
        if (acao == 1) {
            atacar(&jogador, &monstro); // Jogador ataca monstro
            
            if (monstro.vida > 0) {
                atacar(&monstro, &jogador); // Monstro contra-ataca
            }
        } else {
            printf("Voce fugiu da batalha! Fim de jogo.\n");
            break;
        }
        turno++;
    }
 
    // Resultado
    if (jogador.vida <= 0) {
        printf("💀 Voce foi derrotado por %s...\n", monstro.nome);
    } else if (monstro.vida <= 0) {
        printf("🏆 Parabens! Voce derrotou %s!\n", monstro.nome);
    }
 
    return 0;
}

🕹️ Como Executar e Testar no VS Code

  1. Abra o terminal integrado.
  2. Compile: gcc batalha_rpg.c -o batalha_rpg
  3. Execute: ./batalha_rpg
  4. Jogue escolhendo a opção 1!

📊 Ilustração Visual: Fluxo da Batalha

Veja como os turnos funcionam no loop:

graph TD
    A[Início do Turno] --> B{Jogador escolhe Ação}
    B -->|1. Atacar| C[Jogador ataca Monstro]
    B -->|2. Fugir| D[Fim de Jogo]
    C --> E{Monstro ainda vivo?}
    E -->|Sim| F[Monstro ataca Jogador]
    E -->|Não| G[Vitória!]
    F --> H{Jogador ainda vivo?}
    H -->|Sim| A
    H -->|Não| I[Derrota!]

🛠️ Prática Obrigatória 1: Adicionando Magia

Adicione uma opção número [3] Usar Magia no menu de ações. A magia deve causar um dano maior (ex: 40), mas só pode ser usada uma vez! (Dica: use uma variável de controle do tipo int usou_magia = 0;).


🔑 Gabarito de Código

Prática 1: Fragmento do código com Magia

    // Dentro da main...
    int usou_magia = 0;
 
    // Dentro do loop while...
    printf("Sua vez! Deseja [1] Atacar, [2] Fugir ou [3] Usar Magia? ");
    scanf("%d", &acao);
 
    if (acao == 1) {
        atacar(&jogador, &monstro);
        // ... contra-ataque
    } else if (acao == 3) {
        if (usou_magia == 0) {
            printf("%s usou Magia Firaga em %s!\n", jogador.nome, monstro.nome);
            monstro.vida -= 40;
            if (monstro.vida < 0) monstro.vida = 0;
            printf("%s ficou com %d de vida.\n\n", monstro.nome, monstro.vida);
            usou_magia = 1; // Não pode mais usar
            
            if (monstro.vida > 0) {
                atacar(&monstro, &jogador);
            }
        } else {
            printf("Voce ja usou sua magia nesta batalha!\n\n");
        }
    } else {
        // Fugir
    }

📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

(Siga o padrão estabelecido no Guia)


Capitulo Anterior | Proximo Capitulo