terça-feira, 18 de março de 2008

Jogos e Programação: Classes


E ai Galera... mais uma postagem para vocês, no caso, uma republicação na integra de um postado no blog do Renê ( renedet.blogspot.com ). Todos os direitos reservados aos autores.
Aqui a postagem original.
Vamos ao que intereça..


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.

Nenhum comentário:

E ai galera, comentem as postagens... plz

Blog do Psico - Ultimas Postagens

Twig's Tech Tips

Nerdson não vai à escola

Site Inovação Tecnológica

Portal C++ - Diogo_RBG

Renê Dettenborn

Grupo de Usuários de Software Livre da UFT

VivoVerde