segunda-feira, 17 de março de 2008

Jogos e Programação: Classes

Este artigo originou a partir de uma conversa que tive com DiogoRBG, para descobrir como funciona uma luta entre dois personagens, na visão de um programador.

Lembrando que podem existir muitas variações nas fórmulas, isto devido aos parâmetros que serão utilizados.

Podemos começar pela classe Personagem:

class Personagem{
int energia; //energia vital
int força; //pontos de ataque
int defesa; //pontos de defesa
int sorte; //valor que influi no ataque e na defesa

function atacar(Personagem * oponente){
oponente->energia = oponente->energia -
( (this->força * (rand()%this->sorte)) /
(oponente->defesa + (rand()%oponente->sorte)) );
}
}


Exemplo:

Instância dos personagens

Personagem * Guerreiro;
Personagem * Arqueiro;


Definindo os valores das propriedades

Guerreiro->energia = 200;
Guerreiro->força = 150;
Guerreiro->defesa = 130;
Guerreiro->sorte = 10;

Arqueiro->energia = 100;
Arqueiro->força = 100;
Arqueiro->defesa = 50;
Arqueiro->sorte = 80;


Atacar!!!

Guerreiro->atacar(Arqueiro);


Analisando minunciosamente a execução da função atacar, temos:

oponente->energia = oponente->energia -
( (this->força * (rand()%this->sorte)) /
(oponente->defesa + (rand()%oponente->sorte)) );


Que transformou-se em:

Arqueiro->energia = Arqueiro->energia -
( (Guerreiro->força * (rand()%Guerreiro->sorte)) /
(Arqueiro->defesa + (rand()%Arqueiro->sorte)) );


Substituindo os valores:

Arqueiro->energia = 100 - ( (150 * (rand()%10)) /
(50 + (rand()%80)) );


De uma maneira mais prática podemos ter esta visão:

Defesa do Arqueiro com Máxima Sorte, se o valor de retorno (rand()%10) for igual 5 e (rand()%80) for igual 80 temos:

Arqueiro->energia = 100 - ( (150 * 5) / (50 + 80) );
Arqueiro->energia = 100 - ( 750 / 130 );
Arqueiro->energia = 100 - 6; //arredondando 5,7 vai pra 6
Arqueiro->energia = 94;


Defesa do Arqueiro Sem Sorte, se o valor de retorno (rand()%10) for igual 10, (rand()%80) for igual 0 temos:

Arqueiro->energia = 100 - ( (150 * 10) / (50 + 0) );
Arqueiro->energia = 100 - ( 1500 / 50 );
Arqueiro->energia = 100 - 30;
Arqueiro->energia = 70;


Observações:
1) rand() está no cabeçalho stdlib.h, a função retorna um valor randômico entre 0 e 1.
2) A classe Personagem está fora da padronização, onde uma instância altera o valor da outra instância de forma direta.
3) O Arqueiro pode parecer fraco, mas número máximo de pontos de ataque do Guerreiro é 1500 e de defesa 140, já do Arqueiro ataque é 8000 e defesa 130. Verifique mais informações nestaTabela.

Para entender melhor será necessário jogar Final Fantasy Tatics, ou Vandal Hearts ou outro RPG.

Um comentário:

Diogo_RBG disse...

Blz Renê !

Vc pegou a formula muito rápido ! Jogo Travian a algum tempo e ainda não sei como funciona o sistema de ataque !

Gostei da planilha on-line... (Ctrl+C)