Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Acerca de valores ¿hexadecimales?

Iniciado por El_Chavo, 15 de Marzo de 2011, 06:56:32 PM

« anterior - próximo »

El_Chavo

Buenas.

Quería preguntar una cosa que siempre me ha tenido intrigado:

en algunos juegos, sobretodo juegos de rol, el jugador puede conseguir objetos con cualidades mágicas y nombres aleatorios.
Generar nombres aleatorios y añadirle cualidades mágicas correspondientes no me parece difícil, sim embargo me he fijado que dichos juegos usan una especie de valor hexadecimal o algo parecido para almacenar la información de las propiedades y características del objeto en cuestión.
También utilizan dichos valores numéricos para otras cosas que tienen algo de aleatoriedad, así, por ejemplo, en un juego llamado "Dungeon Hack", se puede general el mapa de forma aleatoria, parametrizando valores como dificultad de monstruos, número de trampas, cantidad de objetos-tesoro, etc... En este juego, puedes ver la "semilla aleatoria" del nivel que se va a generar, y es algo así como "8756g12hg546ahjh", con números y letras.

La pregunta es: ¿cómo narices puedo usar un método similar para almacenar características aleatorias de los objetos, o qué explicación lógica tienen dichos valores hexadecimales o alfanuméricos? Por que me imagino que no serán cadenas de texto que el engine las vaya dividiendo en partes, como hago yo con cada una de las celdas del mapa de juego.

Lo pregunto por que hasta el momento lo que tengo que hacer es una serie de Select Cases, que en principio no es muy largo, pero que cuando empiece a añadirle al juego nuevas posible scaracterísticas a los objetos, puede convertirse en una lista considerable de Cases.

Vicente

Un generador de numeros aleatorios con la misma semilla siempre genera las mismas cosas aleatorias.

Esas semillas se usaran modificadas, enteras o troceadas como cadenas de bits para inicializar generadores aleatorios de numeros que se usan para construir el juego (por ejemplo en un Dungeon numero de mazmorras, habitaciones, niveles de los bichos,...). Por ejemplo para las habitaciones los primeros 4 bits, para los monstruos los 4 siguientes, etc etc.

El_Chavo

Cita de: Vicente en 15 de Marzo de 2011, 07:25:01 PM
Un generador de numeros aleatorios con la misma semilla siempre genera las mismas cosas aleatorias.

Esas semillas se usaran modificadas, enteras o troceadas como cadenas de bits para inicializar generadores aleatorios de numeros que se usan para construir el juego (por ejemplo en un Dungeon numero de mazmorras, habitaciones, niveles de los bichos,...). Por ejemplo para las habitaciones los primeros 4 bits, para los monstruos los 4 siguientes, etc etc.

Buenas.

Gracias por la info, aunque ya me imaginaba que dichos números eran semillas aleatorias.
La pregunta en realidad es que cómo puedo hacer en Visual Basic para obtener la información de una cadena similar a esas, pudiendo leerla bit a bit o algo similar. Es decir, sin usar split(), ni mid() ni funciones similares de manejo de cadenas alfanuméricas.

Por ejemplo, algo así como

aux = bit(2, cadenaPrueba)

En lo cual se almacena en aux los datos existentes en el bit 2 de la memoria referenciada por cadenaPrueba.

Un saludo.

Hechelion

No sé para que lo quieres hacer sin uso de cadenas, leí algo de tu problema en el otro hilo y aunque es más lento usar los valores como string sigue sin ser un problema, yo uso concatenar, split t mid para construir mensajes, leer información, etc tanto en la carga como en tiempo real y mi juego podía llegar a los 100 FPS en una máquina de sobremesa.

En fin, cada cual sabe donde le aprieta el zapatito, si vas a trabajar con valores NUMÉRICOS (no sirve sobre cadenas) puedes usar los operadores lógicos para separar un bit o un grupo de bit (operas directo en binario).
Bit1 = (valor AND &H1)  /  1
Bit2 = (valor AND &H2)  /  2
Bit3 = (valor AND &H4)  /  4

Byte1 = (Valor AND &HF) / 1
Byte2 = (Valor AND &HF0) / &H10

El_Chavo

Cita de: Hechelion en 16 de Marzo de 2011, 09:35:53 PM
No sé para que lo quieres hacer sin uso de cadenas, leí algo de tu problema en el otro hilo y aunque es más lento usar los valores como string sigue sin ser un problema, yo uso concatenar, split t mid para construir mensajes, leer información, etc tanto en la carga como en tiempo real y mi juego podía llegar a los 100 FPS en una máquina de sobremesa.

El problema es que al tener que realizar concatenaciones 90.000 veces, la cosa se ralentize demasiado.

Cita de: Hechelion en 16 de Marzo de 2011, 09:35:53 PM
En fin, cada cual sabe donde le aprieta el zapatito, si vas a trabajar con valores NUMÉRICOS (no sirve sobre cadenas) puedes usar los operadores lógicos para separar un bit o un grupo de bit (operas directo en binario).
Bit1 = (valor AND &H1)  /  1
Bit2 = (valor AND &H2)  /  2
Bit3 = (valor AND &H4)  /  4

Byte1 = (Valor AND &HF) / 1
Byte2 = (Valor AND &HF0) / &H10

Por lo tanto, (valor AND &H1) / 1 daría como resultado el primer bit de la cadena, no?

Vicente

Cita de: El_Chavo en 17 de Marzo de 2011, 04:41:12 PM
Cita de: Hechelion en 16 de Marzo de 2011, 09:35:53 PM
No sé para que lo quieres hacer sin uso de cadenas, leí algo de tu problema en el otro hilo y aunque es más lento usar los valores como string sigue sin ser un problema, yo uso concatenar, split t mid para construir mensajes, leer información, etc tanto en la carga como en tiempo real y mi juego podía llegar a los 100 FPS en una máquina de sobremesa.

El problema es que al tener que realizar concatenaciones 90.000 veces, la cosa se ralentize demasiado.
[/quote]

Esto hasta que no lo pruebes no lo sabras. De todas formas es para generar el mundo, no pasa nada si tarda un poco...

El_Chavo

Cita de: Vicente en 17 de Marzo de 2011, 04:53:59 PM
Cita de: El_Chavo en 17 de Marzo de 2011, 04:41:12 PM
Cita de: Hechelion en 16 de Marzo de 2011, 09:35:53 PM
No sé para que lo quieres hacer sin uso de cadenas, leí algo de tu problema en el otro hilo y aunque es más lento usar los valores como string sigue sin ser un problema, yo uso concatenar, split t mid para construir mensajes, leer información, etc tanto en la carga como en tiempo real y mi juego podía llegar a los 100 FPS en una máquina de sobremesa.

El problema es que al tener que realizar concatenaciones 90.000 veces, la cosa se ralentize demasiado.

Esto hasta que no lo pruebes no lo sabras. De todas formas es para generar el mundo, no pasa nada si tarda un poco...
[/quote]

Ya lo he provado y va demasiado lento.
Pero ya lo he solucionado con la solución de EX3

Hechelion

#7
Cita de: El_Chavo en 17 de Marzo de 2011, 04:41:12 PM
Cita de: Hechelion en 16 de Marzo de 2011, 09:35:53 PM
No sé para que lo quieres hacer sin uso de cadenas, leí algo de tu problema en el otro hilo y aunque es más lento usar los valores como string sigue sin ser un problema, yo uso concatenar, split t mid para construir mensajes, leer información, etc tanto en la carga como en tiempo real y mi juego podía llegar a los 100 FPS en una máquina de sobremesa.

El problema es que al tener que realizar concatenaciones 90.000 veces, la cosa se ralentize demasiado.
Pero el mapa solo se graba una vez, y 90000 concatenaciones (300*300) no deberían tomarte tanto tiempo, el editor que yo creé, también lo hice en VB6, es multicapa y también guarda la información en archivos de textos planos y no se traba como el tuyo.
10 layer de 256*128 = 327.680 concatenaciones y en mi equipo guardar el mapa no le toma ni 30 segundos.

Si 327.680 concatenaciones no demoran ni medio minuto y tu programa se traba con 90.0000 es porque hay algo mal.

Cita de: El_Chavo en 17 de Marzo de 2011, 04:41:12 PM
Cita de: Hechelion en 16 de Marzo de 2011, 09:35:53 PM
En fin, cada cual sabe donde le aprieta el zapatito, si vas a trabajar con valores NUMÉRICOS (no sirve sobre cadenas) puedes usar los operadores lógicos para separar un bit o un grupo de bit (operas directo en binario).
Bit1 = (valor AND &H1)  /  1
Bit2 = (valor AND &H2)  /  2
Bit3 = (valor AND &H4)  /  4

Byte1 = (Valor AND &HF) / 1
Byte2 = (Valor AND &HF0) / &H10

Por lo tanto, (valor AND &H1) / 1 daría como resultado el primer bit de la cadena, no?
Si, el primero, te sirve para cualquier valor numérico, sea decimal o hexadecimal.

PD: recuerda que el primer bit es el de la derecha.

El_Chavo

Cita de: Hechelion en 17 de Marzo de 2011, 06:55:54 PM
Cita de: El_Chavo en 17 de Marzo de 2011, 04:41:12 PM
Cita de: Hechelion en 16 de Marzo de 2011, 09:35:53 PM
No sé para que lo quieres hacer sin uso de cadenas, leí algo de tu problema en el otro hilo y aunque es más lento usar los valores como string sigue sin ser un problema, yo uso concatenar, split t mid para construir mensajes, leer información, etc tanto en la carga como en tiempo real y mi juego podía llegar a los 100 FPS en una máquina de sobremesa.

El problema es que al tener que realizar concatenaciones 90.000 veces, la cosa se ralentize demasiado.
Pero el mapa solo se graba una vez, y 90000 concatenaciones (300*300) no deberían tomarte tanto tiempo, el editor que yo creé, también lo hice en VB6, es multicapa y también guarda la información en archivos de textos planos y no se traba como el tuyo.
10 layer de 256*128 = 327.680 concatenaciones y en mi equipo guardar el mapa no le toma ni 30 segundos.

Si 327.680 concatenaciones no demoran ni medio minuto y tu programa se traba con 90.0000 es porque hay algo mal.

No se traba, simplemente tarda un siglo en terminar todas las iteraciones, y no es que lo hiciese una sola vez, si no que lo tendría que hacer cada vez que quisiera mostrar una previsualización ASCII del mapa, así que imagínate...

Cita de: Hechelion en 17 de Marzo de 2011, 06:55:54 PM
Cita de: El_Chavo en 17 de Marzo de 2011, 04:41:12 PM
Cita de: Hechelion en 16 de Marzo de 2011, 09:35:53 PM
En fin, cada cual sabe donde le aprieta el zapatito, si vas a trabajar con valores NUMÉRICOS (no sirve sobre cadenas) puedes usar los operadores lógicos para separar un bit o un grupo de bit (operas directo en binario).
Bit1 = (valor AND &H1)  /  1
Bit2 = (valor AND &H2)  /  2
Bit3 = (valor AND &H4)  /  4

Byte1 = (Valor AND &HF) / 1
Byte2 = (Valor AND &HF0) / &H10

Por lo tanto, (valor AND &H1) / 1 daría como resultado el primer bit de la cadena, no?
Si, el primero, te sirve para cualquier valor numérico, sea decimal o hexadecimal.

PD: recuerda que el primer bit es el de la derecha.

Entonces para el siguiente ejemplo:

miCadena = "123abc"
aux = (miCadena And &H1) / 1

la variable aux tendría el valor "c" o daría error, ya que el primer bit es un valor tipo string?

Gracias por la ayuda y perdona las molestias.

Hechelion

#9
Primero, para que la cadena que colocaste en el ejemplo se considere un número hexadecimal debes partir por "&H"  quedaría así:
&H123ABC siendo ese el valor, no vas a tener ningún problema en operarlo.

Segundo, el primer dígito de la derecha (hablando en formato hexadecimal) equivale a un byte no a un bit, recuerda que Byte = 8 bit

(&H123ABC AND &H1) / 1 = 0  'El primer BIT de ese valor es 0

(&H123ABC AND &HF) / 1 = &HC = 12 'El primer byte Nibble completo.

(&H123ABC AND &HF0) / &H10 = &HB = 11

(&H123ABC AND &HF000) / &H1000 = &H3 = 3

y así sucesivamente

Edit:
No sé en que andaba pensando, 2 cifras hexadecimales equivalen a un Byte, cada cifra equivale a 4 bit (un Nibble)
(&H123ABC AND &HFF) / 1 = &HBC = 188 'El primer Byte completo.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.