This Page

has been moved to new address

Rolador de Dados em PHP

Sorry for inconvenience...

Redirection provided by Blogger to WordPress Migration Service
Giba Net: Rolador de Dados em PHP

sábado, 22 de maio de 2010

Rolador de Dados em PHP

*Por: Bruno Carnaes


Hoje a idéia é desenvolver um algoritmo que simule o lançamento de dados. Apenas como curiosidade, este algoritmo irá simular o lançamento de dados de 10 (dez) faces, frequentemente utilizado por jogos específicos como o famoso RPG.

Esse lançamento de dados serve para qualificar e quantificar o quanto uma ação dos jogadores foi bem sucedida. Para tanto, um valor é atribuído de forma a quantificar o nível de dificuldade para se realizar uma determinada ação, enquanto a soma de competências em forma de atributos compõe o montante de dados a serem lançados.

Exemplo: Para se equilibrar sobre a conhecida corda-bamba, utiliza-se as competências conhecidas como Destreza e Esportes. Vamos supor que no caso o personagem tenha um valor 3 em Destreza e 2 em Esportes, sendo assim, teria o montante de 5 dados (Destreza + Esportes) para tentar realizar a ação de se equilibrar na corda bamba. Devido a dificuldade de permanecer em pé na corda, a dificuldade é definida com um valor de 8, ou seja, para ser bem sucedido, o jogador precisa obter números iguais ou maiores do que 8 nos dados que lançou.

Antes de começar a montar o algoritmo de fato, desenvolvi um fluxograma para ajudar a visualizar as etapadas do processo como um todo na hora de implementar a solução. Utilizei a linguagem PHP para programar e o WebServer Wamp para interpretar o código durante o desenvolvimento.



Tentei simplificar o máximo que pude para desenvolver uma solução para o problema proposto, para isso utilizei o conceito de funções e recursividade (método de programação utilizado onde uma função pode chamar a si mesma). Para a entrada de dados, utilizei as ferramentas do próprio HTML desenvolvida para a manipulação de formulários.

De forma a evitar Warnings gerados pelo PHP devido a variáveis não declaradas (sem valores associados antes do primeiro envio do formulário, utilizei a função isset(), por exemplo:


if( isset( $_POST['flagBusca'] )) $flagBusca = $_POST[ 'flagBusca' ]; else $flagBusca = 0;
if( isset( $_POST['nDados'] )) $nDados = $_POST[ 'nDados' ]; else $nDados = 0;
if( isset( $_POST['dificuldade'] )) $dificuldade = $_POST[ 'dificuldade' ]; else $dificuldade = 6;
if( isset( $_POST['explode'] )) $explode = $_POST[ 'explode' ]; else $explode = 0;

Onde:
- $flagBusca: flag para identificar se o formulário foi enviado;
- $nDados: total de dados a serem lançados;
- $dificuldade: dificuldade estipulada para a ação desejada;
- $explode: fator de sorte do jogo, caso seja utilizado, os dados com valor 10 são relançados.

Para armazenar os valores obtidos com o lançamento dos dados para interpreta-los posteriormente, utilizei um vetor associativo denominado $rolagem, como segue:

$rolagem = array();
$rolagem[nSucesso] = 0;
$rolagem[nFalha] = 0;
$rolagem[n10] = 0;
$rolagem[total] = 0

Onde:
- nSucesso: total de resultados obtidos iguais ou maiores a dificuldade definida;
- nFalha: total de números "1" obtidos nos dados. Equivale ao fator azar do jogo e cancela um sucesso (valor igual ou maior a dificuldade);
- n10: total de números "10" obtidos, caso o fator sorte (explosão do 10) estiver marcado, relança esses dados;
- total: nSucesso - nFalha.

Decidi postar o trecho de código referente ao formulário por questões didáticas, claro que para isso temos que arcar com a poluição visual gerada... =P

HTML - Formulario

nDados:
" size="3" maxlength="2">
Dificuldade:

Explosão do 10








Chamada da função no corpo HTML
if( $flagBusca == 1 ) {
if( $nDados != 0 ) {
echo "
";
$rolagem = rola_dado( $nDados );
echo "
";
echo "
Dificuldade: $dificuldade";
if( $rolagem[total] > 0 )
echo "

Resultado: $rolagem[total] sucesso(s).";
else
if( $rolagem[total] == 0 )
echo "

Resultado: Falha.";
else
echo "

Resultado: Falha Crítica.";
}
else
echo "

Total de dados deve ser diferente de 0.";
}


No trecho acima, a função rola_dado() só é chamada caso o formulário tenha sido enviado e o número de dados a serem lançados seja diferente de zero. Após a execução da função, o resultado é analisado, onde:
- Sucesso: a ação foi bem sucedida;
- Falha: a ação falhou;
- Falha Crítica: o número de "1" obtidos foi maior do que o número de sucessos, ou seja, Murphy estava de olho na ação do seu personagem =P.

E finalmente, a função rola_dado():

rola_dado()
function rola_dado( $nDados ) {
global $rolagem;
global $dificuldade;
global $explode;
$rolagem[n10] = 0;
for( $i=0; $i<$nDados; $i++ ) { $num = rand( 1, 10 ); if( $num >= $dificuldade )
$rolagem[nSucesso]++;
if( $num == 10 )
$rolagem[n10]++;
if( $num == 1 )
$rolagem[nFalha]++;
echo "[$num] ";
}
if( $explode == 1 ) {
while( $rolagem[n10] != 0 ) {
echo "

Explodindo $rolagem[n10] dado(s)...
";
rola_dado( $rolagem[n10] );
}
}
$rolagem[total] = $rolagem[nSucesso] - $rolagem[nFalha];
return $rolagem;
}


Tudo fica mais fácil se ao ler o código da função acima, você estiver com o fluxograma aberto, acredite... =P

Logo no início, onde temos a declaração das variáveis $rolagem, $dificuldade e $explode, a palavra global que as antecede define que a variável utilizada é a mesma definida no começo do código, em um escopo global. Sendo assim, não é necessário passar esses valores para a função na forma de parâmetros.

A chave para o funcionamento desse simulador de dados está na linha:
$num = rand( 1, 10 );

Onde um valor aleatório compreendido no intervalo entre 1 e 10 é associado a variável $num através da função rand() executada dentro de um laço até que todos os dados tenham sido lançados.

Para cada iteração do laço, o valor de $num é comparado com alguns parametros e então as respectivas variáveis de controle são incrementadas.

Caso a opção de explosão do 10 (descrita acima) esteja marcada e um número de resultados "10" obtidos seja maior do que zero, a função rola_dado() é novamente chamada (recursão), dessa vez com o número de resultados "10" obtidos como parâmetro de quantidade de dados a serem lançados. Esse laço se mantém até que não se obtenha mais resultados iguais a "10".

Acesse o link abaixo para ver a página construida a partir dos códigos acima em funcionamento.

http://acervorpg.logvelox.com/rolador.php

Dúvidas? =P

* Bruno Carnaes é engenheiro eletricista, apaixonado por exoterismo e assuntos do além.

Marcadores: , ,

2 Comentários:

Às 23 de maio de 2010 12:31 , Anonymous Rose disse...

Caro Giba, acredito que não haverá muitos comentários sobre esse assunto.
Eu pelo menos, não entendi nada,rs.
E outra, vc não acha que a tecnologia está tirando possibilidades que antes eram tão simples de serem verificadas e surtiam resultados até mais interessantes ?
Bem, essa é minha opinião, abraço

 
Às 23 de maio de 2010 13:42 , Blogger Giba disse...

Concordo plenamente com você Rose.
Mas na realidade, temos que conviver com o progresso e os brindes que ele nos tras.
Acredito que nossa infância era mais saldável que a de hoje, quandoas brincadeiras eram mais mecânicas e as pessoas interagiam mais entre elas.
O Script acima foi feito pelo amigo Bruno em uma época que estava muito difícil de se encontrar dados de dez faces para se jogar RPG.
Já que não podemos, nem devemos, deter a tecnologia, façamos dela uma aliada.
Um grande abraço e muito obrigado por sua visita.

 

Postar um comentário

Seu comentário é muito bem vindo

Assinar Postar comentários [Atom]

Links para esta postagem:

Criar um link

<< Página inicial