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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


  Mostrar Temas
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 [13] 14
121  Programación / Programación General / ¿Consejos para hacer videojuego de batallas estilo Final Fantasy 6? en: 25 Abril 2019, 23:58 pm
Aunque al inicio sería con 1 sólo stat: Pow, y no habría speed sino turnos en orden al azar.
Pow es como HP pero también determina el daño. Algunos ataques hacen 10% de daño del Pow del atacante por ejemplo.

Código:
// Datos (nombres de los personajes y su pow inicial):
BondPow = 100;
RuthPow = 100;
// Especificaciones de esta batalla:
P1ID = "Bond";
P1Pow = eval(P1ID+"Pow");
Es = 1;
// Es=Enemigos
E1ID = "Ruth";
E1Pow = eval(E1ID+"Pow");
E1Frozen = 0;
// Cuan congelada está.
function Chose1E () {
// Por ahora sólo para Bond:
if (Key.isDown(65)) {
P1.gotoAndPlay(31);
gotoAndPlay (5);
//Hasta acá esta ok pero hay que corregir el error de "if keep pressing"
}
}

Código:
// Por ahora sólo Bond y Ruth.
if (random(2) >= 0) {
// Eso en realidad es == 0, pero como por ahora estoy programando al personaje del jugador vale cualquier número. Esto determina de quien es el turno.
attachMovie( "D", "D", 11 );
Act = "Bola congelante";
attachMovie( "Puntero", "P", 10 );
D._x = 760.5;
D._y = 300;
P._x = 39.4;
P._y = 300;
// Eso agrega un cuadro de diálogo, pero a modo de pensamiento, que indica qué acción el personaje realizará. Sí, por ahora la acción no se elige. Y también agrega un puntero que indica en donde se aplicará la acción.
} else {
E1.play();
//Add ef
gotoAndPlay (5);
}
Se ve así aunque animado:

Obviamente debo cambiar al personaje de la izquierda y agregar un fondo, pero el puntero va cambiando a color rojo y se mueve suavemente de atrás a adelante, al igual que el diálogo de pensamiento, que además aparece de una forma bonita y tiene algunos efectos de brillantez.

Chose1E();


En cuanto a los niveles, quisiera lograr algo así:
1er nivel: 1 personaje, 1 opción, 1 stat, 1 enemigo.
Para que tenga algo de gracia le pondría que debe realizarse el ataque en menos de 1 minuto...
El 2ndo nivel agregaría algo de lo dicho anteriormente.
122  Programación / Programación General / ¿Consejos para hacer videojuego 2d? en: 25 Abril 2019, 23:35 pm
De peleas y quizá algunas carreras o competiciones varias.

De momento tengo algo así:
Código:
Player.Facing = 1;
Player.Attacking = 0;
Player.Action = 1;
// 0 crouching, 1 nothing, 2 walking, 3 falling, 4 jumping.
function PersControl () {
if (Player.Attacking == 0) {
// Si el personaje no está atacando.
if (Player.Action == 2) {
// Si el personaje está caminando.
if (Key.isDown(65)) {
// Si se presiona A.
Player.SpeedX = 0.9*Player.Facing;
Jump ();
} else if (Key.isDown(83)) {
// Si se presiona S.
Player.gotoAndPlay(2);
Player.Attacking = 1;
Player.Action = 1;
} else if (Key.isDown(39)) {
// Si se presiona derecha.
FaceRight ();
Player._x = Player._x+0.9;
} else if (Key.isDown(37)) {
// Si se presiona izquierda.
FaceLeft ();
Player._x = Player._x-0.9;
} else {
Player.gotoAndStop(1);
Player.Action = 1;
}
} else if (Player.Action == 1) {
// Si el personaje está en reposo.
if (Key.isDown(65)) {
// Si se presiona A.
Player.SpeedX = 0;
Jump ();
} else if (Key.isDown(83)) {
// Si se presiona S.
Player.gotoAndPlay(2);
Player.Attacking = 1;
Player.Action = 1;
} else if (Key.isDown(39)) {
// Si se presiona derecha.
FaceRight ();
Player._x = Player._x+0.9;
Player.gotoAndPlay(35);
Player.Action = 2;
} else if (Key.isDown(37)) {
// Si se presiona izquierda.
FaceLeft ();
Player._x = Player._x-0.9;
Player.gotoAndPlay(35);
Player.Action = 2;
}
} else if (Player.Action == 3) {
// Si el personaje está cayendo.
Player._x = Player._x+Player.SpeedX;
Player.SpeedY = Player.SpeedY+0.1;
Player._y = Player._y+Player.SpeedY;
if ( Player._y >= 554 ) {
// Si el personaje toca el suelo.
Player._y = 554;
Player.gotoAndStop(1);
Player.Action = 1;
}
} else if (Player.Action == 4) {
// Si el personaje está saltando.
if (Key.isDown(65)) {
// Si se presiona A.
Player.SpeedY = Player.SpeedY+0.1;
if (Player.SpeedY >= 0) {
// Si el personaje comienza a caer.
Player.Action = 3;
//Falta animación
}
} else {
// Si se suelta A.
Player.SpeedY = 0.1
Player.Action = 3;
//Falta animación
}
Player._x = Player._x+Player.SpeedX;
Player._y = Player._y+Player.SpeedY;
// faltan otras teclas, no elseif
}
}
}
// Otras funciones.
function FaceRight () {
if (Player.Facing == -1) {
Player.Facing = 1;
Player._xscale = 100;
}
}
function FaceLeft () {
if (Player.Facing == 1) {
Player.Facing = -1;
Player._xscale = -100;
}
}
function Jump () {
// Dada cierta speed esto hace que disminuya??
Player.gotoAndPlay(96);
Player.Action = 4;
Player._x = Player._x+Player.SpeedX;
Player.SpeedY = -4;
Player._y = Player._y+Player.SpeedY;
}

Error:
Luego de caer y "tocar el suelo" (no hice plataformas por ahora pero no sé bien cómo se hace eso de ver si está cayendo y va a tocar una plataforma entonces que deje de caer y vuelva a al estado de reposo), si se sigue manteniendo presionada la tecla a, saltará instantáneamente de nuevo, y para colmo no lo hará hacia una dirección aunque se esté presionando -> o <-.
En otras palabras, luego de esto:
Código:
// Si el personaje toca el suelo.
Player._y = 554;
Player.gotoAndStop(1);
Player.Action = 1;
...el programa cree que el personaje está en reposo y el código está hecho de modo que en tal caso si se presiona la a salta no hacia un costado.

Posible solución:
Poner un if dentro del caso en que se presiona la tecla a en el estado de reposo, de modo que si también se presione una tecla -> o <- el salto sea hacia un costado.
No obstante, en el juego original (8 Eyes), el personaje que estoy copiando, cuando cae se queda agachado unos momentos. Tendré que arreglar varias cosas.
123  Programación / Programación General / ¿Hacer fuerza bruta para ganar en juego similar a Mastermind? en: 18 Abril 2019, 10:21 am
Este post está dividido en 3 partes.
La 1era es esta aclaración,
la 2nda es la clave y la 3era es info extra a quien requiera o le interese.
Además en café puse lo menos importante.


--------------------------------------------------------------------------------------------

El juego es así:
1- Se genera un número al azar de 3 cifras usando números enteros del 0 al 5, sin repetir. Yo no sé el número que se genera (a menos que haga trampa, pero no quiero).
2- Yo elijo un número de dichas condiciones (excepto el ser por azar).
3- El juego informa cuántos números bien colocados (considerando el número elegido por la computadora) puse, y cuántos números están mal colocados.
El paso 2 y 3 se repiten hasta digamos decir 6 códigos fallidos o hasta que yo acierte el número elegido por la compu.

Cuando digo hacer fuerza bruta me refiero a hacer un "programa" (lo digo entre comillas porque más de uno dice que yo no programo, que hago otra cosa) que encuentre las mejores respuestas o algo que luego un humano pueda usar para ganar rápido en el juego, digamos procesos a seguir. Y que además dicho "programa" sea lo más fácil posible de hacer sin importar lo poco eficiente que sea. Pero que además esté hecho en un lenguaje "normal", no en lenguaje máquina.

Bueno, yo hice algunas cosas así, pero esto la verdad me sobrepasa por el tema de las pistas creo (entiendo que es muy vago decirlo así, pero no lo entiendo más que eso), por ahora no sé hacerlo, por eso hago este tema para pedir ayuda.

Lo que hice hace años fue algo así:
Hay un objeto en el punto 0 del eje de las X.
El objetivo es que llegue al 10 en la menor cantidad de movimientos posibles teniendo estos 2:
1: Moverse +1 a la derecha (hacia el 10).
2: Moverse -1 a la izquierda.
Es obvio que conviene usar la acción 1 10 veces, pero mi idea era que el programa lo descubriera sin que yo le diera pistas como "te estás acercando", no me gusta hacer eso porque uno no siempre sabe cuando una acción es buena o mala, prefiero evaluar "desde el final". Mi programa realizaba una acción, si llegaba a una situación nueva generaba un archivo cuyo nombre la describía y el contenido marcaba cual fue la anterior y qué hizo en ella, y se generaba otro archivo que marcaba que esa situación aún no había sido analizada. Tras probar todas las acciones en una situación (reseteándola luego de cada una), se hacía lo mismo pero desde una de esas situaciones no analizadas. El resultado básicamente son archivos así:
1.txt que tiene X=0; Action=1
2.txt que tiene X=1; Action=1
3.txt que tiene X=2; Action=1
etc, hasta
10.txt que tiene X=9; Action=1
Y por supuesto los otros archivos de situaciones por acciones estúpidas como -1.txt por haberse movido hacia atrás.
Cuando el programa llegaba a colocar el objeto en el punto 10, decía la acción que realizó, cargaba la situación anterior, decía la acción que se realizó en ella, y así sucesivamente hasta llegar a la situación inicial.

Eso me parece que es aplicable a "todo":
Hacer un jaque mate, hallar la cura a una enfermedad o a un país mal gobernado, etc.
Si no se puede es porque hay variables desconocidas por ejemplo, pero quizá el mismo método con los ajustes necesarios las puede averiguar, al fin y al cabo es un método para averiguar cosas.
En un foro me plantearon un problema del que sin embargo no podía: Hacer la serie de fibonacci con alguna condición que no creo venga al caso. Quizá no pude porque no lo apliqué bien, pero tampoco creo que venga mucho al caso, aunque por decir algo...:
Si se genera una serie a comprobar si sirve o no, necesito la serie verdadera para hacer esa comprobación. Si no sé cómo es ("variable desonocida") no puedo hacer la comprobación, y si sé cómo es y la voy a usar para hacer comprobaciones entonces qué sentido tiene buscarla.
Es un caso distinto de lo que yo plantee, en que se puede saber qué se quiere pero no cómo conseguirlo, saber el final de una serie pero no la serie en sí que además es irrelevante (pueden ser cualquier números, simplemente dependen de las acciones/situaciones posibles). Sólo porque un número esté bien ya tengo "la serie" (los movimientos para llegar a dicho número), pero en el caso de la serie de fibonacci es necesario que estén bien todos sus números y si no tengo la serie (o no la genero a propósito) no puedo. En fin, no tengo mucha idea de eso (quizá hay una ecuación matemática para saber si un número está en la serie, aunque no se tenga la serie, pero ni idea tampoco, no sé hallar condiciones o efectos aún, sólo hallé series de números basados en el último principalmente).

Y aquí estoy de nuevo con un problema que ese método supuestamente "todo terreno" no sé cómo puede solucionar esto, y si es que no puede, por qué no.

¿Cual sería el método más parecido al mío, que solucionaría el problema?

¿Cómo deben ser los archivos?
Se me ocurre por ejemplo esto:
012,00_345,03_453,03_534.txt
El nombre contiene las acciones realizadas y las pistas recibidas (el contenido en sí del archivo no se me ocurre). ¿pero cómo se generaría eso?

¿Cual es la situación inicial, debo mencionar el número que yo en teoría no conozco? El resultado sería este:
Para el 012 conviene usar 012
Para el 013 conviene usar 013
Inútil.

Necesito que se generen los procesos y contar la cantidad de pasos que requieren en cada caso, o al menos la máxima cantidad de pasos que requiere en un caso.

¿Esos procesos no se pueden describir mediante una línea?

Pero a ver, por ejemplo me serviría que exista un archivo
012,01_304,01_135,02_253,01_541.txt
y otro:
012,01_304,02etc.txt
Suponiendo que iniciar con 012 y luego 304 (si la pista es 01) fuese uno de los procesos que mejor funciona en general. O sea, no necesito que un proceso con todas sus variaciones esté en 1 línea, pueden ser muchas líneas/archivos indicando las diferentes variaciones según las pistas.

Luego de algún modo buscaría los archivos más cortos, de hecho podría ponerles LX al inicio y sustituir X por la cantidad de números que tienen luego.
Entonces si jugando al juego pongo 012 y obtengo 11 busco el proceso 012,11, veo qué dice después, y así sucesivamente.


Algo que se me ocurrió es generar un proceso, que puede ser 012,013,014etc, y contar en todos los casos cuánto tardaría en averiguarlos. Es decir, ignora las pistas. ¿Será esa la respuesta? No creo, sin pistas cualquier proceso puede tardar mucho.

¿Pistas en los nombres de archivos y acciones dentro? No sabría bien cómo contar qué tarda más. Podría eliminar los archivos más largos y ver cual proceso se repite más ¿?
Creo que esto no serviría, iguales pistas pueden obtenerse por distintas situaciones, los archivos serían sustituidos por otros.

Af. dado un número N el proceso P1 tarda 1 paso.
No, tampoco, porque cuando digo proceso me refiero a una línea y si me basara sólo en los que tardan menos obtendría los que por suerte aciertan de una.

En fin, como ven le doy vueltas pero no me sale.


--------------------------------------------------------------------------------------------

MasterMind:
https://es.wikipedia.org/wiki/Mastermind
Más info aquí:
https://en.wikipedia.org/wiki/Mastermind_(board_game)#Algorithms

Ejemplo del juego que dije:
1- Se genera el número 210
2.1- Digo 012
3.1- Me dice 1-2, lo cual significa que hay 1 número bien colocado (el 1, pero yo eso en realidad no puedo saberlo en este punto porque en el caso real no sé el número generado) y 2 mal colocados.
2.2- Debido a que en este caso habría tenido bastante suerte porque acerté cuales números son los presentes, sólo me queda averiguar el orden correcto. Sé que el número es alguno de estos 3: 021, 210 o 102. A partir de ahora es cuestión de probar esos 3, no sé si hay un orden de pruebas mejor que otro.

Búsqueda de modos de ganar antes de hacer este tema:
Quería tener un diagrama de flujo o algo similar:

Dado que habría muchas flechas en cada caso, pensé en hacer algo así:
012__0-0__345__0-3__453__0-3__534
_______________1-2__354__0-3__435__0-3__543
_____0-1

Por otro lado, pensando una explicación para un ejemplo en que me equivoqué, se me ocurrió un método que no me interesa usar en programación pero es interesante:
En cada columna de la siguiente "tabla" están los posibles números de cada cifra:
000
111
222
333
444
555
La mayoría de las posibles pistas nos permiten tachar algunos números.

El ejemplo siempre será 012.

0-1 o 0-2:
_00
1_1
22_
333
444
555

0-3:
_00
1_1
22_
___
___
___

1-0 o 2-0:
0__
_1_
__2
333
444
555

0-0:
___
___
___
333
444
555

1-2:
000
111
222
___
___
___

1-1:
Creo que esta no.
124  Programación / Programación General / Aquí tienen 5 retos y la oportunidad de ayudarme. en: 25 Noviembre 2018, 04:51 am
Reto 1:
Genera una lista así:
1
2
3
4
5
6
1 1
1 2
1 3
1 4
1 5
1 6
2 1
etc
Es como contar pero sólo se usan los números del 1 al 6 y además van separados.


Reto 2:
Genera una lista así:
1
2
3 4
3
3 5
6 7 8
4
3 6
6 7 9
10 11 12 13
etc
La 1era combinación está compuesta de 1 número.
Luego hay otra de 1 número y otra de 2.
Luego otra de 1, de 2, y de 3.
Luego 1, 2, 3, 4.
etc.
En cuanto qué números van en cada una, depende de si el largo de la combinación ya existía o no. Si existía, simplemente se le suma 1 al número final. Si no existía, el 1er número será el mayor que se haya alcanzado hasta ahora, +1.


Reto 3:
Genera una lista así:
1
2
3 4
3
3 5
6 1 2
4
3 6
6 1 3
4 5 6 1
etc
Es como la anterior pero los números van del 1 al 6. Cuando alguno se pasa de 6 vuelve a 1. El considerado máximo número es el último de la combinación que tenga más largo (y se modifica también cuando se está creando una combinación más larga, claro).


Reto 4:
Genera una lista como la anterior pero en la que luego de hacer una combinacion con el método "clásico" (como la lista anterior) se pregunte al usuario si quiere una de un largo aún no alcanzado (método "creativo"). Ej:
1
¿Creativo? Sí. 2 3
2
¿Creativo? No.
2 4
¿Creativo? No.
3
¿Creativo? Sí. 5 6 1.
2 5
etc
El máximo largo del proceso clásico no aumenta porque se creen mayores largos con el proceso creativo, pero si están creados el proceso clásico usa sus números en vez de crearlos.


Reto 5:
Genera una lista como la anterior pero en la cual el máximo de números sea 100 y en los momentos de crear una combinación de nuevo largo no se use el máximo+1 sino... no sé explicarlo pero básicamente el más alejado considerando todos los usados y considerando que forman un circulo (1 está luego de 100, el más alejado de 1 es 50 aproximadamente). Ejemplo aproximado:
1
¿Creativo? Sí. 50 51
2
¿Creativo? Sí. 25 26
25 27
¿Creativo? Sí. 75 76 77
etc
O sea, inicialmente se usa 1 como siempre. Luego lo que esté en medio de 2 y 100, que aproximadamente es 50. Luego 2, clásico. Luego, si se pide creativo o cuando haya que crear, se usa de 3 a 49, o sino de 52 a 100, lo que tenga más cantidad de números. Así sucesivamente. La cantidad de "fragmentos" va aumentando, o sea, 1ero tenemos de 2 a 100. Luego aproximadamente de 2 a 49 y de 51 a 100. Luego de un par de veces tendremos aproximadamente de 1 a 24, de 26 a 49, de 51 a 74, y de 76 a 100.


Yo estoy haciendo algo un poquitito más complicado que el 4. Tengo otro tema creado al respecto, en esta misma sección. Ver cómo harían estas cosas uds me ayudaría. Gracias.
125  Programación / Programación General / ¿Cómo programar mejor? en: 16 Noviembre 2018, 07:04 am
Quiero que un programa muestre todas las posibles combinaciones de 6 ítems pudiendo repetirse infinitamente. Ej:
1
2
3
4
5
6
1 1
1 2
1 3
1 4
etc

Pero quiero que las muestre en cierto orden. Supongamos que fuese así:
Nota: En vez de números se muestran ciertas palabras pero es que los números son convertidos en ellas.
WispG
ShadeG
ShadeG DryadG
DryadG
ShadeG AuraG
AuraG SalaG GnomeG
AuraG
ShadeG SalaG
AuraG GnomeG WispG
WispG ShadeG DryadG AuraG
SalaG
ShadeG GnomeG
AuraG GnomeG ShadeG
WispG ShadeG DryadG SalaG
SalaG GnomeG WispG ShadeG DryadG
GnomeG
DryadG WispG
AuraG GnomeG DryadG
WispG ShadeG DryadG GnomeG
SalaG GnomeG WispG ShadeG AuraG
AuraG SalaG GnomeG WispG ShadeG DryadG
DryadG ShadeG
AuraG GnomeG AuraG
WispG ShadeG AuraG WispG
SalaG GnomeG WispG ShadeG SalaG
AuraG SalaG GnomeG WispG ShadeG AuraG
AuraG SalaG GnomeG WispG ShadeG DryadG AuraG
etc
En realidad sería más bien así:
WispG
ShadeG
DryadG AuraG
DryadG
DryadG SalaG
GnomeG WispG ShadeG
es decir, cada vez que se crea un nuevo largo se inicia con el ítem (o número) más reciente +1.

Eso lo pude hacer:
Nota: Ignoren de él todo lo relativo a "Creative".
Código:
Escena 1
   actions for fotograma 1
      // Ítems.
      Item1 = "WispG";
      Item2 = "ShadeG";
      Item3 = "DryadG";
      Item4 = "AuraG";
      Item5 = "SalaG";
      Item6 = "GnomeG";
      // Parte 1 del experimento de largo 1.
      L1P1 = 0;
      // Último experimento de largo 1 que se hará.
      LastL1 = "GnomeG ";
      // Último ítem usado.
      RecentItem = 1;
      // Relativo al largo de los experimentos...
      // ...del método clásico.
      ClasicMinL = 1;
      ClasicActualL = 1;
      ClasicMaxL = 1;
      ClasicMaxLReached = 1;
      Info = "";
      function Concatenarytrace () {
         // Concatena las partes de los experimentos.
         Print = "";
         Cursor = 0;
         do {
            Cursor = Cursor+1;
            Print = Print+eval("Item"+eval("L"+ClasicActualL+"P"+Cursor))+" ";
         } while (Cursor<ClasicActualL);
         trace (Print);
         Info = "Func dice exp: "+Print+"\n"+Info;
      }
   actions for fotograma 2
      // Cursor indicará la parte última de un experimento.
      Cursor = ClasicActualL;
      Info = "F2: Cursor está en la última P de un exp, "+ClasicActualL+"\n"+Info;
   actions for fotograma 3
      if (eval("L"+ClasicActualL+"P"+Cursor)<6) {
         // Si el char es aumentable, aumenta.
         set ("L"+ClasicActualL+"P"+Cursor, eval("L"+ClasicActualL+"P"+Cursor)+1);
         Concatenarytrace();
         Info = "F3: Exp del método clásico creado fácil: "+Print+"\n"+Info;
         gotoAndPlay (6);
      }
   actions for fotograma 4
      // El char no es aumentable, ergo se resetea.
      set ("L"+ClasicActualL+"P"+Cursor, 1);
      if (1<Cursor) {
         // Si Cursor puede bajar, baja.
         Cursor = Cursor-1;
      } else {
         // Sino, se muestra el reseteado.
         Concatenarytrace();
         gotoAndPlay (6);
      }
   actions for fotograma 5
      if (eval("L"+ClasicActualL+"P"+Cursor)<6) {
         // Si el char es aumentable, aumenta.
         set ("L"+ClasicActualL+"P"+Cursor, eval("L"+ClasicActualL+"P"+Cursor)+1);
         Concatenarytrace();
         gotoAndPlay (6);
      } else {
         // Sino, se resetea y reinicia un proceso.
         gotoAndPlay (4);
      }
   actions for fotograma 6
      // Esto es aftertrace de clasic.
      if (Print == eval("LastL"+ClasicActualL)) {
         // Si el experimento mostrado es igual al grabado como último...
         // ...no se hacen más experimentos con ese largo.
         Info = "F6: Exps de largo "+ClasicMinL+" completados.\n"+Info;
         ClasicMinL = ClasicMinL+1;
      }
      if (CreativeL<=ClasicActualL && ClasicMaxL-1<=ClasicActualL) {
         // Si el largo del último experimento del método creativo...
         // ...es menor o igual al largo de este experimento clásico...
         // ...y ese es igual o mayor al máximo-1 que puede ser...
         // ..., Recentitem cambia.
         RecentItem = eval("L"+ClasicActualL+"P"+ClasicActualL);
         Info = "F6: RecentItem cambiado a "+RecentItem+"\n"+Info;
      }
      if (ClasicActualL<ClasicMaxL) {
         // Si el largo es aumentable, aumenta.
         ClasicActualL = ClasicActualL+1;
         Info = "F6: El siguiente exp de clasic será de Largo "+ClasicActualL+"\n"+Info;
      } else {
         // Sino, quedará al mínimo pero el máximo aumenta.
         ClasicMaxLReached = ClasicMaxL;
         Info = "F6: Clasic alcanzó su máximo L: "+ClasicMaxL+"\n"+Info;
         if (ClasicMaxL<7) {
            // Ese if es sólo para pruebas del code.
            ClasicMaxL = ClasicMaxL+1;
            Info = "F6: Clasic aumentó su máximo L a "+ClasicMaxL+"\n"+Info;
            if (CreativeL<ClasicMaxL) {
               // Si el método creativo no creó un experimento...
               // ...del largo alcanzado por el método clásico...
               // ..., crearlo (no se usará aún) y marcar que será...
               // ...el último experimento de ese largo.
               Info = "F6: Clasic llegó a un L mayor que creative: "+ClasicMaxL+" > "+CreativeL+"\n"+Info;
               set ("LastL"+ClasicMaxL, "");
               Cursor = 1;
               // Cálculo del ítem más recientemente usado.
               NextRecentItem = eval("L"+ClasicActualL+"P"+ClasicActualL);
               do {
                  NextRecentItem = NextRecentItem+1;
                  if (6<NextRecentItem) {
                     // Si resulta un ítem inexistente, arreglarlo.
                     NextRecentItem = NextRecentItem-((Math.floor(NextRecentItem/6))*6);
                  }
                  set ("L"+ClasicMaxL+"P"+Cursor, NextRecentItem);
                  set ("LastL"+ClasicMaxL, eval("LastL"+ClasicMaxL)+eval("Item"+NextRecentItem)+" ");
                  Cursor = Cursor+1;
               } while (Cursor<ClasicMaxL);
               set ("L"+ClasicMaxL+"P"+Cursor, NextRecentItem);
               set ("LastL"+ClasicMaxL, eval("LastL"+ClasicMaxL)+eval("Item"+NextRecentItem)+" ");
            }
         }
         ClasicActualL = ClasicMinL;
         Info = "F6: El siguiente exp de clasic será de Largo "+ClasicMinL+"\n"+Info;
         Info = "F6: Está listo el exp de máx L: "+eval("LastL"+ClasicMaxL)+"\n"+Info;
      }
      gotoAndPlay (2);
O sea, este programa produce la 2nda lista. Sería más correcto que produzca la 3era, pero lo que pasa es que este programa es parte de otro y no viene mucho al caso ver qué debería modificar para que produzca la 3era. Ya fue. Pero si ven algo que pueda simplificarse no duden en decirlo.

Entendidas las listas anteriores podemos pasar a la que me interesa. Es como la anterior pero en X circunstancias (no se preocupen por X) se produce otro método de selección: Creativo. Así:
WispG
Creativo:   ShadeG DryadG
ShadeG
ShadeG AuraG
Creativo:   SalaG GnomeG WispG
DryadG
ShadeG SalaG
SalaG GnomeG ShadeG
Creativo:   DryadG AuraG SalaG GnomeG
AuraG
ShadeG GnomeG
SalaG GnomeG DryadG
DryadG AuraG GnomeG WispG
Creativo:   ShadeG DryadG AuraG SalaG GnomeG
SalaG
DryadG WispG
SalaG GnomeG AuraG
DryadG AuraG GnomeG ShadeG
ShadeG DryadG AuraG GnomeG WispG
Creativo:   ShadeG DryadG AuraG SalaG GnomeG WispG
GnomeG
DryadG ShadeG
SalaG GnomeG SalaG
DryadG AuraG GnomeG DryadG
ShadeG DryadG AuraG GnomeG ShadeG
ShadeG DryadG AuraG SalaG GnomeG ShadeG
Creativo:   DryadG AuraG SalaG GnomeG WispG ShadeG DryadG
DryadG DryadG
SalaG GnomeG GnomeG
DryadG AuraG GnomeG AuraG
ShadeG DryadG AuraG GnomeG DryadG
ShadeG DryadG AuraG SalaG GnomeG DryadG
DryadG AuraG SalaG GnomeG WispG ShadeG AuraG
GnomeG WispG WispG
etc

Eso se logra quitando el goto del final y agregando esto:
   actions for fotograma 7
      TimeforCreative = TimeforCreative-1;
      if (TimeforCreative<=0) {
         // Elección creativa.
         if (CreativeL<7) {
            // Ese if es sólo para pruebas del code.
            CreativeL = CreativeL+1;
            if (CreativeL<ClasicMaxLReached) {
               // Si el método creativo no creó un...
               // ...experimento de largo mayor al...
               // ...del método clásico, aumentarlo.
               CreativeL = ClasicMaxLReached+1;
            }
            Info = "F7: Elección creativa de largo "+CreativeL+"\n"+Info;
            set ("LastL"+CreativeL, "");
            Cursor = 1;
            Print = "";
            do {
               RecentItem = RecentItem+1;
               if (6<RecentItem) {
                  // Si resulta un ítem inexistente, arreglarlo.
                  RecentItem = RecentItem-((Math.floor(RecentItem/6))*6);
               }
               set ("L"+CreativeL+"P"+Cursor, RecentItem);
               set ("LastL"+CreativeL, eval("LastL"+CreativeL)+eval("Item"+RecentItem)+" ");
               Cursor = Cursor+1;
            } while (Cursor<CreativeL);
            Print = eval("LastL"+CreativeL);
            set ("LastL"+CreativeL, eval("LastL"+CreativeL)+eval("Item"+RecentItem)+" ");
            Info = "F7: Last creado: "+eval("LastL"+CreativeL)+"\n"+Info;
            RecentItem = RecentItem+1;
            if (6<RecentItem) {
               // Si resulta un ítem inexistente, arreglarlo.
               RecentItem = RecentItem-((Math.floor(RecentItem/6))*6);
            }
            set ("L"+CreativeL+"P"+Cursor, RecentItem);
            Print = Print+eval("Item"+RecentItem)+" ";
            trace ("Creativo:\t"+Print);
            Info = "F7: Método creativo creó exp "+Print+"\n"+Info;
            Info = "F7: RecentItem es "+RecentItem+".\n"+Info;
         } else {
            gotoAndPlay (2);
            Info = "F7: Método creativo alcanzó el máximo.\n"+Info;
         }
      } else {
         Info = "F7: Para la elección creativa falta "+TimeforCreative+"\n"+Info;
         gotoAndPlay (2);
      }
   actions for fotograma 8
      stop ();

En el F8 se determina si hay Creative o no, pero no den bola a eso. Una vez determinado vuelve al frame 2.

En este caso creo que no hay errores en cuanto a usar ítems diferentes cuando inicia un nuevo largo. De hecho eso parece suceder siempre con Creative e imposible de otro modo.
Lo señalado en rojo sí es un error que de momento no sé corregir. El programa debería mostrar más combinaciones de 2, pero por algún motivo cree que las mostró todas. Más info:
F2: Cursor está en la última P de un exp, 1
Func dice exp: WispG
F3: Exp del método clásico creado fácil: WispG
F6: RecentItem cambiado a 1
F6: Clasic alcanzó su máximo L: 1
F6: Clasic aumentó su máximo L a 2
F6: Clasic llegó a un L mayor que creative: 2 > 1
F6: El siguiente exp de clasic será de Largo 1
F6: Está listo el exp de máx L: ShadeG ShadeG
F7: Elección creativa de largo 2
F7: Last creado: ShadeG ShadeG
F7: Método creativo creó exp ShadeG DryadG
F7: RecentItem es 3.
F2: Cursor está en la última P de un exp, 1
Func dice exp: ShadeG
F3: Exp del método clásico creado fácil: ShadeG
F6: El siguiente exp de clasic será de Largo 2
F7: Para la elección creativa falta 1
F2: Cursor está en la última P de un exp, 2
Func dice exp: ShadeG AuraG
F3: Exp del método clásico creado fácil: ShadeG AuraG
F6: RecentItem cambiado a 4
F6: Clasic alcanzó su máximo L: 2
F6: Clasic aumentó su máximo L a 3
F6: Clasic llegó a un L mayor que creative: 3 > 2
F6: El siguiente exp de clasic será de Largo 1
F6: Está listo el exp de máx L: SalaG GnomeG GnomeG
F7: Elección creativa de largo 3
F7: Last creado: SalaG GnomeG GnomeG
F7: Método creativo creó exp SalaG GnomeG WispG

F7: RecentItem es 1.
F2: Cursor está en la última P de un exp, 1
Func dice exp: DryadG
F3: Exp del método clásico creado fácil: DryadG
F6: El siguiente exp de clasic será de Largo 2
F7: Para la elección creativa falta 2
F2: Cursor está en la última P de un exp, 2
Func dice exp: ShadeG SalaG
F3: Exp del método clásico creado fácil: ShadeG SalaG
F6: El siguiente exp de clasic será de Largo 3
F7: Para la elección creativa falta 1
F2: Cursor está en la última P de un exp, 3
Func dice exp: SalaG GnomeG ShadeG
F3: Exp del método clásico creado fácil: SalaG GnomeG ShadeG
F6: RecentItem cambiado a 2
F6: Clasic alcanzó su máximo L: 3
F6: Clasic aumentó su máximo L a 4
F6: Clasic llegó a un L mayor que creative: 4 > 3
F6: El siguiente exp de clasic será de Largo 1
F6: Está listo el exp de máx L: DryadG AuraG SalaG SalaG
F7: Elección creativa de largo 4
F7: Last creado: DryadG AuraG SalaG SalaG
F7: Método creativo creó exp DryadG AuraG SalaG GnomeG
F7: RecentItem es 6.
F2: Cursor está en la última P de un exp, 1
Func dice exp: AuraG
F3: Exp del método clásico creado fácil: AuraG
F6: El siguiente exp de clasic será de Largo 2
F7: Para la elección creativa falta 3
F2: Cursor está en la última P de un exp, 2
Func dice exp: ShadeG GnomeG
F3: Exp del método clásico creado fácil: ShadeG GnomeG
F6: El siguiente exp de clasic será de Largo 3
F7: Para la elección creativa falta 2
F2: Cursor está en la última P de un exp, 3
Func dice exp: SalaG GnomeG DryadG
F3: Exp del método clásico creado fácil: SalaG GnomeG DryadG
F6: El siguiente exp de clasic será de Largo 4
F7: Para la elección creativa falta 1
F2: Cursor está en la última P de un exp, 4
Func dice exp: DryadG AuraG GnomeG WispG
F6: RecentItem cambiado a 1
F6: Clasic alcanzó su máximo L: 4
F6: Clasic aumentó su máximo L a 5
F6: Clasic llegó a un L mayor que creative: 5 > 4
F6: El siguiente exp de clasic será de Largo 1
F6: Está listo el exp de máx L: ShadeG DryadG AuraG SalaG SalaG
F7: Elección creativa de largo 5
F7: Last creado: ShadeG DryadG AuraG SalaG SalaG
F7: Método creativo creó exp ShadeG DryadG AuraG SalaG GnomeG
F7: RecentItem es 6.
F2: Cursor está en la última P de un exp, 1
Func dice exp: SalaG
F3: Exp del método clásico creado fácil: SalaG
F6: El siguiente exp de clasic será de Largo 2
F7: Para la elección creativa falta 4
F2: Cursor está en la última P de un exp, 2
Func dice exp: DryadG WispG
F6: El siguiente exp de clasic será de Largo 3
F7: Para la elección creativa falta 3
F2: Cursor está en la última P de un exp, 3
Func dice exp: SalaG GnomeG AuraG
F3: Exp del método clásico creado fácil: SalaG GnomeG AuraG
F6: El siguiente exp de clasic será de Largo 4
F7: Para la elección creativa falta 2
F2: Cursor está en la última P de un exp, 4
Func dice exp: DryadG AuraG GnomeG ShadeG
F3: Exp del método clásico creado fácil: DryadG AuraG GnomeG ShadeG
F6: El siguiente exp de clasic será de Largo 5
F7: Para la elección creativa falta 1
F2: Cursor está en la última P de un exp, 5
Func dice exp: ShadeG DryadG AuraG GnomeG WispG
F6: RecentItem cambiado a 1
F6: Clasic alcanzó su máximo L: 5
F6: Clasic aumentó su máximo L a 6
F6: Clasic llegó a un L mayor que creative: 6 > 5
F6: El siguiente exp de clasic será de Largo 1
F6: Está listo el exp de máx L: ShadeG DryadG AuraG SalaG GnomeG GnomeG
F7: Elección creativa de largo 6
F7: Last creado: ShadeG DryadG AuraG SalaG GnomeG GnomeG
F7: Método creativo creó exp ShadeG DryadG AuraG SalaG GnomeG WispG
F7: RecentItem es 1.
F2: Cursor está en la última P de un exp, 1
Func dice exp: GnomeG
F3: Exp del método clásico creado fácil: GnomeG
F6: Exps de largo 1 completados.
F6: El siguiente exp de clasic será de Largo 2
F7: Para la elección creativa falta 5
F2: Cursor está en la última P de un exp, 2
Func dice exp: DryadG ShadeG
F3: Exp del método clásico creado fácil: DryadG ShadeG
F6: El siguiente exp de clasic será de Largo 3
F7: Para la elección creativa falta 4
F2: Cursor está en la última P de un exp, 3
Func dice exp: SalaG GnomeG SalaG
F3: Exp del método clásico creado fácil: SalaG GnomeG SalaG
F6: El siguiente exp de clasic será de Largo 4
F7: Para la elección creativa falta 3
F2: Cursor está en la última P de un exp, 4
Func dice exp: DryadG AuraG GnomeG DryadG
F3: Exp del método clásico creado fácil: DryadG AuraG GnomeG DryadG
F6: El siguiente exp de clasic será de Largo 5
F7: Para la elección creativa falta 2
F2: Cursor está en la última P de un exp, 5
Func dice exp: ShadeG DryadG AuraG GnomeG ShadeG
F3: Exp del método clásico creado fácil: ShadeG DryadG AuraG GnomeG ShadeG
F6: El siguiente exp de clasic será de Largo 6
F7: Para la elección creativa falta 1
F2: Cursor está en la última P de un exp, 6
Func dice exp: ShadeG DryadG AuraG SalaG GnomeG ShadeG
F3: Exp del método clásico creado fácil: ShadeG DryadG AuraG SalaG GnomeG ShadeG
F6: RecentItem cambiado a 2
F6: Clasic alcanzó su máximo L: 6
F6: Clasic aumentó su máximo L a 7
F6: Clasic llegó a un L mayor que creative: 7 > 6
F6: El siguiente exp de clasic será de Largo 2
F6: Está listo el exp de máx L: DryadG AuraG SalaG GnomeG WispG ShadeG ShadeG
F7: Elección creativa de largo 7
F7: Last creado: DryadG AuraG SalaG GnomeG WispG ShadeG ShadeG
F7: Método creativo creó exp DryadG AuraG SalaG GnomeG WispG ShadeG DryadG
F7: RecentItem es 3.
F2: Cursor está en la última P de un exp, 2
Func dice exp: DryadG DryadG
F3: Exp del método clásico creado fácil: DryadG DryadG
F6: El siguiente exp de clasic será de Largo 3
F7: Para la elección creativa falta 6
F2: Cursor está en la última P de un exp, 3
Func dice exp: SalaG GnomeG GnomeG
F3: Exp del método clásico creado fácil: SalaG GnomeG GnomeG
F6: Exps de largo 2 completados.

Ya lo veo más o menos. Luego de establecer el último exp de largo 3, SalaG GnomeG GnomeG, el exp que se produce es ese sumándole 1 a la última parte, lo que daría GnomeG WispG WispG, pero da SalaG GnomeG WispG porque programé mal la suma... o mejor dicho no me di cuenta que fuese necesario eso. Ahora entonces lo que está en los 1eros frames lo tengo que aplicar más adelante también. Deberé crear otra función o algo. Lioso ¿no? ¿será que programar funciones desde el inicio es mejor? Pero entiendo más si veo un flujo del código, sin tener que ir a otro lado a ver qué hace cada función.

Ah, y acabo de darme cuenta que en los frames 4 y 5 no he puesto "Info". Es que las puse buscando un error que supuse no estaba ahí. Un error difícil de hallar: En un if del F6 había escrito "Crative" en vez de Creative >___<
126  Programación / Programación General / ¿Cómo captar los pares de una combinación de varios? en: 18 Octubre 2018, 07:03 am
O algo así.

El juego Legend of Mana de Play tiene un sistema de modificación de armas/armaduras en el cual puedes agregar cosas a ellas infinitamente, pero algunas cosas perjudican al equipo y algunos resultados sólo ocurren cuando se cumplen ciertos requisitos. Hay guías de esto, pero quiero hacer una investigación por mi mismo, la cual implica probar diferentes combinaciones en el juego.

Supongamos que sólo hay X cantidad de ítems y cada uno se llama como una letra, distinta. X es la cantidad de letras. Qué pruebas hacer y en qué orden es todo un tema, yo diría que aparte, pero si quieren lo hablamos. La cuestión es que quiero usar un método más o menos óptimo, o sea, esta serie de pruebas:
A
B+C
D+E+F
G+H+I+J
...etc, parece más óptimo que esta:
A
A+A
A+B
A+C
...parece, pero bue, digamos que sí es.

Yo uso una serie más o menos así:
A
B
C+D
E
F+G
H+I+J

Cuando haya probado todos los elementos (aún no las combinaciones), quiero que las próximas combinaciones sean de elementos que aún no se hayan combinado. Por ejemplo en este caso, I+H debería probarse posteriormente a I+F, porque en cierto modo ya fue probado en H+I+J (no es que a priori pueda concluirse el resultado, pero por una cuestión de probabilidad y lógica tiene sentido probar algo más diferente).

A medida que avance, cada vez me será más complicado ver qué pares de elementos probé y cuales no, por eso quisiera algo que si yo le escribo por ejemplo A+B+C me devuelva
AB
AC
BC

Ahora que pienso es algo de permutaciones o algo así, pensé que era un problema más extraño... pero en lo posible no quiero programar tanto, hice una tabla en Excel donde marco con un número las veces que ciertos elementos se combinaron, y le puse un sumador así que busco los que tienen 0 y así sucesivamente. Me gustaría que de alguna forma esos números se escribieran solos, o sea, supongamos que la tabla sólo tuviera 3 elementos:
_____A__B__C
_____0__0__0
A_0
B_0
C_0
Los 0 son las sumas. En las filas, las veces que ese elemento se combinó con otro y estuvo antes. En las columnas, lo mismo pero si estuvo después.

En un texto aparte voy anotando las combinaciones y los resultados:
A: Poder de ataque+1, esencia de fuego+1, etc.
B: Poder de ataque+1, técnica+1, etc.
C+A: Poder de ataque+2, esencia de fuego+1. etc.
etc

Luego marco en la tabla las cosas que se combinaron:
_____A__B__C
_____0__0__0
A_0
B_0
C_1__1

Yo quisiera que de alguna forma, si es posible, escriba el texto, y luego esos números aparezcan.
Por ejemplo escriba C+A y se le sume 1 a lo que haya en la celda correspondiente.

El texto puede estar en celdas separadas, es decir, cada elemento en una celda, lo puedo ir poniendo en otra hoja.

Si en Excel es muy complicado o imposible, bueno, lo pensaré en algo más "técnico", de hecho está bueno si pudiera hacer que las selecciones de qué elementos combinar se hicieran automáticamente, no tendría que andar viendo cuales tienen menos uso ni anotando tanto en la tabla...


Nos veremos.
127  Programación / Programación General / (Resuelto): Errores en generador de sentencias condicionales. en: 18 Agosto 2018, 04:21 am
EDIT:
Solución en el 2ndo post. Dejo el tema por si a alguno le interesa, pero si quieren bórrenlo o ciérrenlo.

El resultado que intenté obtener sería así:
Citar
V1 < V1
V1 < V2
V1 <= V1
V1 <= V2
V1 == V1
V1 == V2
V1 != V1
V1 != V2
V1 < V1
V2 < V1
V1 <= V1
V2 <= V1
V2 < V1
V2 < V2
V2 <= V1
V2 <= V2
V2 == V1
V2 == V2
V2 != V1
V2 != V2
V1 < V2
V2 < V2
V1 <= V2
V2 <= V2

24
2 variables * 6 símbolos * 2 variables

V1 < V1 && V1 < V1
V1 < V1 && V1 < V2
V1 < V1 && V1 < V3
V1 < V1 && V1 < V4
V1 < V1 && V1 <= V1
V1 < V1 && V1 <= V2
V1 < V1 && V1 <= V3
V1 < V1 && V1 <= V4
V1 < V1 && V1 == V1
V1 < V1 && V1 == V2
V1 < V1 && V1 == V3
V1 < V1 && V1 == V4
V1 < V1 && V1 != V1
V1 < V1 && V1 != V2
V1 < V1 && V1 != V3
V1 < V1 && V1 != V4
V1 < V1 && V1 < V1
V1 < V1 && V2 < V1
V1 < V1 && V3 < V1
V1 < V1 && V4 < V1
V1 < V1 && V1 <= V1
V1 < V1 && V2 <= V1
V1 < V1 && V3 <= V1
V1 < V1 && V4 <= V1
V1 < V1 && V2 < V1
V1 < V1 && V2 < V2
V1 < V1 && V2 < V3
V1 < V1 && V2 < V4
V1 < V1 && V2 <= V1
V1 < V1 && V2 <= V2
V1 < V1 && V2 <= V3
V1 < V1 && V2 <= V4
V1 < V1 && V2 == V1
V1 < V1 && V2 == V2
V1 < V1 && V2 == V3
V1 < V1 && V2 == V4
V1 < V1 && V2 != V1
V1 < V1 && V2 != V2
V1 < V1 && V2 != V3
V1 < V1 && V2 != V4
V1 < V1 && V1 < V2
V1 < V1 && V2 < V2
V1 < V1 && V3 < V2
V1 < V1 && V4 < V2
V1 < V1 && V1 <= V2
V1 < V1 && V2 <= V2
V1 < V1 && V3 <= V2
V1 < V1 && V4 <= V2
V1 < V1 && V3 < V1
V1 < V1 && V3 < V2
V1 < V1 && V3 < V3
V1 < V1 && V3 < V4
V1 < V1 && V3 <= V1
V1 < V1 && V3 <= V2
V1 < V1 && V3 <= V3
V1 < V1 && V3 <= V4
V1 < V1 && V3 == V1
V1 < V1 && V3 == V2
V1 < V1 && V3 == V3
V1 < V1 && V3 == V4
V1 < V1 && V3 != V1
V1 < V1 && V3 != V2
V1 < V1 && V3 != V3
V1 < V1 && V3 != V4
V1 < V1 && V1 < V3
V1 < V1 && V2 < V3
V1 < V1 && V3 < V3
V1 < V1 && V4 < V3
V1 < V1 && V1 <= V3
V1 < V1 && V2 <= V3
V1 < V1 && V3 <= V3
V1 < V1 && V4 <= V3
V1 < V1 && V4 < V1
V1 < V1 && V4 < V2
V1 < V1 && V4 < V3
V1 < V1 && V4 < V4
V1 < V1 && V4 <= V1
V1 < V1 && V4 <= V2
V1 < V1 && V4 <= V3
V1 < V1 && V4 <= V4
V1 < V1 && V4 == V1
V1 < V1 && V4 == V2
V1 < V1 && V4 == V3
V1 < V1 && V4 == V4
V1 < V1 && V4 != V1
V1 < V1 && V4 != V2
V1 < V1 && V4 != V3
V1 < V1 && V4 != V4
V1 < V1 && V1 < V4
V1 < V1 && V2 < V4
V1 < V1 && V3 < V4
V1 < V1 && V4 < V4
V1 < V1 && V1 <= V4
V1 < V1 && V2 <= V4
V1 < V1 && V3 <= V4
V1 < V1 && V4 <= V4
V1 < V1 or V1 < V1
V1 < V1 or V1 < V2
V1 < V1 or V1 < V3
V1 < V1 or V1 < V4
V1 < V1 or V1 <= V1
V1 < V1 or V1 <= V2
V1 < V1 or V1 <= V3
V1 < V1 or V1 <= V4
V1 < V1 or V1 == V1
V1 < V1 or V1 == V2
V1 < V1 or V1 == V3
V1 < V1 or V1 == V4
V1 < V1 or V1 != V1
V1 < V1 or V1 != V2
V1 < V1 or V1 != V3
V1 < V1 or V1 != V4
V1 < V1 or V1 < V1
V1 < V1 or V2 < V1
V1 < V1 or V3 < V1
V1 < V1 or V4 < V1
V1 < V1 or V1 <= V1
V1 < V1 or V2 <= V1
V1 < V1 or V3 <= V1
V1 < V1 or V4 <= V1
V1 < V1 or V2 < V1
V1 < V1 or V2 < V2
V1 < V1 or V2 < V3
V1 < V1 or V2 < V4
V1 < V1 or V2 <= V1
V1 < V1 or V2 <= V2
V1 < V1 or V2 <= V3
V1 < V1 or V2 <= V4
V1 < V1 or V2 == V1
V1 < V1 or V2 == V2
V1 < V1 or V2 == V3
V1 < V1 or V2 == V4
V1 < V1 or V2 != V1
V1 < V1 or V2 != V2
V1 < V1 or V2 != V3
V1 < V1 or V2 != V4
V1 < V1 or V1 < V2
V1 < V1 or V2 < V2
V1 < V1 or V3 < V2
V1 < V1 or V4 < V2
V1 < V1 or V1 <= V2
V1 < V1 or V2 <= V2
V1 < V1 or V3 <= V2
V1 < V1 or V4 <= V2
V1 < V1 or V3 < V1
V1 < V1 or V3 < V2
V1 < V1 or V3 < V3
V1 < V1 or V3 < V4
V1 < V1 or V3 <= V1
V1 < V1 or V3 <= V2
V1 < V1 or V3 <= V3
V1 < V1 or V3 <= V4
V1 < V1 or V3 == V1
V1 < V1 or V3 == V2
V1 < V1 or V3 == V3
V1 < V1 or V3 == V4
V1 < V1 or V3 != V1
V1 < V1 or V3 != V2
V1 < V1 or V3 != V3
V1 < V1 or V3 != V4
V1 < V1 or V1 < V3
V1 < V1 or V2 < V3
V1 < V1 or V3 < V3
V1 < V1 or V4 < V3
V1 < V1 or V1 <= V3
V1 < V1 or V2 <= V3
V1 < V1 or V3 <= V3
V1 < V1 or V4 <= V3
V1 < V1 or V4 < V1
V1 < V1 or V4 < V2
V1 < V1 or V4 < V3
V1 < V1 or V4 < V4
V1 < V1 or V4 <= V1
V1 < V1 or V4 <= V2
V1 < V1 or V4 <= V3
V1 < V1 or V4 <= V4
V1 < V1 or V4 == V1
V1 < V1 or V4 == V2
V1 < V1 or V4 == V3
V1 < V1 or V4 == V4
V1 < V1 or V4 != V1
V1 < V1 or V4 != V2
V1 < V1 or V4 != V3
V1 < V1 or V4 != V4
V1 < V1 or V1 < V4
V1 < V1 or V2 < V4
V1 < V1 or V3 < V4
V1 < V1 or V4 < V4
V1 < V1 or V1 <= V4
V1 < V1 or V2 <= V4
V1 < V1 or V3 <= V4
V1 < V1 or V4 <= V4

192
1 * 1 * 1 * 2 * 4 * 6 * 4
Luego variarían las cosas que están en la izquierda, o sea, así debería ser:
4 * 6 * 4 * 2 * 4 * 6 * 4

Luego se agregarían partes, como ya se ha visto.
V1 < V1 && V1 < V1 or V1 < V1
V1 < V1 && V1 < V1 or V1 < V2
V1 < V1 && V1 < V1 or V1 < V3
etc.
6 * 6 * 6 * 2 * 6 * 6 * 6 * 2 * 6 * 6 * 6

NOTA: Luego del símbolo "!=" viene ">" y luego "=>" pero yo los invertí ("<" y "<=") y también al orden de las variables. Puede ser confuso a la vista pero no hay problema con eso.

Esto es lo que obtuve:
Citar
V1 < V1
(ok)
V2 <= V2
V1 < V1 && V1 < V1
(ok)
V1 < V1 && V4 <= V4
V1 < V1 or V1 < V1
V1 < V2 or V1 < V1
V1 < V3 or V1 < V1
V1 < V4 or V1 < V1
(eso está mal)
V4 <= V4 or V1 < V1
V1 < V1 && V1 < V1 or V1 < V1
(esto está mal también)
El 1er error es que se salteó las combinaciones
V1 < V2 && V1 < V1
V1 < V3 && V1 < V1
V1 < V4 && V1 < V1
O sea, es como si hubiera hecho
1111464
1112111
1122111
1132111
1142111
o sea... en el 1er número, desde el 2 todo estaba al máximo, como si fuese
1119999
pero en vez de hacer
1112111
1112112
1112113
1112114
aumentó las cosas de la izquierda.

El 2ndo error es que pasó de
4642111
a
11111112111

Es horroroso. Es más o menos como si hubiese hecho
9999111
10090000
O sea se salteó cosas y no reseteó un número. Son 2 errores. Debería ser
4642464
11111111111

Este es el código (action script de Macromedia Flash 5 if that really matters)
Código:
Escena 1
   actions for fotograma 1
      // Subcondiciones en la condición.
      SCs = 1;
      // Valores de las partes de la SC.
      SC1P1 = 1;
      SC1P2 = 1;
      SC1P3 = 0;
      // Cosas para evitar ifs.
      Op1 = " < ";
      Op2 = " <= ";
      Op3 = " == ";
      Op4 = " != ";
      Op5 = " > ";
      Op6 = " => ";
      Rel1 = " && ";
      Rel2 = " or ";
      Cursor1 = 1;
      Cursor2 = 3;
      function PrintCond () {
         Cursor3 = 1;
         Print = "";
         while (Cursor3<SCs) {
            if (eval("SC"+Cursor3+"P2")<5) {
               Print = "V"+eval("SC"+Cursor3+"P1")+eval("Op"+eval("SC"+Cursor3+"P2"))+"V"+eval("SC"+Cursor3+"P3")+eval("Rel"+eval("SC"+Cursor3+"P4"))+Print;
            } else {
               Print = "V"+eval("SC"+Cursor3+"P3")+eval("Op"+(eval("SC"+Cursor3+"P2")-4))+"V"+eval("SC"+Cursor3+"P1")+eval("Rel"+eval("SC"+Cursor3+"P4"))+Print;
            }
            Cursor3 = Cursor3+1;
         }
         if (eval("SC"+Cursor3+"P2")<5) {
            Print = Print+"V"+eval("SC"+Cursor3+"P1")+eval("Op"+eval("SC"+Cursor3+"P2"))+"V"+eval("SC"+Cursor3+"P3");
         } else {
            Print = Print+"V"+eval("SC"+Cursor3+"P3")+eval("Op"+(eval("SC"+Cursor3+"P2")-4))+"V"+eval("SC"+Cursor3+"P1");
         }
         trace (Print);
      }
   actions for fotograma 2
      if (Cursor2 == 1 or Cursor2 == 3) {
         MaxValor = SCs*2;
      } else if (Cursor2 == 2) {
         MaxValor = 6;
      } else {
         MaxValor = 2;
      }
      if (eval("SC"+Cursor1+"P"+Cursor2)<MaxValor) {
         set ("SC"+Cursor1+"P"+Cursor2, eval("SC"+Cursor1+"P"+Cursor2)+1);
         PrintCond();
         Cursor2 = 3;
      } else {
         set ("SC"+Cursor1+"P"+Cursor2, 1);
         if (Cursor2>1) {
            Cursor2 = Cursor2-1;
         } else if (Cursor1>1) {
            Cursor1 = Cursor1-1;
            Cursor2 = 4;
         } else {
            set ("SC"+SCs+"P4", 1);
            SCs = SCs+1;
            Cursor1 = SCs;
            Cursor2 = 3;
            set ("SC"+SCs+"P1", 1);
            set ("SC"+SCs+"P2", 1);
            set ("SC"+SCs+"P3", 1);
            PrintCond();
         }
      }
   actions for fotograma 3
      gotoAndPlay (2);
Lo voy a revisar pero si alguien ve fácil cómo corregirlo, bien por él. Y si me dice acá pronto cómo se haría dicha corrección, buenísimo.
128  Foros Generales / Foro Libre / Ayuda: Hallar texto en japonés, o copiarlo/traducirlo de imagenes. en: 11 Agosto 2018, 02:42 am
El texto se ve en la versión japonesa del juego 8 Eyes de NES.

Aquí hay parte:


El resto aquí:
https://www25.atwiki.jp/famicomall/pages/300.html

Hay una versión en inglés del juego pero si uno lee la historia que dice el manual, la wikipedia, y en definitiva todo lo que hallé distinto a japonés, y luego lee la historia que aparece en páginas japonesas (eso no está en una imagen, por eso lo pude traducir con Chrome) nota una diferencia abismal, por lo que la "traducción" que hayan puesto en dicha versión puede que sea distinta a lo que corresponde.

Como dice el título me serviría:
A- Hallar el texto en japonés o pistas para hallarlo, o sea, no en una imagen sino que "normal", cosa de poder copiarlo y pegarlo en un traductor de textos así.
El juego en japonés se escribe:
エイト・アイズ
Usando el traductor lo busqué conjuntamente con "ending", "final", "end", o sea, esas palabras pero en japonés, pero por ahora no hallé lo que busco. (Bastante normal: ¿Quién escribiría el texto si existen las imagenes?).
También usando una página para escribir en japonés escribí parte del texto y lo busqué con el nombre del juego pero no me apareció algo. Escribir el texto me pareció desagradable y largo, o sea, cada letra hay que buscar dónde está en el abecedario, pero algunas son un poco distintas del juego, y encima la página tiene 2 abecedarios y cuando cambias se borra lo escrito (se puede copiar y pegar). O sea, esta es la página:
https://www.lexilogos.com/keyboard/japanese.php
...posiblemente hay otras mejores pero por ahora sólo probé esa.
B- Un link a un programa que capte el texto de las imagenes de modo que pueda copiarlo y pegarlo en otro lado.
C- Que alguien traduzca el texto de las imagenes de la "estatua" que aparecen en la página. Y de paso esta:
http://tn.smilevideo.jp/smile?i=25276311.M
Fue hecha por videogamer/guider japonés. La estatua original no tiene una esvástica, pero puede que tenga sentido porque en el juego hay un alemán que desaparece, y cuya arma se parece a una:
https://img.webme.com/pic/p/portalnes-8eyes/8eyes_067_b_german.png
Además en Japón ese símbolo tiene otro significado.

Gracias.


¿Para qué o por qué es esto?
Quiero hacer un videojuego que mezcle varios personajes, lugares, historia, etc, de videojuego de NES y otras máquinas. El 1er juego sería 8 Eyes, porque es de la 1era consola que jugué y es el juego que más me gustó dentro de los que empiezan con un número, o sea, voy por consola-abecedario.
Quisiera que la historia sea coherente a la versión japonesa, porque la yanquie tiene varios puntos flojos (ej: Un tipo restaura al mundo, da 8 gemas a 8 dukes, y los 8 lo traicionan ¿es genio o boludo?), aunque la japonesa no se queda muy atrás (¿James Bond con un halcón y una espada?), o sea, probablemente ponga ambas versiones xD pero necesito saber si la "estatua" de la japonesa dice algo importante o no (como qué es esa "estatua": En la yanquie no tiene mucho sentido, y en la japonesa podría ser el demonio que Ruth intentaba convocar pero no tiene sentido que Bond hable con él). En la versión de usa, no.
129  Programación / Programación General / Programa que tenga libre albedrío ¿posible o imposible? ¿por qué? en: 26 Julio 2018, 05:51 am
Me canso de leer ciertas defensas a Dios en un foro que se supone es de filosofía. Por ejemplo más o menos esto:
"Creó al mundo y ahora no interviene ¿Qué culpa tiene Dios si te cae un árbol encima?"
"Nos da libertad. Lo malo que hace el humano es culpa del humano"
Combinada con la creencia de que Dios ha visto el futuro, sabe lo que pasará, y puede evitarlo se supone, lo cual es paradójico, pero eh, mucho de lo relacionado con él lo es.



Si tú creas un personaje de modo que camine por un sitio justo cuando algo está por caer allí, es que:
A- No sabías lo que estabas haciendo. Tu personaje es aplastado por culpa de tu ignorancia. Dios sería ignorante.
B- Le haz puesto azar. El aplastamiento se debe a tu irresponsabilidad, a dejar las cosas en manos del azar. Dios no sería necesariamente malvado, pero habría causado desastres debido a no programar bien o en pos del bien.
C- Querías que lo aplastara. Eso en general te convierte en un malvado, si el personaje fuese sensible. Si lo aplastarás, sería más coherente haber creado un personaje más apropiado, que pueda ser feliz sin tener que ser aplastado. Dios sería malvado o tonto.
D- Le has puesto libre albedrío a tu personaje o a lo que sea que derribó el árbol. Esto me parece imposible. ¿Alguien lo cree posible y tiene idea de cómo se haría? Pero de hecho parece entrar en las anteriores categorías. Ponerle un "diagrama de flujo desconocido que lo lleva a ser aplastado", parece lo mismo que aplastarlo (sólo que el proceso es más complejo o misterioso), o que poner azar o no tener idea de lo que se está haciendo. Un creyente puede decir que es un sacrificio necesario para que haya eso tan preciado que llama libertad, aunque bien sabemos que los árboles podrían evaporarse en vez de caerse, por ejemplo. Si puede dar eso tan mágico que parece ser la libertad, debería poder hacer eso otro con los árboles, o que se derritan, o que se caigan lentamente, o que un bicho los coma, etc. Hablo de árboles viejos. Los que por ejemplo caen por vientos fuertes se evita evitando vientos fuertes.

Por supuesto un creyente podrá decir que una máquina no puede ser libre pero un humano sí, pero los argumentos que suelo leer sobre eso son muy pobres. Que un programador programa a la máquina, como si Dios no hubiera programado al hombre en caso de que realmente lo hubiera creado. Yo dudo que los humanos tengamos alma o cosas raras así que probablemente seamos imitables, pero hay creyentes que afirman la libertad humana incluso sin que haya algo sobrenatural. Así que no se trata de demostrar que tenemos alma, sino de demostrar que el libre albedrío es una ilusión. Esta creencia está implicada en el determinismo fuerte:
https://es.wikipedia.org/wiki/Determinismo#Determinismo_en_los_individuos
A los amantes de la física cuántica, que parece refutar a ese determinismo, les advierto que las teorías de cosas que suceden "porque sí", son interpretaciones de los hechos, el azar ontológico es indemostrable. Capaz que para uds un determinista es lo que para un determinista es un creyente, pero bue, tampoco es que importe mucho.

Si alguno cree que por algún motivo las máquinas no pueden tener libre albedrío pero el humano sí, me gustaría escuchar sus razones.


El caso de los "seres libres que hacen maldades" es muy similar al del "ser libre que es aplastado", no lo explicaré para no alargar tanto el post.


Por cierto, originalmente estaban hablando de niños que mueren de cáncer, por si el caso del árbol parece una tontería. Por algún motivo el creyente puso ese otro ejemplo al responder.
130  Programación / Programación General / ¿Cómo detectar paréntesis redundantes? Avances. en: 26 Julio 2018, 01:56 am
Resumen en negrita.

Parece que expresiones como esta:
Variable1 < Variable2 y Variable1 < Variable3 o Variable2 == Variable3
son análogas a esta:
2 * 3 + 4
en el sentido de la prioridad: Así como los * se aplican antes que los +, las "y" se aplican antes que las "o".

Supongamos que tenemos:
A s B s C s D s E
donde las letras mayúsculas representan números y las s representan signos.


Los paréntesis son redundantes cuando no alteran el orden de las operaciones.


Redundantes tipo 1: Envuelven sólo un valor.
Ej: (A) s B s C s D s E

Quiero el pseudocódigo de un programa que genere expresiones que no tengan paréntesis redundantes. Generar las expresiones no es difícil (al menos las que intenté por ahora; hay otras), lo difícil para mí actualmente se relaciona con los paréntesis. Según pensé, luego de generar una expresión la podría variar poniéndole paréntesis.

Los que abren sólo se pueden poner en las posiciones indicadas por los números de arriba y los que cierran en los de abajo. Básicamente al inicio de una expresión no tiene sentido cerrarlo y al final no tiene sentido abrirlo. El programa siempre en algún punto cerraría los que abra así que no tiene que revisar si todos están abiertos y cerrados. Ej:
Posición de los abiertos: 1, 3
Cerrados: 2, 4
Resultado: (A s (B s C) s D) s E

Unos paréntesis son redundantes tipo 1 si un número está en ambos grupos
En criollo: Si se cierra a penas se abre.
Ej:
Posición de los abiertos: 1, 3
Cerrados: 3, 4
Resultado: (A s B s (C) s D) s E
¿De acuerdo? ¿se les ocurre un método mejor de nombrarlos/generarlos?


Redundantes tipo 2: Envuelven a todo el resto.
Ej: (A s B s C s D s E)

Ocurren cuando:
- En abiertos está el nro 1.
- En cerrados está el número más alto admisible.
y alguna otra condición que no llego a entender. ¿Cual/es?

El problema son casos como por ejemplo este:
(A s B s C) s (D s E)
Posición de los abiertos: 1, 4
Cerrados: 3, 5
Ahí hay 1 y 5 pero no hay falla, por eso falta alguna condición más.


Redundantes tipo 3: No envuelven algún + y no hay un * fuera.
Recuerden que eso del + y * es una analogía. Pero la cosa es que A * B * C = A * (B * C). En la práctica puede que no si el resultado de A * B o B * C es infinito en extensión, pero por ahora no trabajo con eso. Condición1 y Condición2 y Condición3 = C1 y (C2 y C3). Los paréntesis tienen sentido si implican alguna + y hay alguna * fuera. Es decir, cuando alteran el orden normal de las operaciones.

Por ahora no puedo decir cómo detectaría estos, si acaso puedo averiguarlo. Necesito hacer ciertos códigos o pseudos antes de poder analizar esto. Pero si alguno sabe detectarlos, agradezco la respuesta.


¿Hay algún otro tipo?
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 [13] 14
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines