Autor Tema: Establecer distancia respecto al 0 o 20.5

0 Usuarios y 1 Visitante están viendo este tema.

07 Enero, 2026, 10:14 am
Leído 1117 veces

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Estas fórmulas determinan hacia dónde irán los saques en mi juego Pong y la rotación de lo que sería la bola:
ApuntandoX = Math.random()*700-350;
ApuntandoY = Math.random()*375.5+20.5;
Rotando = Math.random()*200-100;

Si las entiendo bien,
el rango de ApuntandoX es -350~350,
de ApuntandoY es 20.5~400,
y de Rotando es -100~100.

El juego se pone más difícil entre con mayor diferencia vayas ganando, es decir hay una variable Dificultad, que inicia como 0 y va subiendo.

Quisiera modificar las fórmulas de modo que Dificultad influya.

En el caso de ApuntandoX, el resultado puede ser 0, pero si Dificultad es 10 por ejemplo, quiero que el rango sea -350~-10 y 10~350, es decir así con una zona de "valores prohibidos", básicamente es que entre mayor sea la dificultad, menos al centro irán los saques.

Rotando es parecido, entre mayor sea la dificultad, mayor será la mínima rotación inicial posible, es decir todos los tiros tendrán algo de rotación.

ApuntandoY sólo tiene valores positivos así que parece más fácil de resolver, algo como
ApuntandoY = Math.max(Math.random()*400, Dificultad+20.5);
...no estoy seguro.

08 Enero, 2026, 10:31 am
Respuesta #1

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada

Si el grado de dificultad  máximo teórico el valor n por ejemplo  n=10 , tu vas ascendiendo la dificultad  de 0 a 9
En alguna parte del código  defines la dificultad  con la que vas a jugar. Ejemplo dificultad 5 la mitad  del máximo.


Código: [Seleccionar]
if int(Math.random()*2)>1:
   sig=1
else:
   sig=-1

ApuntandoX = sig* (Math.random()*(350*(1-dificultad/n))+dificultad*350/n);
Con los datos del ejemplo bolas caen entre -350 y -175, pero también  entre 175 y 350. Nunca entre -175 y 175 es decir en el centro (pero esto se vuelve a la larga predecible).

El primer random define si va a izquierda  o derecha y el segundo cuan cerca del extremo según la dificultad que como máximo valor práctico puede ser el valor n-1=9 en este caso, pues sino ya no hay aleatoriedad sobre donde cae la bola.(solo caen en el borde  exactamente en $$\pm 350$$)

Pero esto para los saques no te sirve ,pues por experiencia  sabrás que irán hacia la punta,  y te pararas ahí para recibirlos,(parecería mas facil en vez de dificil) si para el medio juego porque  lo pones a correr  como un demonio ente punta y punta.

Pd no solo puedes controlar donde va a caer sino la velocidad o el iempo que tarda en llegar a ese lugar.

En los saques te conviene  elegir la posición  de llegada aleatoriamente cada vez mas alejada de la posición del que recibe al momento  de lanzar.

Hay otras formas de aumentar  la probabilidad  de que el tiro vaya a las puntas y que baje la de ir al centro  sin eliminarla completamente.
as
Saludos  \(\mathbb {R}^3\)

11 Enero, 2026, 03:03 pm
Respuesta #2

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Con las ideas que me diste me quedó así:
Código: [Seleccionar]
ApuntandoX = Math.max(Math.random()*350, Dificultad*10);
ParaSigno = random(2);
if (ParaSigno == 0) {
ApuntandoX = -ApuntandoX;
}
ApuntandoY = Math.max(Math.random()*400, Dificultad*10+20.5);
Rotando = Math.max(Math.random()*100, Dificultad*10);
ParaSigno = random(2);
if (ParaSigno == 0) {
Rotando = -Rotando;
}

Me falta confirmar que funcione como espero y crear la variable D¡ficultadx10 para no tener que estar multiplicando Dificultad a cada rato (o si siempre va a usarse como *10 la voy a ajustar, tengo que fijarme si se puede así).

Pero esto para los saques no te sirve ,pues por experiencia  sabrás que irán hacia la punta,  y te pararas ahí para recibirlos,(parecería mas facil en vez de dificil)
Los saques hacia el medio son más fáciles de devolver (salvo que vayan muy rápido a la cara o algo, pero no es el caso). No puedes esperarlos en una punta si no sabes cual o no tiene mucho sentido apostar, puede ir a la izquierda o derecha. Si siempre terminan en el mismo lado y siempre llegas, entiendo, pero igual tu velocidad de reacción no será siempre igual, a veces no llegarás o podría ser que no.
Igual esas fórmulas son para el saque del humano, o sea contra la máquina. Los de la máquina los tengo que ajustar también, pero las variables no son iguales creo.

Citar
Pd no solo puedes controlar donde va a caer sino la velocidad o el iempo que tarda en llegar a ese lugar.

En los saques te conviene  elegir la posición  de llegada aleatoriamente cada vez mas alejada de la posición del que recibe al momento  de lanzar.
Es un pong, dudo que elegir hacia dónde sacar tenga mucho sentido...
Lo voy a pensar y consultar con gamers pero el juego está programado para que el meteoro rebote cuando toca la nave, y cuando te hacen un punto vuelve a aparecer tocándola y cuando desaparece el mensaje de cuántos puntos van ya rebota. Poder elegir hacia dónde sacar complica un poco y creo que hay cosas más importantes como agregar más variedad de naves, fondo, etc.

Citar
Hay otras formas de aumentar  la probabilidad  de que el tiro vaya a las puntas y que baje la de ir al centro  sin eliminarla completamente.
as
Bueno ¿cómo se haría eso?

11 Enero, 2026, 08:08 pm
Respuesta #3

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada

Con las ideas que me diste me quedó así:
Código: [Seleccionar]
ApuntandoX = Math.max(Math.random()*350, Dificultad*10);
No... alli apuntadoX elige entre dos valores : entre el Math.random()*350 o el  de Dificultad*10 , y escoje el maximo.


Código: [Seleccionar]
ParaSigno = random(2);
if (ParaSigno == 0) {
   ApuntandoX = -ApuntandoX;
}

Sí, eso cambia aleatoriamente el signo de apuntandoX

Citar
Código: [Seleccionar]
ApuntandoY = Math.max(Math.random()*400, Dificultad*10+20.5);
Rotando = Math.max(Math.random()*100, Dificultad*10);
ParaSigno = random(2);
if (ParaSigno == 0) {
   Rotando = -Rotando;
}


Me falta confirmar que funcione como espero y crear la variable D¡ficultadx10 para no tener que estar multiplicando Dificultad a cada rato (o si siempre va a usarse como *10 la voy a ajustar, tengo que fijarme si se puede así).
Eso ya no funciona para apuntandoY,  ni para rotando, sí cambia bien el signo de rotando.

Citar
Pero esto para los saques no te sirve ,pues por experiencia  sabrás que irán hacia la punta,  y te pararas ahí para recibirlos,(parecería mas facil en vez de dificil)
Los saques hacia el medio son más fáciles de devolver (salvo que vayan muy rápido a la cara o algo, pero no es el caso). No puedes esperarlos en una punta si no sabes cual o no tiene mucho sentido apostar, puede ir a la izquierda o derecha. Si siempre terminan en el mismo lado y siempre llegas, entiendo, pero igual tu velocidad de reacción no será siempre igual, a veces no llegarás o podría ser que no.
Igual esas fórmulas son para el saque del humano, o sea contra la máquina. Los de la máquina los tengo que ajustar también, pero las variables no son iguales creo.

Citar
Pd no solo puedes controlar donde va a caer sino la velocidad o el tiempo que tarda en llegar a ese lugar.

En los saques te conviene  elegir la posición  de llegada aleatoriamente cada vez mas alejada de la posición del que recibe al momento  de lanzar.
Es un pong, dudo que elegir hacia dónde sacar tenga mucho sentido...
Lo voy a pensar y consultar con gamers pero el juego está programado para que el meteoro rebote cuando toca la nave, y cuando te hacen un punto vuelve a aparecer tocándola y cuando desaparece el mensaje de cuántos puntos van ya rebota. Poder elegir hacia dónde sacar complica un poco y creo que hay cosas más importantes como agregar más variedad de naves, fondo, etc.

Citar
Hay otras formas de aumentar  la probabilidad  de que el tiro vaya a las puntas y que baje la de ir al centro  sin eliminarla completamente.
as
Bueno ¿cómo se haría eso?
Ok veamos . Me mareo en seguirte por que primero parece tenis y luego es un pong....

Inicias con un tablero de 700 x 400  y quieres que tu bola pueda ir  a un sitio al azar entre -350 y 350  y y al la altura de 20.5 hasta 400
cuando avanzas en el juego el valor dificultad aumenta y con él lo que quieres en que el tiro vaya mas a los extremos (mas cerca de -350 o mas cerca de 350 y menos cerca de 0)

Supon que hay n=10 niveles de dificultad  de 0 a 9  a medida que ganes un juego  aumentas el valor dificultad en 1 unidad  esto es

Código: [Seleccionar]
dificultad=dificultad +1
y con lo que te he dicho puedes hacer que cada tiro vaya a una region mas especifica cerca de los extremos

así , si dificultad es 7

Código: [Seleccionar]
ApuntandoX = (Math.random()*(350*(1-dificultad/n))+dificultad*350/n);   genera valores de apuntando entre 245 y 350 luego con

Código: [Seleccionar]
ParaSigno = random(2);
if (ParaSigno == 0) {
   ApuntandoX = -ApuntandoX;
}
    tienes dos regiones donde puede ir una que va desde -350 a -245 y otra de 245 a 350 es decir a los extremos y nunca cae entre -245 y 245 es decir en el centro la región donde no cae se amplia si aumentas la dificultad.

si tu quieres que vaya mas hacia las puntas puedes hacer que

Código: [Seleccionar]
ApuntandoY =  (Math.random()*(379.5*(1-dificultad/n))+dificultad*379.5/n)+20.5;  esto hace que a medida que dificultad crece, las bolas caen mas cerca de 400 , para 7    estará entre 294 y 400 y nunca por de 294 y cuando dificultad es 0 nunca es menor  que 20.5.

lo mismo con rotando

Código: [Seleccionar]
Rotando = (Math.random()*(100*(1-dificultad/n))+dificultad*100/n); 
ParaSigno = random(2);
if (ParaSigno == 0) {
   Rotando = -Rotando;
}
para  dificultad 7  rotara entre -100  y -70  si es para un lado o entre 70 y 100 si rota para el otro.

Spoiler
En el tenis el saque es cruzado, la pelota cae del otro lado de la mitad vertical si sacas de la izquierda debe caer de la derecha y viceversa, siempre del otro lado de la red, en ese espacio hay una sola punta y el medio, si te paras en medio de esas dos posiciones tiene mas oportunidad de llegar a cualquiera de ellas , o al medio o al extremo, por eso te digo que en los saque esto no te sirve porque siempre va hacia los extremos, pero sí  en medio juego te sirve para que vaya cada vez mas cerca del extremo izquierdo -350 o del extremo derecho 350, haciendo mas dificil preveer cual.  Esto cuanto a tenis, pero dices que es pong, entonces esto no lo tengas en cuenta.
[cerrar]
Como dices que es un pong, es medio raro ya que no se puede elegir la altura , ya que la nave el contrario esta a una altura fija, pero si (apuntandoX, apuntandoY ) son el par de coordenadas  hacia donde iría un línea recta teórica, no te debes olvidar de descontar la posición desde donde parte el meteoro, para  tener tu trayectoria. 

Para que sea mas probable que vaya a las puntas sin dejar que alguna vez pueda ir al centro por ejemplo

Haz esto para algún grado de dificultad por ejemplo dificultad=3  (cuanto dificultad sea mas grande mas notaras que va hacia una punta el lanzamiento)
Código: [Seleccionar]
ApuntandoX = (1-(Math.random())**dificultad ) *350;

ParaSigno = random(2);
if (ParaSigno == 0) {
   ApuntandoX = -ApuntandoX;
}
Saludos  \(\mathbb {R}^3\)

20 Enero, 2026, 03:52 am
Respuesta #4

Tachikomaia

  • $$\Large \color{#5b61b3}\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 1,297
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Tardé en retomar esto en parte por problemas de ruidos en el barrio.

Eso ya no funciona para apuntandoY,  ni para rotando, sí cambia bien el signo de rotando.

Sí funciona:
ApuntandoY = Math.max(Math.random()*400, Dificultad*10+20.5);
Se hace un random que resulta de 0 a 400.
Se toma el valor máximo de 2 posibles: El resultado de eso y 20.5
Por eso el rango es de 20.5 a 400.
Además el valor mínimo va aumentando según la dificultad.

Rotando tú mismo dices que cambia el signo, la lógica del signo es igual que con ApuntandoX.

ApuntandoY es diferente, no requiere cambio de signo sino un mínimo.

Ya está bien.

Citar
Me mareo en seguirte por que primero parece tenis y luego es un pong....
Desde hace ya mucho, antes de hacer un juego de tenis, estoy haciendo un Pong y otros.

Citar
Como dices que es un pong, es medio raro ya que no se puede elegir la altura , ya que la nave el contrario esta a una altura fija, pero si (apuntandoX, apuntandoY ) son el par de coordenadas  hacia donde iría un línea recta teórica, no te debes olvidar de descontar la posición desde donde parte el meteoro, para  tener tu trayectoria.
Los saques son al azar.
Recuerda que el Y está invertido, arriba es menos que abajo.
ApuntandoY determina el ángulo, pero el valor no es un ángulo. Si se apunta (al azar) hacia arriba de la pantalla, la bola no tocará una pared, pero sino sí, en cuyo caso puede ser efectivo porque la IA va hacia la pared y luego vuelve y si la bola rebota más rápido de lo que se mueve entonces no llega. Por eso los saques con mucho ángulo o ApuntandoY (que es parecido, influye en el ángulo) pueden ser más efectivos que los con poco ángulo. Los que tienen demasiado ángulo (la bola rebotando en las paredes muchas veces) son menos efectivos que los con poco ángulo pero como el máximo es 400 en teoría sólo rebota máximo 1 vez.

No entiendo bien qué es lo que te parece raro, tendrías que jugar al juego, pero si no descargaste ni probaste mi pack supongo que no quieres, te grabo un video.
Observa que la mayoría del tiempo aparece una mira. Eso es que yo (el naranja) elegí una dirección, y se va haciendo más hacia el extremo y luego hacia abajo (hasta el centro, Y 400).
En el saque esa mira no aparece (luego de hacer 4 puntos y me dejo hacer uno verás que saco) pero la mecánica es similar, como si empezara en un lugar al azar, dentro del rango explicado.

Citar
ApuntandoX = (1-(Math.random())**dificultad ) *350;
Según entiendo eso puede dar valores más altos que 350, no hay mucho problema si pongo que el máximo sea 350, lo pensaré.

20 Enero, 2026, 11:18 am
Respuesta #5

Richard R Richard

  • Ingeniero Industrial
  • $$\Large \color{#9c57a6}\pi\,\pi\,\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 4,054
  • País: ar
  • Karma: +2/-0
  • Sexo: Masculino
  • Dentro de la ciencia todo,fuera de la ciencia nada
Si tienes razón  lo vengo pensando  con el 0 abajo a la i,
zquierda cuando está  arriba a la izquierda  según dices.
Código: [Seleccionar]
ApuntandoX = (1-(Math.random())**dificultad ) *350
Math.random() genera un valor entre 0 y 1 Al elevarlo a un exponente cualquiera,  sigo obteniendo un valor entre 0 y 1 pero más cercano a cero.
Al restarselo a 1, estoy obteniendo valores más cercanos a 1, pero menores que 1.
Al multiplicar por 350 obtienes valores más cercanos 350 pero menores a 350.

Respecto  a
Código: [Seleccionar]
ApuntandoY = Math.max(Math.random()*400, Dificultad*10+20.5);


Cada 400 veces que saques, siempre 20.5 veces tendrás el mínimo que es 20.5 y 379.5 veces un valor entre 0 y 400.
Te sale más veces el mínimo que otro valor cualquiera (cambia 20.5 por 380 y veras lo que te digo mas fácilmente)


En cambio
Código: [Seleccionar]
ApuntandoY = (Math.random()*(379.5*(1-dificultad/n))+dificultad*379.5/n)+20.5; hace más probables valores siempre por encima de 20.5,y más cercanos a 350 cuanto  más cerca de 10 es la dificultad pudiendo elegir valores entre 0 y 9.999999... pero cuanto más cerca de 10, casi tos los tiro te caen cerca de 350, es decir a una punta, luego on el el otro random decides si es a la izquierda o a la derecha.
Cuando dificultad  es cero, existe la misma probabilidad de que la bola caiga en cualquier  valor entre 20.5 y 400.


Saludos  \(\mathbb {R}^3\)