elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web (Moderador: #!drvy)
| | |-+  [javascript] Probabilidades de Captura en Juego
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [javascript] Probabilidades de Captura en Juego  (Leído 2,821 veces)
Brian1511

Desconectado Desconectado

Mensajes: 267


¿Quien soy esa es la gran pregunta?


Ver Perfil WWW
[javascript] Probabilidades de Captura en Juego
« en: 23 Julio 2015, 04:17 am »

Estoy en la creacion de un juego Pokemon con javascript,

Quiero hacer el sistema de captura de Pokemon, quisiera hacer probabilidades al capturar algun pokemon.

Tengo algo como esto:

Código
  1. var PokeBall = 15;
  2. var MasterBall = 25;
  3. var UltraBall = 50;
  4. var PokemonLvl1 = 5;
  5. var PokemonLvl2 = 10;
  6. var PokemonLvl3 = 20;

Como hago para hacer que dependiendo el nivel y el valor de la pokebolas se genere una probabilidad de captura exitosa?


En línea



Creador de BrainMind
v4char

Desconectado Desconectado

Mensajes: 61



Ver Perfil
Re: [javascript] Probabilidades de Captura en Juego
« Respuesta #1 en: 23 Julio 2015, 13:14 pm »

puedes hacer que se genere un numero al azar entre 1 y 20 por ejemplo y luego segun lo pokeball y el nivel puedes ir reducciendo a 1 entre 5.


En línea

Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: Re: [javascript] Probabilidades de Captura en Juego
« Respuesta #2 en: 23 Julio 2015, 14:49 pm »

Según fuentes oficiales la fórmula es así:

Código:
a =  ((([ (3 x HPmax - 2 x HPcurrent)] x (RATE x BONUSball)) + BONUSstatus - 1) / HPmax) / 2.56

Donde:

  • HPmax es la vida máxima del pokemón.
  • HPcurrent es la vida actual del pokemón.
  • RATE es el ratio del pokemón.
  • BONUSball ratio de la pokeball (puedes ver los ratios aquí http://www.pokexperto.net/index2.php?sección=color/balldexGBC)
  • BONUSstatus es el bonus por el estado del pokemon. Congelación o sueño vale 10 y quemaduras o veneno 5.

Por ejemplo. Un pokemon tiene 160 de HPmax y 120 de HPcurrent y tiene un ratio de 2. La pokeball tiene un ratio de 1.5 y el estado del pokemon es de sueño, lo que equivale 10.

Aplicando la fórmula:

Código:
((([3 x 160 - 2 x 120] x (2 x 1.5)) + 10 - 1) / 160) / 2.56

Nos da como resultado:

Código:
a = 1.4868 = 1.49

Ahora hallamos b, por medio de la sifuiente fórmula:

Código:
(2 ^16 - 1) SQRT4 (a / 2^8 - 1)

Lo que nos da:

Código:
b = 65535 x 0.32 = 20971.2

Generamos 4 números aleatorios:

Código:
(b / 2^16)^4 = 0.1

Por lo tanto, la probabilidad es:

Código:
p = 0.1 x 100 = 10%.

Tuvimos 10% de probabilidades de capturar al pokemón.
En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.779



Ver Perfil WWW
Re: [javascript] Probabilidades de Captura en Juego
« Respuesta #3 en: 23 Julio 2015, 15:46 pm »

Pfff, te has metido en un asunto complicado xD. Digamos que en los juegos de pokemon la captura depende de muchos mas factores que el nivel y el tipo de bola. Por ejemplo, en la primera generación los factores son:

  • Nivel de pokeball
  • Hechizos (dormir, congelar, quemar etc..)
  • Factor de captura del propio pokemon (cada uno es diferente)
  • Factor aleatorio

Como ves, ni se nombra el nivel del pokemon. Y ya después de la primera generación cambia drásticamente. Puedes ver 'los algoritmos' en esta pagina:

Catch rate
http://bulbapedia.bulbagarden.net/wiki/Catch_rate

Basándome en el algoritmo de la primera generación y los valores que da la bulbapedia, he hecho un PoC.

HTML
Código
  1. <!DOCTYPE html>
  2. <html lang='es'>
  3.    <meta charset='utf-8'>
  4.    <title>PoC - Captura pokemon</title>
  5.    <link rel='stylesheet' href='http://yui.yahooapis.com/pure/0.6.0/pure-min.css'>
  6.    <style type='text/css'>
  7.        body { font-size: 14px;}
  8.        input[type='text'] { max-width: 50px; }
  9.        label { color: #555; padding: 5px 10px; }
  10.        #wrap { max-width: 600px; margin: 0 auto;}
  11.        #log > div { padding: 2px; color: #444; text-align: justify;}
  12.        #clear {cursor:pointer; text-decoration: underline; color: #888;}
  13.    </style>
  14. </head>
  15. <div id='wrap'>
  16. <form class='pure-form'>
  17.    <fieldset>
  18.        <legend>Seleciona el Pokemon!</legend>
  19.  
  20.        <label for='pokemon'>Pokemon</label>
  21.        <select id='pokemon'>
  22.            <option value='255'>Caterpie</option>
  23.            <option value='225'>Gulpin</option>
  24.            <option value='190'>Pikachu</option>
  25.            <option value='127'>Bibarel</option>
  26.            <option value='90'>Arbok</option>
  27.        </select>
  28.  
  29.        <label for='vida'>Vida (actual/max)</label>
  30.        <input type='text' id='vida_act' value='20'>
  31.        <input type='text' id='vida_max' value='35'>
  32.    </fieldset>
  33.  
  34.    <fieldset>
  35.        <legend>Seleciona la pokeball y efectos!</legend>
  36.  
  37.        <label for='pokeball'>Pokeball a usar</label>
  38.        <select id='pokeball'>
  39.            <option value='255'>PokeBall</option>
  40.            <option value='200'>SuperBall</option>
  41.            <option value='150'>SafariBall</option>
  42.            <option value='150'>UltraBall</option>
  43.            <option value='0'>MasterBall</option>
  44.        </select>
  45.  
  46.        <label for='efecto'>Efecto</label>
  47.        <select id='efecto'>
  48.            <option value='0'>Ninguno</option>
  49.            <option value='25'>Dormido</option>
  50.            <option value='25'>Congelado</option>
  51.            <option value='12'>Paralizado</option>
  52.            <option value='12'>Quemado</option>
  53.            <option value='12'>Envenenado</option>
  54.        </select>
  55.  
  56.        <input type='button' class='pure-button pure-button-primary' id='capturar' value='Capturar!'>
  57.    </fieldset>
  58.    <fieldset>
  59.        <legend>Log (<span id='clear'>borrar</span>)</legend>
  60.        <div id='log'></div>
  61.    </fieldset>
  62. </form>
  63. </div>
  64. <script type='text/javascript' src='pokemon.js'></script>
  65. </body>
  66. </html>

pokemon.js
Código
  1. var capturar = function(){
  2.  
  3.    /* Pokemon y su factor de captura */
  4.    var pokemon = document.getElementById('pokemon');
  5.    var pokemon_nombre = pokemon.options[pokemon.selectedIndex].text;
  6.    var pokemon_factor = pokemon.options[pokemon.selectedIndex].value;
  7.  
  8.    var vida = document.getElementById('vida_act').value;
  9.    var vida_max = document.getElementById('vida_max').value;
  10.  
  11.    /* Tipo de pokeball */
  12.    var pball = document.getElementById('pokeball');
  13.    var pball_nombre = pball.options[pball.selectedIndex].text;
  14.    var pball_factor = pball.options[pball.selectedIndex].value;
  15.  
  16.    /* Tipo de efecto adverso */
  17.    var efecto = document.getElementById('efecto');
  18.    var efecto_nombre = efecto.options[efecto.selectedIndex].text;
  19.    var efecto_factor = efecto.options[efecto.selectedIndex].value;
  20.  
  21.    /* Por mostrar algo */
  22.    addLog('Pokemon: '+pokemon_nombre+' | Vida: '+vida+'/'+vida_max);
  23.    addLog('Pokeball: '+pball_nombre+' ('+pball_factor+') | Efecto: '+efecto_nombre+' ('+efecto_factor+')');
  24.  
  25.    /* --------------------------------------------------------------------
  26.         Aquí empieza la magia.
  27.         ------------------------------------------------------------------- */
  28.  
  29.    /* La MasterBall siempre funciona xD */
  30.    if(pball_factor === '0'){
  31.        addLog('Capturas el pokemon con una '+pball_nombre+'!<hr>');
  32.        return true;
  33.    }
  34.  
  35.    /* Generamos un numero aleatorio dependiendo del factor de la pokeball */
  36.    var n = Math.floor((Math.random() * pball_factor) + 1);
  37.  
  38.    /* Comprobamos si el efecto es capaz de capturarlo */
  39.    if(n!=='0' && n < efecto_factor){
  40.        addLog('Capturas el pokemon con una '+pball_nombre+' debido a '+efecto_nombre+'!<hr>');
  41.        return true;
  42.    }
  43.  
  44.    /* Comprobamos si el pokemon se escapa negando el efecto */
  45.    if(n-efecto_factor > pokemon_factor){
  46.        addLog('El pokemon se escapa!<hr>');
  47.        return false;
  48.    }
  49.  
  50.    /* Generamos un numero aleatorio entre 0 y 255 */
  51.    var m = Math.floor((Math.random() * 255) + 1);
  52.  
  53.  
  54.    /* Si es una SuperBall el factor pasa a 8 sino a 12 */
  55.    if(pball_factor==='200'){ var ball = 8; } else { var ball = 12; }
  56.  
  57.    /* Calculamos f (no debe ser inferior a 1 ni superior a 255 */
  58.    var f = Math.floor((vida_max * 255 * 4) / (vida * ball));
  59.    if(f<1){ f = 1; } else if(f>255){ f=255; }
  60.  
  61.    /* Si f es igual o superior a m, capturamos. */
  62.    if(f >= m){
  63.        addLog('Capturas el pokemon con una '+pball_nombre+'!<hr>');
  64.        return true;
  65.    }
  66.  
  67.    addLog('El pokemon escapa!<hr>');
  68.    return false;
  69. };
  70.  
  71. /* Evento capturar */
  72. document.getElementById('capturar').addEventListener('click', capturar);
  73.  
  74. /* Evento borrar log */
  75. document.getElementById('clear').addEventListener('click', function(){
  76.    document.getElementById('log').innerHTML = '';
  77. });
  78.  
  79. var addLog = function(message){
  80.    var element = document.getElementById('log');
  81.    element.insertAdjacentHTML('beforeend','<div>'+message+'</div>');
  82.    return true;
  83. };

DEMO: http://jsfiddle.net/drvy/n9ur9L5s/



Si solo quieres el factor de captura, la funcion capturar() se reduce drásticamente.
Código
  1. var capturar = function(){
  2.  
  3.    /* Pokemon y su factor de captura */
  4.    var pokemon = document.getElementById('pokemon');
  5.    var pokemon_factor = pokemon.options[pokemon.selectedIndex].value;
  6.  
  7.    var vida = document.getElementById('vida_act').value;
  8.    var vida_max = document.getElementById('vida_max').value;
  9.  
  10.    /* Tipo de pokeball */
  11.    var pball = document.getElementById('pokeball');
  12.    var pball_factor = pball.options[pball.selectedIndex].value;
  13.  
  14.    /* Tipo de efecto adverso */
  15.    var efecto = document.getElementById('efecto');
  16.    var efecto_factor = efecto.options[efecto.selectedIndex].value;
  17.  
  18.    /* --------------------------------------------------------------------
  19.         Aquí empieza la magia.
  20.         ------------------------------------------------------------------- */
  21.  
  22.    /* La MasterBall siempre funciona xD */
  23.    if(pball_factor === '0'){ return 100; }
  24.  
  25.    /* Calcular f */
  26.    if(pball_factor==='200'){ var ball = 8; } else { var ball = 12; }
  27.    var f = Math.floor((vida_max * 255 * 4) / (vida * ball));
  28.    if(f<1){ f = 1; } else if(f>255){ f=255; }
  29.  
  30.    var p0 = (efecto_factor+1) / (pball_factor+1);
  31.    var p1 = ((pokemon_factor+1)/(pball_factor+1)) * ((f+1)/256);
  32.  
  33.    return p0+p1;
  34. };

PD: Los factores de captura de los pokemon los puedes ver aquí:
http://bulbapedia.bulbagarden.net/wiki/List_of_Pok%C3%A9mon_by_catch_rate

PD2: De todos modos, la respuesta de @Gus te servirá mejor yo creo.

Saludos
« Última modificación: 23 Julio 2015, 16:16 pm por #!drvy » En línea

Brian1511

Desconectado Desconectado

Mensajes: 267


¿Quien soy esa es la gran pregunta?


Ver Perfil WWW
Re: [javascript] Probabilidades de Captura en Juego
« Respuesta #4 en: 23 Julio 2015, 17:33 pm »

Wow chicos muchas gracias en serio, no sabia que tendria tanto apoyo en esta comunidad!,
Bueno el caso es que antes de publicar este post ya tenia una formula parecida a la que indica v4char

Código
  1. function CapturePokemon(name,hp,lvl,pb){
  2. /*
  3. name = Nombre del pokemon.
  4. hp = Vida actual del pokemon.
  5. lvl = Nivel del pokemon.
  6. pb = Ratio de la pokebola.
  7. */
  8. var TLT = lvl - pb;
  9. al = Math.floor(Math.random()*TLT);
  10. if(al==0||al<0){
  11. //Capturado
  12. }elese{
  13. //Escapado
  14. }
  15. }
  16.  
Y me funciona pero queria respuestas de personas conocedoras :).

Intentara implementar la formula de Gus Garsaky  porque es la mas corta, pero sino funciona como quiero usare la de #!drvy.

Una ves mas muchas gracias amigos en serio, y gracias a #!drvy  por tomarte el tiempo de hacer todo eso.


Mod: No olvidar las GeSHi
« Última modificación: 23 Julio 2015, 19:44 pm por engel lex » En línea



Creador de BrainMind
Usuario Invitado


Desconectado Desconectado

Mensajes: 625



Ver Perfil
Re: [javascript] Probabilidades de Captura en Juego
« Respuesta #5 en: 23 Julio 2015, 18:59 pm »

Estaba trabajando, no pude contestar. Te pongo un pequeñito ejemplo que acabo de leer de la wiki de pokemón:

El ratio de captura se saca con ésta fórmula según esa wiki:


Donde:

  • PSmax = Puntos de salud totales del Pokemón.
  • PSactual = Puntos de salud actuales.
  • Rc = Ratio de captura del Pokemón.
  • Rb = Ratio de Poké Ball.
  • Be = Bono extra que se agrega cuando un Pokemón tiene un problema de estado: dommido: 2, congelado: 2, paralizado: 1.5, quemado: 1.5, envenenado 1.5, sin problemas: 1.

Si a es mayor a 255, el pokemón es capturado. Caso contrario, encontramos b:


Explicación:

El juego generará 4 números entre 0 y 65535 (2^16 - 1) y se comparan con los valores de b. Nótese que b depende de a. Con un número menor o igual que b, la Poke Ball rebotará una vez, con dos rebotará dos veces, con tres rebotará tres veces y con el cuarto número lo capturará. Es decir, se necesita que los 4 números sean menores o iguales a 65535.

Por ejemplo, si b = 350 y las combinaciones son:

  • 1er número = 200
  • 2do número = 300
  • 3er número = 500
  • 4to número = 120

No se capturará al pokemón, solo rebotará tres veves ya que el tercer número aleatorio es mayor a 350.

Recursos:

Para saber el ratio de captura de un pokemón consulta: Lista de pokemones por ratio de captura
Para saber el ratio de las Poke Balls: Poke Balls ratios

Ejemplo:

Demo JSFiddle

En línea

"La vida es muy peligrosa. No por las personas que hacen el mal, si no por las que se sientan a ver lo que pasa." Albert Einstein
MinusFour
Moderador Global
***
Conectado Conectado

Mensajes: 5.331


I'm fourth.


Ver Perfil WWW
Re: [javascript] Probabilidades de Captura en Juego
« Respuesta #6 en: 23 Julio 2015, 19:42 pm »

Tu formula es un poco extraña, pero sin duda está mal. No es lo mismo capturar un Pokemon Legendario, en su segunda/tercera evolución (o preevolución), un Pokemon raro, etc. Por ejemplo, un Mewtwo LVL 1 es mucho mucho más difícil de capturar que un Pidgey LVL 1, pese a cualquier condición que pudiera tener (%hp bajo, status infligido, ratio de captura de pokebola, etc).

Lo que puedes hacer es muy simple, calculas la probabilidad de que el Pokemon pueda ser capturado (entre 0 y 100). Y luego generas un número aleatorio entre 0 y 100. Sí la probabilidad de captura es mayor al número generado entonces se captura el Pokemon, si no el Pokemon escapa. Lo más díficil es hacer la formula para la probabilidad de captura del Pokemon.

Una formula muy simple es: Por cada % de HP menos que tenga (%dmg) hay una probabilidad de captura para un Pokemon de %dmg * ratio de Pokebola. Por ejemplo, un Pokemon con 1% de daño (suponiendo que tiene 100 hp, sufrio 1 de daño) al lanzarle una pokebola normal (digamos que su factor es de 1) tenemos que  1% * 1.0 = Probabilidad de Captura (1.0). Ahora digamos que sufrió 99% de daño: 99% * 1.0 = 99% Probabilidad de Captura.

Hasta ahora la formula para probabilidad de captura es de: %daño * factor de captura de pokebola. Muy sencillo. Ahora, digamos que quieres tomar en cuenta la rareza del pokemon (legendario, evolucionado, etc). Simplemente añades otro factor de rareza. Algunos valores que se me vienen a la mente:

Caterpie: 2.0
Mewtwo: 0.01

La formula ahora es: %daño * factor de captura * rareza. Por ejemplo un Metwo que ha sufrido %99 de daño, le lanzas una pokebola con factor de 1.0 tendrás: %99 * 1.0 * 0.01 = %.99 probabilidad de captura (100 pokebolas en promedio para capturarlo). Un Caterpie que ha sufrido 10% de daño, le lanzas una pokebola con factor de 1.0: %10 * 1.0 * 2.0 = 20% probabilidad de captura (5 pokebolas en promedio para capturarlo).

Para status infligido, simplemente agregas otro factor:

% daño * factor de captura * rareza * status.

Por ejemplo, digamos que el estar congelado aumenta la probabilidad de captura 10 veces. Retomando el ejemplo de Metwo: 10 * (.99) = 9.9% (ahora 10 pokebolas en promedio para capturar).

Claro que está formula tiene sus problemas, por ejemplo, es posible pasarse de 100% (en mi opinión, siempre debe haber una probabilidad de falla a menos que sea una master ball). Sin mencionar que no estás recreando Pokemon, sino que estás cambiando la forma interna en la que trabaja el juego.
En línea

Brian1511

Desconectado Desconectado

Mensajes: 267


¿Quien soy esa es la gran pregunta?


Ver Perfil WWW
Re: [javascript] Probabilidades de Captura en Juego
« Respuesta #7 en: 23 Julio 2015, 20:36 pm »

Oppaaa!, en serio les agradezco mucho las explicaciones ya se como lo hare.
Gracias por el apoyo! ñ.ñ y a MinusFour por tomarse su tiempo en explicarme todo eso que me sirvio de mucho!.
En línea



Creador de BrainMind
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Juego javascript
Desarrollo Web
Puntoinfinito 4 1,632 Último mensaje 20 Junio 2012, 21:23 pm
por Puntoinfinito
[javascript] Crear un mapa alaeatorio (es para un juego)
Programación General
z3nth10n 8 5,136 Último mensaje 2 Julio 2012, 18:45 pm
por z3nth10n
MOVIDO: [javascript] Probabilidades de Captura en Juego
Java
Eleкtro 0 883 Último mensaje 23 Julio 2015, 04:26 am
por Eleкtro
Hacer juego con javascript
Desarrollo Web
Robocop8 2 980 Último mensaje 19 Agosto 2017, 00:56 am
por ivancea96
javascript - Juego de fosforos
Desarrollo Web
TickTack 0 560 Último mensaje 26 Febrero 2019, 21:33 pm
por TickTack
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines