Parte 1:
Asignar una posición a un objeto. Por ejemplo el objeto O en 5 en el eje de las X.
Una posible acción es -1, o sea mover O hacia atrás. Esto es candidato, Cand.
La cantidad de situaciones nuevas no analizadas es 0. Us = 0
// Us viene de unsolved, no resuelto, que viene a ser más o menos como no analizada.
La cantidad de situaciones nuevas analizadas es 0. U = 0
// Us es el total, U marcará cual se está analizando de ese total.
Crear archivo cuyo nombre indique la posición de O y en su contenido diga que Cand es "Ninguno". O sea, para llegar a esta situación no se realizaron acciones desde otra, es la inicial.
// Nota: La situación inicial no cuenta en la cantidad de nuevas.
Parte 2:
Aplicar candidato en la situación, o sea, a OX sumarle Cand.
Si 7<OX
// Solución hallada, ir a Parte MostrarLista.
sino si la situación no está registrada
Crearla de modo similar a antes, pero el contenido debe marcar en qué situación se estaba antes (OX antes de modificarse), y qué Cand se aplicó.
Us++
Crear archivo "U"+Us, o sea, por ejemplo "U1", si Us es 1. El contenido debe ser OX, la situación nueva.
fin del si
Parte 3:
Si Cand < 1
Cand+2
// O sea, si el último movimiento fue -1, ahora cambia a +1. La pregunta es si queda alguna acción no realizada.
Resetear la situación (o sea, OX debe volver al valor que tenía antes de que se le sumara Cand). Esto en realidad lo hago al inicio de la parte 2, pero es largo explicar cómo. Aquí también se puede.
Ir a la Parte 2.
sino
U++
Cargar archivo U (esto implica modificar OX)
Cand = -1, o sea, resetear Cand
Ir a Parte 2
fin del si
Parte MostrarLista
Se agrega Cand en la lista, se carga el archivo OX, y así sucesivamente hasta que Cand sea "Ninguno", o sea, se carga un archivo, luego ese marca cual otro cargar, o sea qué situación hubo antes y qué se hizo en ella, y así sucesivamente hasta la 1er situación, a la cual no se llegó por otra. Lo que muestra es 1, 1, 1, o sea, para llegar de 5 a >7 se mueve 3 veces 1 a la derecha.
¿Qué sentido tiene eso?
El método es aplicable a casos más complejos pero quiero aprender a usarlo así que lo apliqué a algo muy simple.
Problemas que tengo al programarlo en Macromedia Flash 5:
- Cuando se da la instrucción de crear/cargar archivo, no se sabe cuando termina, por lo que hay que hacer comprobaciones y el código se hace mucho más largo y complicado de lo que debería.
- Al crear un archivo mediante código, se guardan todas las variables del LV0 (o sea las que no estén en objetos), por lo cual las que no se quieren guardar hay que ponerlas dentro de un objeto, lo cual estira y complica el code.
- Cuando hay una función en el lv0 y se crea un archivo mediante código, una variable extra se guarda en él, el nombre de la función, por ejemplo así:
&PreptoLoadSit=[type Function]&S=5&C=Ninguno
....en vez de:
&S=5&C=Ninguno
- Intenté poner funciones en objetos y llamarlas desde el LV0 pero no me funciona, por lo que, si no descubro alguna forma... tengo un montón de código repetido...
¿Por qué hago el tema?
Porque quiero ver cómo sería posible hacer más fácilmente lo que comenté.
El códogo:
Nota: Algunos nombres son distintos al del ejemplo. Creo que lo principal es que OX es S, que significa Situación pero en esencia es lo mismo.
Código:
Escena 1
actions for fotograma 1
// SitIni.
Base.S = 5;
// CandIni.
Actual.C = -1;
// Vars de Unsolved sits.
Actual.U = 0;
Actual.Us = 0;
// Save iniSit y preparar comprobación.
S = 5;
C = "Ninguno";
Loading.S = -1;
Loading.C = -10;
Loading.Cargas = 0;
Loading.ArchID = "S"+S+".txt";
fscommand ("save", Loading.ArchID);
actions for fotograma 3
Loading.Comps = 0;
Loading.Cargas = Loading.Cargas+1;
loadVariables (Loading.ArchID, "Loading");
actions for fotograma 5
Loading.Comps = Loading.Comps+1;
Loading.Verif = 1;
if (Loading.S != S) {
Loading.Verif = 0;
} else if (Loading.C != C) {
Loading.Verif = 0;
}
if (Loading.Verif == 0) {
if (Loading.Comps == 10) {
if (Loading.Cargas == 3) {
fscommand ("save", "30 fallas en savecheck de "+Loading.ArchID);
fscommand ("quit");
} else {
// reload.
gotoAndPlay (3);
}
} else {
// retry.
gotoAndPlay (4);
}
}
actions for fotograma 6
// Reset Sit. Aplic.
Actual.S = Base.S+Actual.C;
// ¿Sol?
if (7<Actual.S) {
// Sol; begin loads to show list
List = Actual.C;
gotoAndPlay (26);
} else {
// ¿Sit exist?
Loading.Cargas = 0;
Loading.S = -1;
Loading.C = -10;
Loading.ArchID = "S"+Actual.S+".txt";
}
actions for fotograma 7
Loading.Comps = 0;
Loading.Cargas = Loading.Cargas+1;
loadVariables (Loading.ArchID, "Loading");
actions for fotograma 9
Loading.Comps = Loading.Comps+1;
Loading.Verif = 1;
if (Loading.S == -1) {
Loading.Verif = 0;
} else if (Loading.C == -10) {
Loading.Verif = 0;
}
if (Loading.Verif == 0) {
if (Loading.Comps == 10) {
if (Loading.Cargas == 3) {
// La Sit parece no existir, crearla.
S = Base.S;
C = Actual.C;
Loading.Cargas = 0;
Loading.ArchID = "S"+Actual.S+".txt";
gotoAndPlay (15);
} else {
// reload.
gotoAndPlay (7);
}
} else {
// retry.
gotoAndPlay (8);
}
}
actions for fotograma 10
// La sit existe. ¿Candmod is pos?
if (Actual.C<1) {
// Candmod.
Actual.C = Actual.C+2;
// Reset sit, then Aplic.
gotoAndPlay (6);
} else {
// Load UnsSit.
Actual.U = Actual.U+1;
Loading.Cargas = 0;
Base.S = -1;
Loading.ArchID = "U"+Actual.U+".txt";
}
actions for fotograma 11
Loading.Comps = 0;
Loading.Cargas = Loading.Cargas+1;
loadVariables (Loading.ArchID, "Base");
actions for fotograma 13
if (Base.S == -1) {
Loading.Comps = Loading.Comps+1;
if (Loading.Comps == 10) {
if (Loading.Cargas == 3) {
fscommand ("save", "30 fallas en loading "+Loading.ArchID);
fscommand ("quit");
} else {
// reload.
gotoAndPlay (11);
}
} else {
// retry.
gotoAndPlay (12);
}
}
actions for fotograma 14
Base.S = Number(Base.S);
// Reset Cand. Aplic.
Actual.C = -1;
gotoAndPlay (6);
actions for fotograma 15
// Creando Sit.
fscommand ("save", Loading.ArchID);
actions for fotograma 17
Loading.Comps = 0;
Loading.Cargas = Loading.Cargas+1;
loadVariables (Loading.ArchID, "Loading");
actions for fotograma 19
Loading.Comps = Loading.Comps+1;
Loading.Verif = 1;
if (Loading.S != S) {
Loading.Verif = 0;
} else if (Loading.C != C) {
Loading.Verif = 0;
}
if (Loading.Verif == 0) {
if (Loading.Comps == 10) {
if (Loading.Cargas == 3) {
fscommand ("save", "30 fallas en savecheck de "+Loading.ArchID);
fscommand ("quit");
} else {
// reload.
gotoAndPlay (17);
}
} else {
// retry.
gotoAndPlay (18);
}
}
actions for fotograma 20
// Save UnsSit.
delete C;
S = Actual.S;
Actual.Us = Actual.Us+1;
Loading.S = -1;
Loading.Cargas = 0;
Loading.ArchID = "U"+Actual.Us+".txt";
fscommand ("save", Loading.ArchID);
actions for fotograma 22
Loading.Comps = 0;
Loading.Cargas = Loading.Cargas+1;
loadVariables (Loading.ArchID, "Loading");
actions for fotograma 24
if (Loading.S == -1) {
Loading.Comps = Loading.Comps+1;
if (Loading.Comps == 10) {
if (Loading.Cargas == 3) {
fscommand ("save", "30 fallas en savecheck de "+Loading.ArchID);
fscommand ("quit");
} else {
// reload.
gotoAndPlay (22);
}
} else {
// retry.
gotoAndPlay (23);
}
}
actions for fotograma 25
// ¿Candmod is pos?
gotoAndPlay (10);
actions for fotograma 26
S = Base.S;
Loading.Cargas = 0;
Base.S = -1;
Base.C = -10;
Loading.ArchID = "S"+S+".txt";
actions for fotograma 27
Loading.Comps = 0;
Loading.Cargas = Loading.Cargas+1;
loadVariables (Loading.ArchID, "Base");
actions for fotograma 29
Loading.Comps = Loading.Comps+1;
Loading.Verif = 1;
if (Base.S == -1) {
Loading.Verif = 0;
} else if (Base.C == -10) {
Loading.Verif = 0;
}
if (Loading.Verif == 0) {
if (Loading.Comps == 10) {
if (Loading.Cargas == 3) {
fscommand ("save", "30 fallas en loading "+Loading.ArchID);
fscommand ("quit");
} else {
// reload.
gotoAndPlay (27);
}
} else {
// retry.
gotoAndPlay (28);
}
}
actions for fotograma 30
if (Base.C != "Ninguno") {
List = Base.C+" "+List;
gotoAndPlay (26);
} else {
stop ();
}
Gracias.