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.
- Crie o arquivo
batalha_rpg.cna pastasrc/:
#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
- Abra o terminal integrado.
- Compile:
gcc batalha_rpg.c -o batalha_rpg - Execute:
./batalha_rpg - 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)