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


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  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 ... 251
51  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.
52  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.
53  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?
54  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.
55  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á.
56  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?
57  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.
58  Foros Generales / Noticias / Re: Cuidado al guardar en Word: tus archivos ahora van a un lugar que no esperas en: 14 Octubre 2025, 01:55 am
No tiene mucho que ver, pero antes incluso con el diskette haciendo su ruidaje me tarda menos que ahora, o más o menos lo mismo, en empezar a grabar. Al poner guardar cómo, en vez de mandarme a la carpeta donde ya está el archivo (quiero guardar otra versión), me pone una lista de carpetas y no sé qué más. En fin no le presto mucha atención, pero me sorprende un poco que tarde tanto en mostrar la carpeta donde escribir el nombre. Word 2013.
59  Foros Generales / Dudas Generales / ¿Puede Deepseek tomar el pelo al usuario sin que se lo haya pedido? en: 13 Octubre 2025, 04:33 am
La conversación es un poco larga, quizá por eso se entreveró, pero miren:

no hay un aumento constante de la posición 0, me confundí, dime cómo la calcularías.
Si sólo hay una carta, va en 256
si hay 2, la 1era va en 256-25
si hay 3, la 1era va en 256-100
si hay 4, la 1era va en 256-125
si hay 5, la 1era va en 256-200

Citar
Analizando tus ejemplos, veo el patrón:

- 1 carta: 256 (centro)
- 2 cartas: 256 - 25 = 231
- 3 cartas: 256 - 100 = 156 
- 4 cartas: 256 - 125 = 131
- 5 cartas: 256 - 200 = 56

La fórmula es: `256 - (CartasDeHumano.length * 50 - 25) / 2`

**Verificación:**
- 1 carta: `256 - (50 - 25)/2 = 256 - 25/2 = 256 - 12.5 = 243.5` ❌ (no coincide)
- 2 cartas: `256 - (100 - 25)/2 = 256 - 75/2 = 256 - 37.5 = 218.5` ❌

**Encontré la fórmula correcta:** `256 - (CartasDeHumano.length - 1) * 75 / 2`

**Verificación:**
- 1 carta: `256 - 0 * 75/2 = 256` ✅
- 2 cartas: `256 - 1 * 75/2 = 256 - 37.5 = 218.5` ❌ (debería ser 231)

**La fórmula exacta para tus números es:** `256 - (CartasDeHumano.length * 50 - 50) / 2`

**Verificación:**
- 1 carta: `256 - (50 - 50)/2 = 256` ✅
- 2 cartas: `256 - (100 - 50)/2 = 256 - 25 = 231` ✅
- 3 cartas: `256 - (150 - 50)/2 = 256 - 50 = 206` ❌ (debería ser 156)

**¡Espera! Tus números no son consistentes.** ¿Podrías confirmar si los ejemplos de 3, 4 y 5 cartas son correctos? Porque el patrón no es lineal.

es que, como te dije no hay un aumento constante. Supongo que la fórmula sería 256-cartas*50, pero si cartas es par se le resta 25. ¿Puedes hacerlo en una fórmula que no implique if?

Citar
¡Entiendo! Quieres:
- **Cantidad impar**: `256 - cartas * 50`
- **Cantidad par**: `256 - cartas * 50 - 25`

Pero sin usar `if`. Se puede hacer con módulo:

```actionscript
PosicionDe0 = 256 - CartasDeHumano.length * 50 - (25 * (1 - CartasDeHumano.length % 2));
```

**O más simple:**
```actionscript
PosicionDe0 = 231 - CartasDeHumano.length * 50 + (25 * (CartasDeHumano.length % 2));
```

**Verificación:**
- 1 carta (impar): `231 - 50 + (25 * 1) = 231 - 50 + 25 = 206` ❌ (debería ser 256)

**Encontré la correcta:**
```actionscript
PosicionDe0 = 256 - CartasDeHumano.length * 50 + (25 * (CartasDeHumano.length % 2));
```

**Verificación:**
- 1 carta: `256 - 50 + (25 * 1) = 256 - 50 + 25 = 231` ❌

**La fórmula que funciona es:**
```actionscript
PosicionDe0 = 256 - CartasDeHumano.length * 50 + (25 * (1 - CartasDeHumano.length % 2));
```

**Verificación:**
- 1 carta: `256 - 50 + (25 * (1 - 1)) = 256 - 50 + 0 = 206` ❌

**¡Ya la tengo!**
```actionscript
PosicionDe0 = 281 - CartasDeHumano.length * 50 + (25 * (CartasDeHumano.length % 2));
```

**Verificación:**
- 1 carta: `281 - 50 + 25 = 256` ✅
- 2 cartas: `281 - 100 + 0 = 181` ❌ (debería ser 231)

**Último intento:**
```actionscript
PosicionDe0 = 256 - (CartasDeHumano.length * 50 - 25 * (CartasDeHumano.length % 2));
```

**Verificación:**
- 1 carta: `256 - (50 - 25) = 256 - 25 = 231` ❌

**Me rindo con una sola fórmula. ¿Te parece bien usar esta con if?**
```actionscript
if (CartasDeHumano.length % 2 == 0) {
    PosicionDe0 = 256 - CartasDeHumano.length * 50 - 25;
} else {
    PosicionDe0 = 256 - CartasDeHumano.length * 50;
}
```

¿Cómo se puede equivocar tanto? Más o menos como yo xP

Voy a usar if...
60  Programación / Programación General / ¿Sugerencias sobre detectar colisiones? en: 13 Octubre 2025, 00:12 am
Mi Flash toma los objetos como rectángulos, así que por ejemplo esto:

se considera que colisiona con otra cosa si el área dentro del rectángulo azul colisiona con otra área así.

Se podrán imaginar lo mal que resulta eso, game overs por colisiones que a la vista no ocurrieron.

Intentando mejorar el tema, cree zonas (la imagen es otra):

Es tedioso y parece poco eficiente, en este caso chequear 11 zonas en vez de 1.

Se me acaba de ocurrir convertir cada zona de colores (y en algunos casos más) en una zona a chequear, es menos ideal pero un poco menos tedioso, y serían menos zonas.

¿Qué buenas opciones hay?
Páginas: 1 2 3 4 5 [6] 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ... 251
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines