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


Tema destacado: Tutorial básico de Quickjs


  Mostrar Mensajes
Páginas: 1 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ... 257
111  Foros Generales / Noticias / Re: Cuidado al guardar en Word: tus archivos ahora van a un lugar que no esperas en: 20 Octubre 2025, 21:47 pm
No sé qué limitaciones tiene el 13 comparado con los recientes, pero el 7... ¿puedes hacer algo como esto?


No es una imagen, es una tabla con muchas partes, algunas combinadas, y con varias imágenes pegadas.
La tabla no es de Excel, es un tipo de tabla más normal que tiene Word.

A mí algo que me falta es el relleno degradado, o como se llame, o los diseños personalizados que había, como amanecer, pero eso creo que porque lo instalé así o lo instalaron así, sin esa opción.

También había opción de texto animado, que ahora creo que no tengo. Aparecían chispitas encima o fila de hormigas, nada del otro mundo.
Digo porque las versiones actuales quizá permiten poner gifs animados y se ven como tales.
¿E imágenes generadas con código? Con algo de random digo. Claro que para eso ya no parece tener sentido usar Word.
112  Programación / Programación General / Re: ¿Sugerencias sobre detectar colisiones? en: 20 Octubre 2025, 01:56 am
Se me ocurrió poner rectángulos/cuadrados girados:

Luego chequeo esas zonas.

El problema es... ¿Cuánto debo girarlos/estirarlos, desde dónde y hacia dónde? Ahí por ejemplo tracé 2 líneas que usen puntas de píxeles extremos. Pero no sé cómo hacer que un cuadrado quede con ese ángulo. Si a esa línea le agrego más líneas de modo que sea un cuadrado rotado y lo convierto en símbolo, va a quedar una figura romboide cuya área va a ser un cuadrado, como se muestra la figura roja. Al crear la zona, debe hacerse derecha y rotarse/estirarse después, cuando ya esté creada, para evitar el problema. Pero de hacer las figuras adecuadas es como que no tengo idea, no me sale bien. Supongo que debo poner paralelogramos en cada zna inclinada, pero no me sale hacerlo rápido, bien.

Por ahora estoy separando a Mario en zonas, ya tengo 3: La cabeza, el pelo de atrás que no se considera zona de hit, y el cuerpo.

Supongo que haré un video que muestre mejor mi problema.
113  Programación / Programación General / Funciones eficientes, cómo. en: 19 Octubre 2025, 23:48 pm
Tengo cartas que causan diversos efectos.

La carta Donkey Kong hace daño al rival.

Milk da 1 punto de vida a su usuario.

Popeye hace daño al rival y da 1 punto de vida al usuario.

Y quiero seguir agregando, pero resolver esto 1ero.

Parecen simplemente 2 efectos, pero es más complejo.

Cuando la carta se usa, marco quién la usó (User) y contra quién (Rival, es obvio pero evita un if).

Donkey Kong parece que puede usar esto:
Código
  1. function TipicoAtaque () {
  2. if (Objetivo == "IA") {
  3. IAHP = IAHP-Ataque;
  4. Mensaje = "¡"+ShowerDeCartas[NroDeCartaDeHumano]+" dañó al rival!";
  5. if (IAHP > 0) {
  6. TerminandoTurnoHumano();
  7. } else {
  8. HumanoGana();
  9. }
  10. } else {
  11. HumanoHP = HumanoHP-Ataque;
  12. Mensaje = Mensaje+"\n¡"+ShowerDeCartas[NroDeCartaDeIA]+" rival te dañó!";
  13. if (HumanoHP > 0) {
  14. TerminandoTurnoDeIA();
  15. } else {
  16. HumanoPierde();
  17. }
  18. }
  19. }

Milk parece que puede usar esto:
Código
  1. function HPUp (HP) {
  2. if (User == "Humano") {
  3. HumanoHP = HumanoHP+HP;
  4. Mensaje = "¡"+ShowerDeCartas[NroDeCartaDeHumano]+" te dió "+HP+"HP!";
  5. TerminandoTurnoHumano();
  6. } else {
  7. IAHP = IAHP+HP;
  8. Mensaje = Mensaje+"\n¡"+ShowerDeCartas[NroDeCartaDeIA]+" rival le dió "+HP+"HP!";
  9. TerminandoTurnoDeIA();
  10. }
  11. }

Popeye sería 1ero HPUp y luego TipicoAtaque, pero HPUp termina el turno. Parece que debo crear una función independiente que termine el turno, pero se debe indicar el turno de quién, y para eso la función tendría que tener otro if chequeando lo que ya se chequeó, o tendrían que ser 2 funciones, o más, me mareo.

Donkey Kong:
Atacar al objetivo, poner mensajes informativos.
Si el objetivo no sobrevivió, se informa y el juego termina.
sino, puede que el usuario reciba daño de veneno (si está envenenado) u otras cosas, hay que aplicarlas, informar, ver si el usuario sobrevive, en tal caso iniciar el turno del rival y sino terminar el juego. Informar.

Milk:
Dar HP al usuario, informar.
Fase "terminando el turno", lo que mencioné del veneno, etc.

Popeye:
Dar HP al usuario, informar.
Atacar al objetivo, poner mensajes informativos.
Fase "terminando el turno", lo que mencioné del veneno, etc.

Parece simple, pero está el tema de los ifs.

Si fuese así, 3 funciones, lo veo así:

Milk:
HPUp:
(Si el usuario es humano, aumentar 1HP al humano.
sino, al rival).
TerminandoTurno:
(Si el usuario es humano, ver si recibe daño de veneno. Si sobrevive, iniciar turno del otro, sino terminar juego.
sino, ver si la IA recibe daño por veneno. Si sobrevive... etc).

Donkey Kong:
AtaqueTipico:
(Si el usuario es humano, reducir el HP de la IA. Si sobrevivió, TerminandoTurno, sino informar victoria y fin.
sino, del humano. Si sobrevivió, TerminandoTurno, sino informar derrota y fin.).

Popeye:
HPUp.
AtaqueTipico.
TerminandoTurno.

¿Ven que en Milk y Donkey Kong haría 2 veces el mismo if, y en Popeye lo haría 3? No creo que sea bueno repetir el if.

Veo que en estos casos no es necesario considerar el objetivo, es obvio.

Tengan en cuenta además que hay cartas que harían daño a su usuario, siguiendo la lógica sería:
Autodaño:
(Si el usuario es humano, reducir su HP.
sino, de la IA).
AtaqueTipico.
EvaluarSupervivencias:
Código:
Si el usuario quedó sin HP
   Si el rival quedó sin HP
      Empate
   sino
      Usuario pierde.
sino si el rival quedó sin HP
   Usuario gana
sino
   TerminandoTurno
...o sea, la evaluación de la supervivencia de 1, que se hacía en AtaqueTipico, habría que hacerla por separado, acá se hace de los 2 a las vez porque hubo daño a ambos. Otra opción sería no usar ataque típico acá sino algo como AmbosDañados...


¿Uds cómo harían esto?
114  Programación / Programación General / Permutaciones para campeonatos. en: 19 Octubre 2025, 14:07 pm
Quizá no se llama así, pero supongan que hay estos 3 equipos:
Speed
Missile
Double

La forma más fácil de permutarlos es:
Speed   Missile
Speed   Double
Missile   Speed
Missile   Double
Double   Speed
Double   Missile

Con Python una IA lo hizo así:
Código
  1. # -*- coding: ANSI -*-
  2. elementos = ["Speed", "Missile", "Double"]
  3.  
  4. with open("permutaciones.txt", "w", encoding="utf-8") as txt:
  5.    for a in elementos:
  6.        for b in elementos:
  7.            if a != b:  # Esto evita pares con el mismo elemento
  8.                txt.write(a + "\t" + b + "\n")

Pero si fueran muchos equipos está bastante raro, un equipo jugaría muchos partidos seguidos de locatario, otros descansarían más, la gente se aburriría de que durante un tiempo siempre juegue el mismo, y casi nunca otro que le interese.

Un orden mejor sería así:
Speed   Missile
Double   Speed
Missile   Double
Missile Speed
Speed   Double
Double   Missile

La pregunta sería cómo se logra que el programa los genere en un orden así.

Además quisiera que la dirección sea distinta, o sea:
Partido1   Partido2   Partido3   etc
Equipo1      Equipo1      Equipo1      etc
Equipo2      Equipo2      Equipo2      etc
o sea:
Speed      Double      etc
Missile      Speed      etc

Separados por un tab.
115  Foros Generales / Dudas Generales / Re: ¿Puede Deepseek tomar el pelo al usuario sin que se lo haya pedido? en: 18 Octubre 2025, 18:22 pm
En su defensa, debo decir que detectó cómo se determina Influencia aquí:

En 2 intentos, mientras que GPT en 2 no pudo. Los estaba usando al mismo tiempo.
116  Foros Generales / Dudas Generales / Re: Hola, alguien desarrollo su propia IA ? en: 18 Octubre 2025, 06:44 am
Lo mío es más simplón.

Creo ya haber contado la historia en el foro...

Más o menos en 2008 empecé a tener dudas sobre qué hacer, cuales eran las opciones y las consecuencias, se me ocurrió que lo averigue un programa y así fue como empecé con el tema.

Aunque ya había tenido una experiencia haciendo un campeonato virtual de luchadores con los puntos diferentemente repartidos en puntos de vida y de ataque, con un resultado al revés del que suponía: Lo mejor fue aproximadamente 60% a la vida y 40% al ataque.

¿Qué es lo más sencillo que una PC puede averiguar? Me lo pregunté muchas veces en distintas ocasiones. Volví a empezar en muchas ocasiones. Si mal no recuerdo, un número, aunque el mismo programa lo tiene guardado, es sólo para practicar.

¿Cuales son los posibles siguientes niveles? O sea, cosas más difíciles. Pensé en eso muchas veces, pero no me sirvió de mucho, he dado muchas vueltas... Por ejemplo esto fue de 2015:


Actualmente intento que un programa averigüe cómo jugar bien al Signos en línea, que es como el 3 en línea pero en vez de 3 puede ser otro número y el tamaño del tablero otro (aunque siempre cuadrado), pero como no funcionó y no le encontré la falla empecé a hacer una versión para un juego más sencillo. La original puedes verla aquí en la sección de Programación general, la versión más sencilla (que aún no terminé) es:
Código
  1. // Juego simple para aprender a programar mejor:
  2. // Aportar o no, 1 o 0, 2 jugadores se turnan aportando o...
  3. // no, hasta que haya 3 aportes o 2 fallos. No son rivales,
  4. // ganan ambos o pierden ambos.
  5. // Este programa tiene básicamente 2 etapas,
  6. // que se pueden resumir así:
  7. // Nota: La situación inicial, en que no se realizaron acciones,
  8. // estará guardada en la lista nro 0 (0 acciones).
  9. // 1:
  10. // Probar acciones en cada situación de la lista nro 0,
  11. // guardando en una nueva lista las nuevas situaciones (que no...
  12. // sean victoria ni derrota). Repetir con cada nueva lista...
  13. // hasta que no se genere una nueva situación.
  14. // 2:
  15. // Desde las últimas listas, probar las acciones.
  16. // Guardar cuántas acciones causan victoria y cuántas derrota.
  17. // Averiguar la mejor acción en cada situación, basado en el...
  18. // mejor resultado seguro que causa (asumiendo que el compañero...
  19. // juega bien), y en 2nda instancia el más probable (asumiendo...
  20. // que juegue al azar). Repetir hasta resolver la lista 0.
  21. AportesRequeridos = 3;
  22. FallosParaDerrota = 2;
  23. // En las listas L_SaE se irán poniendo las situaciones a...
  24. // experimentar en que hayan transcurrido _ turnos.
  25. // En la lista 0 se agrega una situación, la inicial:
  26. L0SaE1 = "";
  27. // Los datos de las situaciones no están en las listas,
  28. // se crean aparte. Con esta variable se evita repetidamente...
  29. // convertir en texto y concatenar:
  30. S_ = "S";
  31. // Datos de la situación:
  32. // Usada para fácilmente saber de qué signo es turno:
  33. set (S_+"Turno", "X");
  34. NroDeListaRevisandose = -1;
  35. // /////////////////////////////////////////////
  36. // /////////////////  Etapa 1  /////////////////
  37. // /////////////////////////////////////////////
  38. // Consiste en llegar a nuevas situaciones y guardarlas,
  39. // si no son victoria ni derrota.
  40. //
  41. // Usada a continuación y durante la etapa 1 (Et1)...
  42. // cuando no hay más situaciones en la lista revisándose:
  43. function BuscarOtraListaEt1 () {
  44. trace("Ejecutando BuscarOtraListaEt1");
  45. NroDeListaRevisandose++;
  46. PrepararUsoDeLista();
  47. PrepararSaE();
  48. // El if no está bien, pero funcionará creo:
  49. // Si la lista tiene alguna situación:
  50. if (NroDeListaRevisandose < 5) {
  51. // Para evitar concatenar cosas al guardar datos de situaciones nuevas:
  52. NextL_SaE = "L"+(NroDeListaRevisandose+1)+"SaE";
  53. // trace("NextL_SaE: "+NextL_SaE);
  54. // Usado en EvaluarConocimientoSobreSEt1 para...
  55. // nombrar las situaciones nuevas que se logren:
  56. SituacionesNuevas = 0;
  57. } else {
  58. trace( "No se hallaron situaciones en la nueva lista; inicia la etapa 2.");
  59. // Iniciar Etapa 3:
  60. gotoAndStop(4);
  61. }
  62. }
  63. BuscarOtraListaEt1();
  64. // Usada cuando se cambia de lista, en BuscarOtraListaEt1,
  65. // y al comenzar Et2:
  66. function PrepararUsoDeLista () {
  67. trace("Ejecutando PrepararUsoDeLista");
  68. // Para evitar concatenar repetidamente:
  69. L_SaE = "L"+NroDeListaRevisandose+"SaE";
  70. // trace("L_SaE: "+L_SaE);
  71. NroDeSExperimentandose = 1;
  72. // También para evitar concatenar repetidamente:
  73. L_SaE_ = L_SaE+"1";
  74. // trace("L_SaE_: "+L_SaE_);
  75. trace("La lista preparada es la "+NroDeListaRevisandose);
  76. }
  77. // Usada cuando se elige una SaE, en BuscarOtraListaEt1,
  78. // BuscarOtraSituacionEt1 y PrepararSaEEt3:
  79. function PrepararSaE () {
  80. trace("Ejecutando PrepararSaE");
  81. SituacionBase = eval(L_SaE_);
  82. trace("Se inician experimentos en otra situación de la lista, la nro "+NroDeSExperimentandose+", que es "+SituacionBase);
  83. S_ = "S"+SituacionBase;
  84. Turno = eval(S_+"Turno");
  85. Action = 0;
  86. }
  87. // Usada en frame 2 (o etapa 1) repetidamente:
  88. function ResetearSituacionEt1 () {
  89. trace("Ejecutando ResetearSituacionEt1");
  90. // Plantear situación porque puede modificarse pero...
  91. // podría requerirse su estado original luego:
  92. Situacion = SituacionBase;
  93. // trace("La situación experimentándose es "+Situacion);
  94. EvaluarAplicabilidadEt1();
  95. }
  96. // Inútil aquí, queda para no complicar la simplificación:
  97. function EvaluarAplicabilidadEt1 () {
  98. AplicarAccionEt1();
  99. }
  100. // Usada luego de EvaluarAplicabilidadEt1,
  101. // si una acción es realizable:
  102. function AplicarAccionEt1 () {
  103. trace("Ejecutando AplicarAccionEt1");
  104. Situacion = Situacion+Action;
  105. trace("Se realizó la acción "+Action+"; ahora la situación es "+Situacion);
  106. // ¿Se debe continuar? ¿hay 2 0s o 3 1s?
  107. EvaluarContinuabilidad();
  108. if (Continuabilidad == "Sí") {
  109. EvaluarConocimientoSobreSEt1();
  110. }
  111. // ¿Queda alguna acción sin probar en la situación?
  112. BuscarOtraAccionEt1();
  113. }
  114. // Usada en AplicarAccionEt1:
  115. function EvaluarContinuabilidad () {
  116. trace("Ejecutando EvaluarContinuabilidad");
  117. Continuabilidad = "Sí";
  118. CantidadDe0s = 0;
  119. CantidadDe1s = 0;
  120. CaracteraContar = 0;
  121. do {
  122. if (Situacion.charat(CaracteraContar) == "0") {
  123. CantidadDe0s++;
  124. } else {
  125. CantidadDe1s++;
  126. }
  127. CaracteraContar++;
  128. } while (CaracteraContar < Situacion.length);
  129. if (CantidadDe0s == 2) {
  130. trace ("Se hallaron 2 0s");
  131. Continuabilidad = 0;
  132. } else if (CantidadDe1s == 3) {
  133. trace ("Se hallaron 3 1s");
  134. Continuabilidad = 1;
  135. }
  136. }
  137. // Usada en EvaluarAplicabilidadEt1 cuando una acción no es...
  138. // realizable:
  139. function SinResetBuscarOtraAccionEt1 () {
  140. trace("Ejecutando SinResetBuscarOtraAccionEt1");
  141. if (Action < 1) {
  142. // Si queda alguna acción sin probar...
  143. // en la situación, probarla:
  144. Action++;
  145. EvaluarAplicabilidadEt1();
  146. } else {
  147. trace("No hay más acciones realizables.");
  148. BuscarOtraSituacionEt1();
  149. }
  150. }
  151. // Usada luego de AplicarAccionEt1:
  152. function BuscarOtraAccionEt1 () {
  153. trace("Ejecutando BuscarOtraAccionEt1");
  154. if (Action < 1) {
  155. // Si queda alguna acción sin probar...
  156. // en la situación, probarla:
  157. Action++;
  158. trace("La nueva acción a probar es "+Action);
  159. // Se ejecutará ResetearSituacionEt1.
  160. } else {
  161. trace("No hay más acciones realizables.");
  162. BuscarOtraSituacionEt1();
  163. }
  164. }
  165. // Usada en AplicarAccionEt1 cuando no hay victoria (ni empate,
  166. // aunque por ahora no ocurren):
  167. function EvaluarConocimientoSobreSEt1 () {
  168. trace("Ejecutando EvaluarConocimientoSobreSEt1");
  169. // Estas 2 variables son para evitar reconcatenar:
  170. NewS_ = "S"+Situacion;
  171. NewS_BestAction = NewS_+"BestAction";
  172. // ¿Se ha llegado antes a la situación?
  173. if (eval(NewS_BestAction) == undefined) {
  174. // No, anotar que debe investigarse:
  175. SituacionesNuevas++;
  176. trace("Situación a anotar a "+NextL_SaE+SituacionesNuevas+" es "+Situacion);
  177. set (NextL_SaE+SituacionesNuevas, Situacion);
  178. trace("Esa situación no está anotada; se anota como nro "+SituacionesNuevas);
  179. // trace(" NewS_: "+NewS_);
  180. // trace(" NewS_BestAction: "+NewS_BestAction);
  181. set(NewS_BestAction, "Desconocida");
  182. if (Turno == "X") {
  183. set (NewS_+"Turno", "0");
  184. } else {
  185. set (NewS_+"Turno", "X");
  186. }
  187. }
  188. }
  189. // Usada en BuscarOtraAccionEt1 cuando no hay más acciones posibles,
  190. // y en SinResetBuscarOtraAccionEt1:
  191. function BuscarOtraSituacionEt1 () {
  192. trace("Ejecutando BuscarOtraSituacionEt1");
  193. NroDeSExperimentandose++;
  194. if (eval(L_SaE+NroDeSExperimentandose) != undefined) {
  195. // Hay otra situación en la lista,
  196. // prepararse a usarla:
  197. L_SaE_ = L_SaE+NroDeSExperimentandose;
  198. PrepararSaE();
  199. } else {
  200. trace("No hay más situaciones a experimentar en la lista actual, se mirará otra.");
  201. BuscarOtraListaEt1();
  202. }
  203. }
  204. // /////////////////////////////////////////////
  205. // /////////////////  Etapa 2  /////////////////
  206. // /////////////////////////////////////////////
  207. // Innecesaria aquí.
  208. // /////////////////////////////////////////////
  209. // /////////////////  Etapa 3  /////////////////
  210. // /////////////////////////////////////////////
  211. // Consiste en guardar los resultados de las acciones en...
  212. // situaciones en que más de 1 acción es posible.
  213. // Particularmente se guarda la mejor acción.
  214. // El resultado de las acciones puede ser victoria,
  215. // una situación con posibles resultados,
  216. // y en la penúltima lista una situación con un único posible...
  217. // resultado.
  218. //
  219. // Usada antes y durante esta etapa...
  220. // cuando no hay más situaciones en la lista revisándose:
  221. function BuscarOtraListaEt3 () {
  222. trace("Ejecutando BuscarOtraListaEt3");
  223. NroDeListaRevisandose--;
  224. if (NroDeListaRevisandose > -1) {
  225. // Si se halla una lista:
  226. PrepararUsoDeLista();
  227. PrepararSaEEt3();
  228. } else {
  229. trace("No hay más listas a revisar; programa terminado.");
  230. // En este frame nada hay, es sólo para mostrar el mensaje:
  231. gotoAndStop(5);
  232. }
  233. }
  234. // Casi como PrepararSaE. Usada cuando se elige una SaE,
  235. // en BuscarOtraListaEt3 y BuscarOtraSituacionEt3:
  236. function PrepararSaEEt3 () {
  237. trace("Ejecutando PrepararSaEEt3");
  238. PrepararSaE();
  239. // Para evitar evals y concatenaciones repetidamente:
  240. BestAction = "";
  241. Victorias = 0;
  242. Derrotas = 0;
  243. // Establecer que hasta ahora los resultados hallados...
  244. // son peores que lo posible, para que se sustituyan por...
  245. // cualquier acción:
  246. // EL VALOR DEBERÍA SER PEOR?
  247. BestResultadoEObtenido = "Derrota";
  248. // Si 2 acciones causan victoria segura,
  249. // esto sirve para elegir la mejor de ellas:
  250. BestDistanciaaGanar = 10;
  251. // No HAY DERROTA SEGURA, esto está por probar...
  252. // Si 2 acciones causan derrota segura,
  253. // esto sirve para elegir la mejor de ellas:
  254. BestChanceDeGanarEnD = -1;
  255. BestDistanciaaGanarEnD = 10;
  256. }
  257. // Usada en frame 4 (o etapa 3) repetidamente:
  258. function ResetearSituacionEt3 () {
  259. // Plantear situación porque puede modificarse pero...
  260. // podría requerirse su estado original luego:
  261. Situacion = SituacionBase;
  262. trace("La situación experimentándose es "+Situacion);
  263. EvaluarAplicabilidadEt3();
  264. }
  265. // Usada luego de que cambia la SaE y/o la acción, en Et3:
  266. function EvaluarAplicabilidadEt3 () {
  267. AplicarAccionEt3();
  268. }
  269. // Usada luego de EvaluarAplicabilidadEt3,
  270. // si una acción es realizable:
  271. function AplicarAccionEt3 () {
  272. // Los datos se guardarán bien en GuardarDatosEt3.
  273. // Por ahora varios se están guardando en variables más simples de nombrar.
  274. // Además algunos no se pueden guardar aún (VictoriasDeX, NewVictoriasDe0...).
  275. // Y DistanciaaGanar se está guardando como -1 de lo que debe, para no tener que estar sumando.
  276. trace("Ejecutando AplicarAccionEt3");
  277. Situacion = Situacion+Action;
  278. trace("Se realizó la acción "+Action+"; ahora la situación es "+Situacion);
  279. // ¿Se debe continuar? ¿hay 2 0s o 3 1s?
  280. EvaluarContinuabilidad();
  281. if (Continuabilidad == "Sí") {
  282. trace("No hubo victoria, agregando datos...");
  283. // Agregar los posibles resultados de la...
  284. // situación obtenida:
  285. // Estas 5 variables son para evitar reconcatenar:
  286. NewS_ = "S"+Situacion;
  287. NewVictorias = eval(NewS_+"Victorias");
  288. NewDerrotas = eval(NewS_+"Derrotas");
  289. Victorias = Victorias+NewVictorias;
  290. Derrotas = Derrotas+NewDerrotas;
  291. trace(Victorias+", "+Derrotas);
  292. // Si en la SaE ya se halló una acción que...
  293. // causa victoria segura:
  294. if (BestResultadoEObtenido == "Victoria") {
  295. trace("El mejor resultado logrado es victoria");
  296. // Si la acción recién usada también causa eso:
  297. if (eval(NewS_+"ResultadoEsperado") == "Victoria") {
  298. trace("La acción causa victoria segura (no inmediata)");
  299. trace("Pero ya se halló otra, se verá cual causa más rápido");
  300. // Si dicha acción la causa faster:
  301. if (eval(NewS_+"DistanciaaGanar") < BestDistanciaaGanar) {
  302. // Sustituir datos:
  303. trace("La nueva fue mejor, sustituyendo datos...");
  304. BestDistanciaaGanar = eval(NewS_+"DistanciaaGanar");
  305. BestAction = Action;
  306. }
  307. // SINO SI LA CAUSA IGUAL DE RÁPIDO HABRÍA QUE AVERIGUAR CHANCES, pero se gana igual...
  308. // sino dicha acción es peor, no prestarle más atención.
  309. }
  310. // idem.
  311. // sino el mejor resultado esperado hallado es derrota:
  312. } else {
  313. // Si la acción recién usada causa que...
  314. // el resultado esperado sea victoria:
  315. if (eval(NewS_+"ResultadoEsperado") == "Victoria") {
  316. // Sustituir datos:
  317. BestResultadoEObtenido = "Victoria";
  318. BestDistanciaaGanar = eval(NewS_+"DistanciaaGanar");
  319. BestAction = Action;
  320. // sino es derrota:
  321. } else {
  322. // Averiguar chance de ganar:
  323. Posibilidades = NewVictorias+NewDerrotas;
  324. ChanceDeGanar = NewVictorias*100/Posibilidades;
  325. // Si es más alta que la hallada antes:
  326. if (ChanceDeGanar > BestChanceDeGanarEnD) {
  327. // Sustituir datos:
  328. BestChanceDeGanarEnD = ChanceDePerder;
  329. BestAction = Action;
  330. // sino si la chance es igual:
  331. // ACÁ HABRÍA QUE VER LA DISTANCIA A GANAR EN D
  332. // sino es peorm, no prestarle atención.
  333. }
  334. }
  335. }
  336. } else {
  337. // Incrementar victorias:
  338. // Esta es para evitar reconcatenar:
  339. VariableaIncrementar = "Victorias";
  340. set (VariableaIncrementar, eval(VariableaIncrementar)+1);
  341. if (BestDistanciaaGanar > 0) {
  342. // Sustituir datos:
  343. BestResultadoEObtenido = "Victorias";
  344. BestDistanciaaGanar = 0;
  345. BestAction = Action;
  346. }
  347. }
  348. // ¿Queda alguna acción sin probar en la situación?
  349. BuscarOtraAccionEt3();
  350. }
  351. // Usada en EvaluarAplicabilidadEt3 cuando una acción no es...
  352. // realizable:
  353. function SinResetBuscarOtraAccionEt3 () {
  354. trace("Ejecutando SinResetBuscarOtraAccionEt3");
  355. if (Action < LastActionPosible) {
  356. // Si queda alguna acción sin probar...
  357. // en la situación, probarla:
  358. Action++;
  359. EvaluarAplicabilidadEt3();
  360. } else {
  361. trace("No hay más acciones realizables.");
  362. BuscarOtraSituacionEt3();
  363. }
  364. }
  365. // Usada luego de AplicarAccionEt3:
  366. function BuscarOtraAccionEt3 () {
  367. trace("Ejecutando BuscarOtraAccionEt3");
  368. if (Action < LastActionPosible) {
  369. // Si queda alguna acción sin probar...
  370. // en la situación, probarla:
  371. Action++;
  372. // Se ejecutará ResetearSituacionEt3.
  373. } else {
  374. trace("No hay más acciones realizables.");
  375. BuscarOtraSituacionEt3();
  376. }
  377. }
  378. // Usada cuando no hay más acciones posibles:
  379. function GuardarDatosEt3 () {
  380. trace("Ejecutando GuardarDatosEt3");
  381. set(S_+"VictoriasDeX", VictoriasDeX);
  382. set(S_+"VictoriasDe0", VictoriasDe0);
  383. set(S_+"Empates", Empates);
  384. set(S_+"BestAction", BestAction);
  385. set(S_+"DistanciaaGanar", BestDistanciaaGanar+1);
  386. set(S_+"ResultadoEsperado", BestResultadoEObtenido);
  387. }
  388. // Usada en BuscarOtraAccionEt3 cuando no hay más acciones posibles,
  389. // y en SinResetBuscarOtraAccionEt3:
  390. function BuscarOtraSituacionEt3 () {
  391. trace("Ejecutando BuscarOtraSituacionEt3");
  392. NroDeSExperimentandose++;
  393. if (eval(L_SaE+NroDeSExperimentandose) != undefined) {
  394. // Hay otra situación en la lista,
  395. // prepararse a usarla:
  396. L_SaE_ = L_SaE+NroDeSExperimentandose;
  397. PrepararSaEEt3();
  398. } else {
  399. trace("No hay más situaciones a experimentar en la lista actual, se mirará otra.");
  400. BuscarOtraListaEt3();
  401. }
  402. }

¿Y tú qué de útil o interesante puedes mostrar?
117  Programación / Programación General / ¿Cómo logro que las cartas se muestren mejor? en: 17 Octubre 2025, 04:11 am
Por ahora logré esto:

En vez de T7 debería mostrarse el 7 de tréboles... o por lo menos que diga "7 tréboles"
y en D2 el 2 de diamantes, o que diga "2 diamantes".

Es para un Black Jack.

Código
  1. // Generar array de cartas:
  2. Cartas = [];
  3. Nro = 0;
  4. do {
  5. Nro++;
  6. Cartas[Cartas.length] = "P"+Nro;
  7. Cartas[Cartas.length] = "T"+Nro;
  8. Cartas[Cartas.length] = "C"+Nro;
  9. Cartas[Cartas.length] = "D"+Nro;
  10. } while (Nro < 13);
  11.  
  12. // Ordenarlas al azar:
  13. Posicion1aReubicarse = Cartas.length-1;
  14. while (Posicion1aReubicarse>0) {
  15. Posicion2aReubicarse = random(Posicion1aReubicarse+1);
  16. SaveDeElemento1 = Cartas[Posicion1aReubicarse];
  17. Cartas[Posicion1aReubicarse] = Cartas[Posicion2aReubicarse];
  18. Cartas[Posicion2aReubicarse] = SaveDeElemento1;
  19. Posicion1aReubicarse--;
  20. }
  21.  
  22. // Dar a jugadores:
  23. SiguienteNroDeCarta = 0;
  24. CartasDeHumano = [];
  25. CartasDeIA = [];
  26. do {
  27. CartasDeHumano[CartasDeHumano.length] = Cartas[SiguienteNroDeCarta];
  28. CartasDeIA[CartasDeIA.length] = Cartas[SiguienteNroDeCarta+1];
  29. SiguienteNroDeCarta = SiguienteNroDeCarta+2;
  30. } while (SiguienteNroDeCarta < 4);
  31. Mensaje = "Has recibido "+CartasDeHumano[0];
  32. Mensaje = Mensaje+"\nY "+CartasDeHumano[1];
  33.  
  34. // Agregarlas en pantalla:
  35. function AgregarCartasDeHumano () {
  36. CartaaAgregar = 0;
  37. if (CartasDeHumano.length % 2 == 0) {
  38. PosicionDe0 = 256 - CartasDeHumano.length-1 * 50 - 25;
  39. } else {
  40. PosicionDe0 = 256 - CartasDeHumano.length * 50;
  41. }
  42. do {
  43. Nombre = "CartaDeHumano"+CartasDeHumano[CartaaAgregar];
  44. attachMovie ("sCarta", Nombre, CartaaAgregar);
  45. setProperty (Nombre, _x, PosicionDe0+(CartaaAgregar)*150);
  46. setProperty (Nombre, _y, 192);
  47. set (Nombre+".Text", CartasDeHumano[CartaaAgregar]);
  48. CartaaAgregar++;
  49. } while (CartaaAgregar < CartasDeHumano.length);
  50. }
  51. AgregarCartasDeHumano();
  52.  
  53. // Calcular suma de humano:
  54. ValorDeCartaHumana0 = Math.min(10, Number(CartasDeHumano[0].substring(1, CartasDeHumano[0].length)));
  55. ValorDeCartaHumana1 = Math.min(10, Number(CartasDeHumano[1].substring(1, CartasDeHumano[1].length)));
  56. if (ValorDeCartaHumana0 == 1) {
  57. SumaDeHumano = 11+ValorDeCartaHumana1;
  58. } else if (ValorDeCarta1 == 1) {
  59. SumaDeHumano = ValorDeCartaHumana0+11;
  60. } else {
  61. SumaDeHumano = ValorDeCartaHumana0+ValorDeCartaHumana1;
  62. }
  63. Mensaje = Mensaje+"\nTu suma es "+SumaDeHumano;
  64.  
  65. // Calcular suma de IA:
  66. ValorDeCartaDeIA0 = Math.min(10, Number(CartasDeIA[0].substring(1, CartasDeIA[0].length)));
  67. ValorDeCartaDeIA1 = Math.min(10, Number(CartasDeIA[1].substring(1, CartasDeIA[1].length)));
  68. if (ValorDeCartaDeIA0 == 1) {
  69. SumaDeIA = 11+ValorDeCartaDeIA1;
  70. } else if (ValorDeCartaDeIA1 == 1) {
  71. SumaDeIA = ValorDeCartaDeIA0+11;
  72. } else {
  73. SumaDeIA = ValorDeCartaDeIA0+ValorDeCartaDeIA1;
  74. }
  75. Mensaje = Mensaje+"\nLa suma del rival es "+SumaDeIA;

No quiero copiar y pegar dibujos de 13*4 cartas. Debo copiar y pegar los 4 íconos (trébol, etc), y según la carta insertar en ella X de esos íconos, distribuídos en ella según el caso. Para J, Q, K y 1 sí usaré los dibujos.

¿Cómo lo hago?

Sobre que aparezca un texto más completo ya se me ocurrió cómo: El programa guarda el 1er caracter, lo quita, pone lo que queda (el número) y luego dependiendo de cual sea el caracter guardado agrega el texto, por ejemplo "tréboles" si es "T". Hago eso ahora.
118  Media / Multimedia / Descargar videos con Chrome desactualizado o... Firefox? en: 17 Octubre 2025, 01:12 am
No lo puedo actualizar y según GPT por eso no puedo descargar Video DownloadHelper que me había recomendado SonGoku aquí. Dice: Error de descarga: Invalid manifest

GPT también da otra posibles explicaciones, como que es el antivirus, pero casi nunca me bloquea cosas, además cuando lo hace pone un cartel suyo.

Tengo Windows 7, mi Chome es... Versión 109.0.5414.120 (Build oficial) (64 bits).

Si funciona con Firefox, ok, pruebo.


Edit:
Probé JDownloader, puse que me muestre los links y lo que me muestra o pude ver son "samples" que al descargarlos no son el video que me interesa.

Edit2: Probé Download profesional o no sé qué y posiblemente otra cosa, pero ya pude con esto:
https://gist.github.com/danfinlay/7357098
Tuve que seleccionar un texto que a penas veo y usar la flecha de abajo e ir haciendo doble clics hasta que apareció el video en una ventana sin limitaciones o donde al hacer clic derecho apaece guardar cómo y ya está.
119  Foros Generales / Noticias / Re: El Parlamento Europeo pide prohibir el acceso a redes sociales de los menores de 13 años en: 17 Octubre 2025, 00:59 am
¿No puede la maestra montar un foro para que los alumnos hablen ahí entre ellos de dudas varias?

¿Y pueden usar IA tipo GPT o no?
120  Media / Diseño Gráfico / Re: ¿Cuales son los chat bots dibujantes suficientemente gratis? en: 14 Octubre 2025, 05:34 am
Online me solucionó el problema, pero veo que hay créditos, que no sé si se recargan por día o qué. Veré si lo puedo descargar y si funciona porque leí que requiere 2.4 GB de VRAM.
Páginas: 1 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ... 257
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines