Preguntas sobre programacion de Hokutoy.

Started by Hokutoy, February 02, 2010, 04:44:57 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Hokutoy

Buenas!
Ahora que estoy en racha me estoy dedicando a crear juegos y programas varios, pero dada mi falta de experiencia a la hora de codear y, sobretodo, con la parte de las matematicas en general tengo muchas dudas que me gustaría resolver.
Para no andar abriendo y cerrando hilos he decidido usar este hilo y continuarlo a medida de que me surjan nuevas dudas.
Gracias a todos!

Empezemos...

Quiero conseguir un numero random del 1 al 10:

azar=rand(1,10);

Que forma es la mas eficiente para conseguir, por ejemplo, manteniendo cierto azar, que aparezcan los números 1,2,3 (frecuentemente), 4,5,6 (uncommon) y 7,8,9,10 (rara vez).

Consigo mi proposito pero tengo que usar un monton de rands y codigo, a mi parecer, excesivo.

Algún consejo?

Gracias!

DCelso

si queremos una frecuencia en tres grupos donde el primero sea un 75% el segundo un 20% y el tercero el 5% restante podríamos hacer lo siguiente

frecuencia= rand (1,100); 
if ( frecuencia < 75)
  azar= rand(1,3);
elsif (frecuencia < 95)
  azar= rand(4,6);
else
  azar= rand(7,10);
end

puede optimizarse pero así queda bastante claro.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Drumpi

Otra solución sería crear rangos y usar un único rand, algo así (estilo porcentaje):

temp=rand(1,100);
switch (temp)
case 1..20: valor=1; end
case 21..40: valor=2; end
case 41..50: valor=3; end
case 51..60: valor=4; end
case 61..70: valor=5; end
case 71..80: valor=6; end
case 81..85: valor=7; end
case 86..90: valor=8; end
case 91..95: valor=9; end
case 96..100: valor=10; end
end //switch

Es un poco largo de escribir, pero creo que es más óptimo al usar un único rand, y puedes establecer los porcentajes que quieras de forma independiente, añadir valores salteados, usar rangos mayores de 100 para más precisión...
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

DCelso

buena observación, me quedo con tu solución :D.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Hokutoy

Quote from: DCelso on February 03, 2010, 09:09:21 AM
buena observación, me quedo con tu solución :D.

Pues yo me quedo con las dos!

Gracias!

Futu-block

Quote from: Drumpi on February 03, 2010, 12:59:28 AM
Otra solución sería crear rangos y usar un único rand, algo así (estilo porcentaje):

temp=rand(1,100);
switch (temp)
case 1..20: valor=1; end
case 21..40: valor=2; end
case 41..50: valor=3; end
case 51..60: valor=4; end
case 61..70: valor=5; end
case 71..80: valor=6; end
case 81..85: valor=7; end
case 86..90: valor=8; end
case 91..95: valor=9; end
case 96..100: valor=10; end
end //switch

Es un poco largo de escribir, pero creo que es más óptimo al usar un único rand, y puedes establecer los porcentajes que quieras de forma independiente, añadir valores salteados, usar rangos mayores de 100 para más precisión...

la misma que iba a ofrecer

por cierto, para un rango de 30 a 40 en el CASE se escribe co dos puntos ¿no?
CASE 30..40:

Prg

Quotepor cierto, para un rango de 30 a 40 en el CASE se escribe co dos puntos ¿no?
CASE 30..40:
si
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

Drumpi

Si, los dos puntos seguidos indican un rango de valores enteros. Si separas con comas son valores individuales. Viene en los manuales básicos.
Recuerda que en los SWITCH sólo puedes usar un valor en un único CASE, por lo que si añades ese rango, tendrás que modificar el código que te he escrito ;)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Hokutoy

Aunque mi juego para el concurso ya ha sido enviado he pensado en hacer un pequeño update para incluir una feature que se me olvido implementar... la de "fusionar" (merge) tu tabla de records con otra tabla de records de, por ejemplo, un compañero o bajada de inet, etc... para el tema de intentar hacer torneos o intentar batir al mejor jejeje
El codigo para esta feature ya lo he codeado sin ningun problema. Ahora si junto a tu archivo Rhighscores.file copias un nuevo archivo valido (Rhighscores.file) con el nombre newRhighscores.file el juego hace una comparativa de recors y fusiona la nueva tabla quedandose guardada en el archivo Rhighscores.file.

Mi pregunta:
Hay alguna manera de eliminar físicamente del directorio el archivo newRhighscores.file que ya he fusionado y no me sirve de nada?
Algo tipo:
delete("files/newqhighscore.file");

Gracias!

Drumpi

INT RM(STRING)
Ten cuidado con lo que borras: asegurate que el archivo existe antes (FILE_EXISTS) y que no está protegido contra escritura:

STRUCT fileinfo
    STRING path;
    STRING name;
    directory;
    hidden;
    readonly;
    size;
    STRING created;
    STRING modified;
END

Por si acaso.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Hokutoy

Gracias Drumpi! Como siempre.
Karma++!

Porcierto... las siglas RM que significan?

DCelso

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

Futu-block

y hablando de switches si se puede preguntar aqui...

se puede en los CASE poner???

case 1 and 7:
case 1 or 7:
case 1 not 7

Hokutoy

Quote from: Futublog on February 06, 2010, 09:36:28 AM
y hablando de switches si se puede preguntar aqui...

se puede en los CASE poner???

case 1 and 7:
case 1 or 7:
case 1 not 7

No con esa sintaxis.

Puedes usar valores (case 1:), rangos (case 1..10:), multiples valores (case 1,4,5,8:) o multiples rangos (case 1..5, 40..56:)

Igualmente mirate la wiki que creo que viene explicado.

Saludos!

PD: Este es un hilo de dudas... así que cualquier duda es bienvenida.

SplinterGU

#14
caramba, aparentemente funciona... no me acordaba de esto, bueno, por lo menos compila.

edit: ahhh, ya veo...

no funciona como supongo supones que funciona...

lo que hace el compilador es resolver la operacion constante y asignarla al case... en el ejemplo que pusiste seria lo mismo que poner:

case 1:

case 1:

el 3ero no funciona, ya que 1 not 7 no es una expresion permitida.

porque 1 and 7 = 1
y 1 or 7 = 1
Download Lastest BennuGD Release: http://www.bennugd.org/node/2