(Solucionado) Variar números en A arrays.

Iniciado por Tachikomaia, 5 Noviembre 2019, 18:29 PM

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

Tachikomaia

Esto varía los números en 1 array:
C = new Array(1, 1, 1);
Max = 10;

// Solcheck
if (C[1]<C[0]) {
   // Sol
   stop ();
}

// Candmod
W = 1;
SenaladordeP = 2;
do {
   if (C[SenaladordeP]<Max) {
       C[SenaladordeP] = C[SenaladordeP]+1;
       W = 0;
   } else {
       C[SenaladordeP] = 1;
       if (0 < SenaladordeP) {
           SenaladordeP = SenaladordeP-1;
       } else {
           // No hay Sol o está más allá del Max.
           stop ();
       }
   }
} while (W==1);
gotoAndPlay (2);


Intentando variar A arrays (en este ejemplo A=2) hice esto:
C1 = new Array(1, 1, 1);
C2 = new Array(1, 1, 1);
Max = 10;

trace (C1+" "+C2);
// Solcheck
if (C1[0]<C2[0]) {
   // Sol
   stop ();
}

// Candmod
W = 1;
SenaladordeC = 2;
SenaladordeP = 2;
do {
   if (eval("C"+SenaladordeC+"["+SenaladordeP+"]")<Max) {
       trace (eval("C"+SenaladordeC+"["+SenaladordeP+"]"));
       set ("C"+SenaladordeC+"["+SenaladordeP+"]", eval("C"+SenaladordeC+"["+SenaladordeP+"]")+1);
       W = 0;
   } else {
       set ("C"+SenaladordeC+"["+SenaladordeP+"]", 1);
       if (0<SenaladordeP) {
           SenaladordeP = SenaladordeP-1;
       } else {
           SenaladordeP = 2;
           if (1<SenaladordeC) {
               SenaladordeC = SenaladordeC-1;
           } else {
               // No hay Sol o está más allá del Max.
               stop ();
           }
       }
   }
} while (W == 1);
gotoAndPlay (2);
El contenido de los arrays debería variar más o menos así:
Citar// Cambio 1:
C1 = 1, 1, 1
C2 = 1, 1, 2
// Cambio 2:
C1 = 1, 1, 1
C2 = 1, 1, 3
Como si fuesen 6 cifras, que en vez de ser del 0 al 9 fuesen del 1 al 10.
El problema es que el intérprete o lo que sea, cuando por ejemplo le digo:
set ("C"+SenaladordeC+"["+SenaladordeP+"]", eval("C"+SenaladordeC+"["+SenaladordeP+"]")+1);
...lo que hace es crear variables llamadas C2[SenaladordeP], es decir, C2[2], C2[1] y C2[0]. Más claro:
CitarLevel #0:
 Variable _level0.$version = "WIN 5,0,32,0"
 Variable _level0.C1 = [object #1] [
   0:1,
   1:1,
   2:1
 ]
 Variable _level0.C2 = [object #2] [
   0:1,
   1:1,
   2:1
 ]
 Variable _level0.Max = 10
 Variable _level0.W = 0
 Variable _level0.SenaladordeC = 2
 Variable _level0.SenaladordeP = 2
 Variable _level0.C2[2] = 8
 Variable _level0.C2[1] = 3
 Variable _level0.C2[0] = 1
En vez de variar las partes del array, o sea C2[2], C2[1] y C2[0], me crea y varía variables con esos mismos nombres. No puedo hacer referencia a contenidos de array porque lo interpreta como si fuese referencia a una variable llamada igual que una referencia a array. Pero yo no cree esas variables.

Tal vez el problema es usar set (aunque no hubo problema en el 1er código) o habría que modificar la referencia en el eval (quitar comillas, poner comillas, no sé).

¿Ideas?

El programa es Macromedia Flash 5, que usa una vieja versión de Action Script. Puede que el error sea cosa de dicho programa/lenguaje, aunque imagino que es posible alguna solución que no sea cambiar de programa/lenguaje.

Gracias.

Tachikomaia

Hallé una manera:
Escena 1
   actions for fotograma 1
      C1 = new Array(1, 1, 1);
      C2 = new Array(1, 1, 1);
      Max = 5;
   actions for fotograma 2
      trace (C1+" "+C2);
      // Solcheck
      if (C2[0]<C1[0]) {
         // Sol
         stop ();
      }
   actions for fotograma 3
      // Candmod
      W = 1;
      SenaladordeC = 2;
      SenaladordeP = 2;
      do {
         if (eval("C"+SenaladordeC)[SenaladordeP]<Max) {
            eval("C"+SenaladordeC).splice(SenaladordeP, 1, eval("C"+SenaladordeC)[SenaladordeP]+1);
            W = 0;
         } else {
            eval("C"+SenaladordeC).splice(SenaladordeP, 1, 1);
            if (0<SenaladordeP) {
               SenaladordeP = SenaladordeP-1;
            } else {
               SenaladordeP = 2;
               if (1<SenaladordeC) {
                  SenaladordeC = SenaladordeC-1;
               } else {
                  // No hay Sol o está más allá del Max.
                  stop ();
               }
            }
         }
      } while (W == 1);
      gotoAndPlay (2);


Pienso que debería haber funcionado como dije, aunque con algunos ajustes.
En el if había puesto
if (eval("C"+SenaladordeC+"["+SenaladordeP+"]")<Max) {
y era
if (eval("C"+SenaladordeC)[SenaladordeP]<Max) {

Y en la modificación había puesto
set ("C"+SenaladordeC+"["+SenaladordeP+"]", eval("C"+SenaladordeC+"["+SenaladordeP+"]")+1);
lo cual según mi interpretación debería ser más o menos así
set ("C"+SenaladordeC[SenaladordeP], eval("C"+SenaladordeC)[SenaladordeP]+1);
(digo más o menos porque ya no recuerdo cómo interpreta la 1era parte)
pero eso causa el error que comenté. Leyendo respecto a arrays encontré esto:
CitarArray.splice
Sintaxis

myArray.splice(inicio, Cuenta_elim, valor0,valor1...valorN);
Argumentos

inicio El índice del elemento de la matriz donde comienza la inserción y/o el borrado.

Cuenta_elim El número de elementos que se van a borrar. Este número incluye el elemento especificado en el argumento inicio. Si no se especifica valor para Cuenta_elim, el método borra todos los valores desde el elemento inicio hasta el último elemento de la matriz.

valor Cero o más valores que se van a insertar en la matriz en el punto de inserción especificado en el argumento inicio. Este argumento es opcional.

Descripción

Método; agrega y/o elimina elementos de una matriz. Este método modifica la propia matriz sin hacer una copia.

Reproductor

Flash 5 o posterior.
Que con los ajustes del caso sirvió.

O sea, en vez de simplemente hacer una referencia a una parte y sustituirla por otra, lo que me vi forzado a hacer (porque no sé otra forma) es borrar una parte y en su lugar poner otra. A efectos prácticos es lo mismo.