|
12
|
Foros Generales / Foro Libre / ¿Qué opinan de que las RRSS avisen si una cuenta fue reportada como robada?
|
en: 22 Mayo 2025, 11:38 am
|
Hemos visto a más de uno diciendo que le robaron una cuenta de un sitio, y que la ayuda técnica de ahí no les soluciona el problema.
Si la cuenta realmente fue robada, se podría usar con malos fines, y creerán que quien lo hace es la víctima del robo.
Si la víctima y muchas personas tienen la opción de reportar que la cuenta fue robada y eso aparece a los visitantes o quienes interactúan con la persona, eso podría evitar problemas ¿no? "Advertencia: Esta cuenta ha sido reportada como robada, sea cuidadoso al interactuar con su usuario".
Pero entiendo que podría haber reportes falsos, pero podrían tener un nivel de credibilidad según quien los haga. "Advertencia: Los siguientes usuarios han reportado que esta cuenta fue robada: Usuario, nivel, motivo, fecha. Cancelación: Motivo, fecha. Usuario, nivel, motivo, fecha. etc" Lista inicialmente ordenada por nivel, ordenable de otros modos. La cancelación se refiere a si el usuario canceló el reporte, como asumiendo que fue una confusión o la víctima recuperó su cuenta.
La persona podría hacer maldades y luego decir que su cuenta fue robada, pero eso ya es posible.
¿Entonces, esta idea tiene algo malo o es buena idea? ¿qué RRSS la usan?
|
|
|
13
|
Foros Generales / Dudas Generales / Lograr que YT no me recomiende cosas o lo haga en un costado.
|
en: 16 Mayo 2025, 11:49 am
|
No sé qué pasó, las recomendaciones de otros videos me aparecían en un costado o no me aparecían, o muy pequeñas, entonces luego de ver un video podía rápido ir hacia abajo y leer los comentarios. Si quería ver recomendaciones, ponía el final del video y aparecían en el mismo video.
Ahora me aparecen abajo del video y cada una es tan grande como el mismo video así que ir a los comentarios es tedioso.
Tiene algo que ver con el zoom aumentado en Chrome, pero antes no tenía problema.
Aparentemente depende del video al que entre... Si entro a ciertos videos, caben 4 recomendados en la pantalla, pero entrando a otros sólo 1. No me refiero a las recomendaciones cuando termina el video, esas están bien, yo digo las que ma aparecen abajo.
Con el zoom al 100%, aparecen en el costado. Yo le pongo 125% porque sino no veo bien las letras, pero los videos me aparecen abajo, enormes. Antes no pasaba.
|
|
|
14
|
Foros Generales / Foro Libre / ¿En tu país hay convenciones relacionadas con programación? ¿cómo te fue?
|
en: 12 Mayo 2025, 10:21 am
|
Soy de Uruguay. Hace años fui a una. Gratis. Llevé un cd con algo que estaba haciendo. El profesor dijo que no lo pudo ver porque no tenìa una PC con Windows. Era de robótica en realidad. Había robots chiquitos levantando maderitas e intentando colocarlas en un sitio, fallaban en general. Peleas de sumos o algo así, tenían que hacerse caer. Siempre empezaban girando hacia un lado. Le pregunté a uno de los creadores si no podía cambiarse eso, dijo que no. Luego un profesor, escuché, les sugirió que los robots deberían girar para distintos lados. Un tipo hizo un autito a control remoto creo, usando una carcasa de mouse. Me interesó pero... ¿qué podía hacer? ¿pedirle un curso gratis? Mostraron parte de un partido de fútbol usando IA, pero eran unas pelotas (jugadores) quietas con unas lineas, como si fuera la trayectoria de la pelota, supongo que hacerla avanzar pasándosela a otros jugadores aliados intentando que no pase cerca de los rivales. Quizá las pelotitas se movían, la cosa es que duró muy poco y me intersó pero no me pareció que quisieran explicar cómo lo hicieron. En definitiva me pareció como "Miren lo que hicimos, aplaudan y cuando se aburran váyanse", algo para sabiondos nada más, o para ignorantes que quieran mirar, yo pensaba que sería bueno formar un grupo de aprendizaje, pero no parecía posible, estaban los sabiondos o ricos con sus robotitos y estábamos los demás mirando como ignorantes, varios parecían padres, ocupados. Ayer para evitar ser multado tuve que ir a un colegio a votar, vi en él un cartel de olimpiadas de robótica y programación de videojuegos, sólo para alumnos, pero pensé que sería interesante ir a mirar, pero en la página esta https://ceibal.edu.uy/plataformas-y-programas/olimpiada/no vi cuando ni dónde es. Quizá ya se hizo, quizá no es un evento para público, no sé... Se me ocurrió hacer este tema, a ver qué cuentan uds.
|
|
|
15
|
Programación / Programación General / Haciendo juego muy sencillo de cartas, dudas.
|
en: 2 Mayo 2025, 00:30 am
|
Por ahora es que un jugador y la máquina... Tienen puntos de vida (HP). Obtienen 1 carta al azar cada uno. No hay mazo con cartas ordenadas de X modo, simplemente cartas posibles. Es el turno del humano, debe usar su carta. La carta puede tener opciones. La carta hace su efecto según cómo se especificó. Si la IA aún tiene HP, el humano toma otra carta y es el turno de la IA, que deberá seguir el mismo proceso que el humano. Sino, se muestra un mensaje de victoria. Cartas = ["MarioDK", "DK"]; // Lo anterior se usa para hacer sus efectos, esto es cómo se muestran sus nombres: ShowerDeCartas = ["Mario de Donkey Kong", "Donkey Kong"]; HumanoHP = 10; IAHP = 10; // Frame 1: Se dan cartas, el mensaje no tiene saltos de línea. // F2: Un objeto repite TurnoDeHumano hasta que se presione A. NroDeCartaDeHumano = random(Cartas.length); Mensaje = "Tu carta ahora es "+ShowerDeCartas[NroDeCartaDeHumano]; NroDeCartaDeIA = random(Cartas.length); function TurnoDeHumano () { // Si se presiona A: if (Key.isDown(65)) { // Usa la carta (dando su estadística AT a la función): eval(Cartas[NroDeCartaDeHumano])(eval(Cartas[NroDeCartaDeHumano]+"AT")); } } function HumanoObtieneCarta () { NroDeCartaDeHumano = random(Cartas.length); Mensaje = Mensaje+"\n\nTu carta ahora es "+ShowerDeCartas[NroDeCartaDeHumano]; } function FinDelTurnoDeHumano () { HumanoObtieneCarta(); // Turno de la IA: } function Victoria () { Mensaje = Mensaje+"\n\n¡Ganaste!"; gotoAndStop (4); } // Estadísticas: MarioDKAT = 1; DKAT = 2; // Efectos: function MarioDK (ataque) { Mensaje = "¡Tu rival ha sido enjaulado!"; IAHP = IAHP-ataque; if (IAHP > 0) { FinDelTurnoDeHumano(); } else { Victoria(); } } function DK (ataque) { Mensaje = "¡Rival dañado!"; IAHP = IAHP-ataque; if (IAHP > 0) { FinDelTurnoDeHumano(); } else { Victoria(); } }
Quisiera que me digan cómo lo mejorarían (no en cuanto a gráficos, sonido, etc, sino el código, eficiencia y claridad) y cómo puedo hacer que los efectos de las cartas se apliquen al humano o a la IA según quién las juegue. Así como están siempre afectan a la IA. La forma que se me ocurre es pasar un parámetro extra a las funciones, por ejemplo target, y luego meter un if para que afecten a uno u otro, pero pregunto si hay algo mejor. Esto se repite: IAHP = IAHP-ataque; if (IAHP > 0) { FinDelTurnoDeHumano(); } else { Victoria(); }
Es que antes ponía 1ero el daño, luego el mensaje (que varía según la carta) y luego esos ifs, pero tengo pensado que algunas cartas hagan daño a quien las usa o den una carta extra y deba descartarse una, así que ese código dudo que pueda servir repetirlo. Bueno, en general supongo que sí. Respuesta de Deepseek: # Análisis y Mejoras para el Juego de Cartas
## Mejoras de Código y Estructura
1. **Eliminar duplicación de código**: El patrón de reducir HP y verificar victoria se repite. Podrías crear una función común: ```actionscript function aplicarAtaque(target, ataque, mensajeEfecto) { target.HP -= ataque; Mensaje = mensajeEfecto; if (target.HP > 0) { FinDelTurnoDeHumano(); } else { Victoria(); } } ```
2. **Sistema de objetivos más flexible**: En lugar de hardcodear el objetivo, puedes pasar el objetivo como parámetro:
```actionscript function MarioDK(ataque, objetivo) { aplicarAtaque(objetivo, ataque, "¡Tu rival ha sido enjaulado!"); }
// Llamada: eval(Cartas[NroDeCartaDeHumano])(eval(Cartas[NroDeCartaDeHumano]+"AT"), IA); ```
3. **Estructura de datos más organizada**: En lugar de tener arrays separados para nombres y estadísticas, podrías usar objetos:
```actionscript Cartas = [ {nombre: "Mario de Donkey Kong", ataque: 1, efecto: MarioDK}, {nombre: "Donkey Kong", ataque: 2, efecto: DK} ]; ```
4. **Sistema de turnos más robusto**: Implementar un sistema de gestión de turnos que alterna entre jugadores.
## Implementación Mejorada
Aquí tienes una versión mejorada que aborda estos puntos:
```actionscript // Configuración inicial Cartas = [ {nombre: "Mario de Donkey Kong", ataque: 1, efecto: function(objetivo) { aplicarAtaque(objetivo, this.ataque, "¡Tu rival ha sido enjaulado!"); }}, {nombre: "Donkey Kong", ataque: 2, efecto: function(objetivo) { aplicarAtaque(objetivo, this.ataque, "¡Rival dañado!"); }} ];
Jugador = {HP: 10, nombre: "Humano"}; IA = {HP: 10, nombre: "IA"}; turnoActual = Jugador; Mensaje = "";
// Frame 1: Repartir cartas iniciales repartirCartas();
// Frame 2: Lógica del juego function repartirCartas() { NroDeCartaDeHumano = random(Cartas.length); NroDeCartaDeIA = random(Cartas.length); Mensaje = "Tu carta ahora es " + Cartas[NroDeCartaDeHumano].nombre; }
function TurnoDeHumano() { if (Key.isDown(65)) { // Si se presiona A var carta = Cartas[NroDeCartaDeHumano]; carta.efecto(IA); // Siempre ataca a la IA en este caso } }
function aplicarAtaque(objetivo, ataque, mensajeEfecto) { objetivo.HP -= ataque; Mensaje = mensajeEfecto; if (objetivo.HP <= 0) { Victoria(); } else if (turnoActual == Jugador) { FinDelTurnoDeHumano(); } else { // Turno de la IA turnoIA(); } }
function FinDelTurnoDeHumano() { turnoActual = IA; repartirCartas(); // La IA juega inmediatamente después turnoIA(); }
function turnoIA() { var carta = Cartas[NroDeCartaDeIA]; carta.efecto(Jugador); // La IA siempre ataca al jugador // Volver al turno del jugador turnoActual = Jugador; repartirCartas(); }
function Victoria() { var ganador = (IA.HP <= 0) ? Jugador : IA; Mensaje = "¡" + ganador.nombre + " ha ganado!"; gotoAndStop(4); } ```
## Ventajas de esta implementación:
1. **Flexibilidad en objetivos**: Las funciones de efecto ahora reciben explícitamente su objetivo. 2. **Estructura más clara**: Los datos de las cartas están encapsulados en objetos. 3. **Sistema de turnos**: Más fácil de extender para más jugadores o mecánicas complejas. 4. **Menos duplicación**: La lógica común está centralizada en `aplicarAtaque`.
## Para futuras expansiones:
1. **Efectos complejos**: Puedes añadir propiedades adicionales a las cartas (como "dañoAutomatico", "curar", etc.) 2. **Selección de objetivo**: Modificar la UI para permitir elegir objetivo cuando sea relevante. 3. **Múltiples jugadores**: El sistema de turnos ya está preparado para escalar.
Esta estructura hace que sea más fácil añadir nuevos tipos de cartas con efectos variados sin tener que modificar mucho la lógica principal del juego. Mucha cosa, lo pensaré.
|
|
|
17
|
Sistemas Operativos / Windows / ¿En Windows 7 cómo busco archivos modificados entre 2 fechas?
|
en: 1 Mayo 2025, 14:35 pm
|
Fui a C, hice clic en la lupa, apareció un calendario, elegí una fecha suficientemente antigua. Resultado: Pocos archivos hallados. Pregunté a GPT, me dijo que pegue esto: datemodified:>=01/04/2025, lo hice. Resultado: Ningún archivo hallado. Le dije, dijo que pegue esto: datemodified:01/04/2025..01/05/2025, lo hice. Resultado: Ningún archivo hallado. La fecha de mi PC muestra 1ero el año ¿será por eso? Siempre tuve problemas con este buscador. Me dijeron que era ineficiente, que use otro, pero esta es otra duda: ¿Por qué si en versiones anteriores funcionaba bien, lo han jodido? Antes había como un asistente, ahora son unas ventanitas chiquitas. ¿No queda más remedio que instalar un buscador, o qué pasa? ¿Será por algo del índice como dice acá?  No sé qué es.
|
|
|
18
|
Media / Juegos y Consolas / Aumentar máxima cantidad de disparos en pantalla.
|
en: 26 Abril 2025, 04:47 am
|
Algo extremadamente molesto del juego Donkey Kong 3 de NES es que si hay 2 disparos tuyos, no puede haber un 3ero, por lo que si fallaste 2 veces (lo cual es bastante normal en mi caso, porque los bichos son chicos y se mueven de forma bastante random, además suelo usar turbo) y tienes un enemigo encima acercándose (muy normal también) y quieres dispararle, no puedes y deberías esquivar hasta que uno de tus disparos desaparezca. Es como estresante, tienes el bicho al lado y no puedes dispararle ¿no es un juego de disparos? Hay otros ejemplos, como el Galaxian, donde sólo puede haber 1 disparo tuyo en la pantalla, y tarda más en desaparecer que los de DK3, así que es peor, aunque no hay tantos bichos acercándose a la vez. ¿Habrá algún modo de romper ese límite? Por ejemplo poniendo un cheat en un emulador o modificando el rom. ¡Muy buena observación! Lo que mencionas es **totalmente cierto**: en varios juegos clásicos de arcade (y sus versiones de consola como NES), había límites estrictos en la cantidad de disparos que podías tener activos al mismo tiempo. Esto se debía principalmente a **limitaciones de hardware** de la época (CPU, memoria, etc.), pero también era un recurso de **diseño de dificultad intencional**. --- ## Sobre tu pregunta: **¿Se puede romper ese límite?** **¡Sí, es posible!** Hay varias maneras: ### 1. **Utilizar cheats (códigos de trucos) en emuladores** Muchos emuladores modernos (como **FCEUX**, **Nestopia**, **Mesen**, etc.) permiten insertar códigos tipo **Game Genie**, **Pro Action Replay**, o incluso usar parches de memoria para modificar dinámicamente el comportamiento del juego. - **Ejemplo**: podrías buscar un código Game Genie que elimine o modifique la restricción de disparos. - **En FCEUX**, además puedes usar el **Memory Viewer** para buscar la variable que cuenta tus disparos y cambiarla para que no limite. --- ### 2. **Modificar directamente el ROM** Esto es más avanzado, pero totalmente posible. - Puedes usar un **desensamblador** de NES (como **IDA Pro**, **Ghidra**, o incluso herramientas especializadas de NES) para encontrar el código que maneja la cantidad de disparos activos. - Luego, podrías: - Eliminar la comparación que limita el número de disparos. - O aumentar el número máximo permitido. Esto básicamente requiere hacer un **parche IPS** o editar el ROM manualmente con un **hex editor**. --- ### 3. **Buscar hacks ya hechos** Algunos fans ya han creado **hacks de ROMs** donde arreglan limitaciones molestas como esta. Puede que exista un hack de Donkey Kong 3 o Galaxian que elimine la restricción de disparos. Sitios como: - [ROMhacking.net]( https://www.romhacking.net/)- [NESWorld]( http://www.nesworld.com/)tienen miles de hacks de mejora y podría haber uno que te sirva. --- ## ¿Cómo funcionaría técnicamente el límite de disparos? Usualmente, el juego tiene una **variable de conteo** de disparos activos. El flujo suele ser algo así: ```assembly si (disparos_activos < 2) { crear_disparo(); } ``` Así que para romper eso, podrías: - Forzar `disparos_activos` a 0 siempre. - O eliminar el chequeo de cantidad (`< 2`). - O aumentar el número máximo a, digamos, 10. --- ## ¿Quieres que te ayude a intentar encontrar o crear un código para romper esa limitación en **Donkey Kong 3** específicamente? Podríamos: - Buscar un **cheat** ya hecho. - O diseñar juntos uno usando memoria RAM en un emulador como **FCEUX**. 🚀 **Si quieres, dime qué emulador usas y atacamos el problema juntos**. 🚀 --- ¿Te gustaría que incluso te prepare un pequeño **tutorial paso a paso** para intentar modificarlo tú mismo? 🔥 (¡No es tan difícil como parece!) No esperaba tan buena respuesta, pero lo intento otro día.
|
|
|
19
|
Media / Diseño Gráfico / Baldosas con efecto de horizonte y distintos colores. Programando.
|
en: 22 Abril 2025, 06:49 am
|
Sé cómo hacer una cosa o la otra, no ambas a la vez. Con efecto de horizonte es que entre más arriba están, más pequeñas son. Eso lo puedo hacer trazando líneas, no programo. Si quisiera que tengan colores al azar, las podría pintar manualmente, pero me preguntaba cómo sería hacerlo con programación. Un ejemplo:  Puse unas baldosas abajo, y luego unas arriba más chicas, demasiado, así se nota que quedaría mal, pero así reinsertando la misma imagen es como le podría cambiar los colores con programación, sino no sé. ¿Cómo programando reinserto imágenes, achicándolas, de modo que las líneas diagonales conserven el ángulo? Lo que se me acaba de ocurrir es poniéndoles lo que llaman Sesgar, pero no sé qué valores debería poner... No, tampoco, quedaría así más o menos:  Pasa que están mal las de abajo, ahora que me doy cuenta. Las diagonales deben tener distinto ángulo. Además, me di cuenta de que puedo dibujar todo y luego programar que cada espacio tenga un color al azar, pero la idea es programar un copy paste de las filas de baldosas, no hacer eso yo. Además deben tener distinto tamaño, cambiárselo manualmente es mucha cosa.
|
|
|
20
|
Programación / Programación General / Array no se genera bien.
|
en: 21 Abril 2025, 07:08 am
|
Variable _level0.L2SaE10 está bien. Variable _level0.L2SaE11 está bien. Variable _level0.L2SaE12 no: Variable _level0.L2SaE10 = [object #30] [ 0:"0", 1:"v", 2:"v", 3:"X" ] Variable _level0.S0vvXBestAction = "Desconocida" Variable _level0.S0vvXTurno = "X" Variable _level0.S0vvXFirstAPosible = 1 Variable _level0.S0vvXLastAPosible = 2 Variable _level0.L2SaE11 = [object #31] [ 0:"v", 1:"0", 2:"v", 3:"X" ] Variable _level0.Sv0vXBestAction = "Desconocida" Variable _level0.Sv0vXTurno = "X" Variable _level0.Sv0vXFirstAPosible = 0 Variable _level0.Sv0vXLastAPosible = 2 Variable _level0.L2SaE12 = [object #15] Variable _level0.Svv0XBestAction = "Desconocida" Variable _level0.Svv0XTurno = "X" Variable _level0.Svv0XFirstAPosible = 0 Variable _level0.Svv0XLastAPosible = 1 Ven que Variable _level0.L2SaE12 = [object #15] es como un acceso directo a un array, no es uno independiente. El error tiene que ver con EvaluarConocimientoSobreSEt1, la penúltima función: // Signos en línea en tableros cuadrados: // Este programa tiene básicamente ?????????????????????????????????????? etapas, // que se pueden resumir así: // Nota: La situación inicial, en que hay 0 signos colocados, // estará guardada en la lista nro 0. // 1: // Probar acciones en cada situación de la lista, // guardando en una nueva lista las nuevas situaciones (que no... // sean victoria ni empate). Repetir con cada lista hasta la que... // tenga situaciones en que sólo 1 acción es posible (por... // ejemplo en el 3 en línea es 8). // 2: ACTUALIZAR ESTA // En las situaciones no resueltas, probar las acciones. // Si las consecuencias tienen RE, anotar cuantas de ellas... // son victoria de X, 0 o empate y anotar la acción que... // cause la RE más favorable, considerando secundariamente... // las cantidades. JuntosRequeridos = 2; CasillerosPorFila = 2; // Contando desde 0: MaxColumna = CasillerosPorFila-1; Casilleros = CasillerosPorFila*CasillerosPorFila; // Están numerados así: // 0 1 // 2 3 MaxCasillero = Casilleros-1; // En las listas L_SaE se irán poniendo las situaciones a... // experimentar que tengan _ signos colocados. // En la lista 0 agregar una situación, aún no se dice cual: L0SaE1 = []; // A continuación se especifica cómo es, agregando v // (que significa vacío) en lo que serían los casilleros, // los elementos del array: ValoraAgregar = -1; do { ValoraAgregar++; L0SaE1.push("v"); } while (ValoraAgregar < MaxCasillero); delete ValoraAgregar; // Los datos de las situaciones no están en las listas, // se crean aparte. Con esta variable se evita repetidamente... // convertir en texto y concatenar: S_ = "S"+(L0SaE1.join("")); // Datos de la situación: // Usada para fácilmente saber de qué signo es turno: set (S_+"Turno", "X"); // En otros casos usada para evitar probar acciones... // innecesarias y con LastAPosible para saber si sólo queda 1: set (S_+"FirstAPosible", 0); set (S_+"LastAPosible", MaxCasillero); NroDeListaRevisandose = -1; // Última lista que se revisará en la etapa 1: LastListaDeEt1 = MaxCasillero; // ///////////////////////////////////////////// // ///////////////// Etapa 1 ///////////////// // ///////////////////////////////////////////// // Usada a continuación y durante la etapa 1 (Et1)... // cuando no hay más situaciones en la lista revisándose: function BuscarOtraListaEt1 () { trace("Ejecutando BuscarOtraListaEt1"); NroDeListaRevisandose++; // Si las situaciones de la lista tienen más de 1 opción: if (NroDeListaRevisandose < LastListaDeEt1) { // Para evitar concatenar repetidamente: L_SaE = "L"+NroDeListaRevisandose+"SaE"; NextL_SaE = "L"+(NroDeListaRevisandose+1)+"SaE"; NroDeSExperimentandose = 1; // También para evitar concatenar repetidamente: // L_SaE_ = L_SaE+NroDeSExperimentandose; L_SaE_ = L_SaE+"1"; // Usado en EvaluarConocimientoSobreSEt1 para... // nombrar las situaciones nuevas que se logren: SituacionesNuevas = 0; trace("Comienzan experimentos en una nueva lista, la "+NroDeListaRevisandose); PrepararSaE(); } else { trace( "La próxima lista tiene situaciones de sólo 1 opción; inicia la etapa 2."); // IniciarEtapa2(); gotoAndStop(4); } } BuscarOtraListaEt1(); // Usada cuando se elege una SaE, en BuscarOtraListaEt1 y... // BuscarOtraSituacionEt1: function PrepararSaE () { trace("Ejecutando PrepararSaE"); trace("Se inician experimentos en otra situación de la lista, la nro "+NroDeSExperimentandose); SituacionBase = eval(L_SaE_); S_ = "S"+(SituacionBase.join("")); Turno = eval(S_+"Turno"); FirstActionPosible = eval(S_+"FirstAPosible"); LastActionPosible = eval(S_+"LastAPosible"); Action = FirstActionPosible; } // Usada en frame 2 (o etapa 1) repetidamente: function BuscarSituacionesDistantes () { // Plantear situación porque puede modificarse pero... // podría requerirse su estado original luego: Situacion = SituacionBase.slice(); trace("La situación experimentándose es "+Situacion); EvaluarAplicabilidadEt1(); } // Usada luego de que cambia la SaE y/o la acción: function EvaluarAplicabilidadEt1 () { trace("Ejecutando EvaluarAplicabilidadEt1"); if (Situacion[Action] == "v") { trace("La acción "+Action+" es realizable."); AplicarAccionEt1(); } else { trace("La acción "+Action+" no es realizable."); BuscarOtraAccionEt1(); } } // Usada luego de EvaluarAplicabilidadEt1, // si una acción es realizable: function AplicarAccionEt1 () { trace("Ejecutando AplicarAccionEt1"); Situacion[Action] = Turno; trace("Se realizó la acción "+Action+"; ahora la situación es "+Situacion); // ¿Ganó? // Si no se detecta victoria vertical, // revisa de otros modos (ver las funciones Chequear): ChequearVertical(); if (Win == "No") { EvaluarConocimientoSobreSEt1(); } // ¿Queda alguna acción sin probar en la situación? BuscarOtraAccionEt1(); } // Usada en EvaluarAplicabilidadEt1 cuando una acción no es... // realizable, y luego de AplicarAccionEt1: function BuscarOtraAccionEt1 () { trace("Ejecutando BuscarOtraAccionEt1"); if (Action < LastActionPosible) { // Si queda alguna acción sin probar... // en la situación, probarla: Action++; // Se ejecutará BuscarSituacionesDistantes. } else { trace("No hay más acciones realizables."); BuscarOtraSituacionEt1(); } } // Usada en AplicarAccionEt1 cuando no hay victoria (ni empate, // aunque por ahora no ocurren): function EvaluarConocimientoSobreSEt1 () { trace("Ejecutando EvaluarConocimientoSobreSEt1"); SituacionJoined = Situacion.join(""); NewS_ = "S"+SituacionJoined; NewS_BestAction = NewS_+"BestAction"; // ¿Se ha llegado antes a la situación? if (eval(NewS_BestAction) == undefined) { // No, anotar que debe investigarse: SituacionesNuevas++; // Copiar array (porque no se puede normalmente): trace("Situación a copiar a "+NextL_SaE+SituacionesNuevas+" es "+Situacion); set (NextL_SaE+SituacionesNuevas, Situacion.slice()); trace("Esa situación no está anotada; se anota como nro "+SituacionesNuevas); set(NewS_BestAction, "Desconocida"); if (Turno == "X") { set (NewS_+"Turno", "0"); } else { set (NewS_+"Turno", "X"); } // Averiguar cual es su 1er acción posible: AccionRevisandose = -1; do { AccionRevisandose++; if (Situacion[AccionRevisandose] == "v") { set (NewS_+"FirstAPosible", AccionRevisandose); break; } } while (true); // Averiguar cual es su última acción posible: AccionRevisandose = Casilleros; do { AccionRevisandose--; if (Situacion[AccionRevisandose] == "v") { set (NewS_+"LastAPosible", AccionRevisandose); break; } } while (true); } } // Usada en BuscarOtraAccionEt1 cuando no hay más acciones posibles: function BuscarOtraSituacionEt1 () { trace("Ejecutando BuscarOtraSituacionEt1"); NroDeSExperimentandose++; if (eval(L_SaE+NroDeSExperimentandose) != undefined) { // Hay otra situación en la lista, // prepararse a usarla: L_SaE_ = L_SaE+NroDeSExperimentandose; PrepararSaE(); } else { trace( "No hay más situaciones a experimentar en la lista actual, se mirará otra."); BuscarOtraListaEt1(); } }
ChequearVertical y otras funciones que ella usa creo que son irrelevantes ahí así que no las puse. Pero los traces parecen bien, dice: La situación experimentándose es v,v,v,X Ejecutando EvaluarAplicabilidadEt1 La acción 2 es realizable. Ejecutando AplicarAccionEt1 Se realizó la acción 2; ahora la situación es v,v,0,X Ejecutando EvaluarConocimientoSobreSEt1 Situación a copiar a L2SaE12 es v,v,0,X Esa situación no está anotada; se anota como nro 12 // Copiar array (porque no se puede normalmente): trace("Situación a copiar a "+NextL_SaE+SituacionesNuevas+" es "+Situacion); set (NextL_SaE+SituacionesNuevas, Situacion.slice()); Si dice que la situación a copiar (Situacion) es v,v,0,X, debería generarse un array con eso, y le puse slice para que el array sea una copia y no un acceso directo (o el nombre que le corresponde), funcionó en todos los casos anteriores ¿qué pasa? Hablando con GPT le plantié la posibilidad de que Macromedia Flash 5 esté limitado a 32 arrays, porque vean que llega hasta 31, que si se cuenta el 0 (si existe) son 32, y dijo que sí tiene problemas con eso pero puede que lo haya alucinado ¿qué pasa? ¿qué hago para averiguar el error? Situacion, que es un array, en ese momento es v,v,0,X. El nombre del array a crear es L2SaE12. Quiero que se genere ese array, conteniendo una copia (independiente, no acceso directo) de Situacion. El nombre se genera bien, pero el contenido es una copia acceso directo. @_@ EDIT: No sé qué pasó que ahora me funciona: Variable _level0.L2SaE10 = [object #28] [ 0:"0", 1:"v", 2:"v", 3:"X" ] Variable _level0.S0vvXBestAction = "Desconocida" Variable _level0.S0vvXTurno = "X" Variable _level0.S0vvXFirstAPosible = 1 Variable _level0.S0vvXLastAPosible = 2 Variable _level0.L2SaE11 = [object #29] [ 0:"v", 1:"0", 2:"v", 3:"X" ] Variable _level0.Sv0vXBestAction = "Desconocida" Variable _level0.Sv0vXTurno = "X" Variable _level0.Sv0vXFirstAPosible = 0 Variable _level0.Sv0vXLastAPosible = 2 Variable _level0.L2SaE12 = [object #30] [ 0:"v", 1:"v", 2:"0", 3:"X" ] Variable _level0.Svv0XBestAction = "Desconocida" Variable _level0.Svv0XTurno = "X" Variable _level0.Svv0XFirstAPosible = 0 Variable _level0.Svv0XLastAPosible = 1 Parece haber un array menos, no sé por qué, usando esto: https://text-compare.com/es/Lo único que vi de diferente es que puse como comentario esto y le cambié el valor: // LastListaDeEt1 = Casilleros; y: if (NroDeListaRevisandose < Casilleros) { en vez de usar LastListaDeEt1, que cuando hice las pruebas no sé si lo tenía como MaxCasilleros o eso +1, pero no veo que sea relevante, eso sólo hace que se revisen más listas... Tengo la versión anterior, que fallaba, voy a ver por qué la cantidad de arrays es distinta. Porque al revisar una lista que no tiene situaciones, Situacion queda indefinida, no es un array, entonces es 1 menos. ¿Pero qué tiene que ver cuántas listas revisa con si graba bien una situación o no? O sea, está revisando la lista 1, situación v,v,v,X. Realizando la acción 2, llega a v,v,0,X. Debe grabarla. ¿Por qué si revisa la lista 2 y/o 3 la variable se ve bien y sino no? No veo que tenga relación esa variable (cuántas listas se revisan) con cómo se graba una situación. A ver gente: Se hace esto: if (NroDeListaRevisandose < LastListaDeEt1) { eso determina cuántas listas de situaciones se revisan. Si al principio pongo que LastListaDeEt1 = 1 va a revisar sólo la lista 0, y la última situación nueva a la que llega es: Variable _level0.L1SaE4 = [object #19] [ 0:"v", 1:"v", 2:"v", 3:"X" Si en cambio le pongo 2, revisa hasta la lista 1 y me está funcionando bien: Variable _level0.L2SaE12 = [object #31] [ 0:"v", 1:"v", 2:"0", 3:"X" ] Variable _level0.Svv0XBestAction = "Desconocida" Variable _level0.Svv0XTurno = "X" Variable _level0.Svv0XFirstAPosible = 0 Variable _level0.Svv0XLastAPosible = 1 No tengo mucha idea de qué pasó, por qué antes no funcionaba y ahora sí, ah... si le pongo 3 ocurre el error ¿pero por qué? Lo pensaré.
|
|
|
|
|
|
|