Foro SofosAgora

Foro abierto a los intereses de sus usuarios. Debate, aprende y diviértete.
Fecha actual 24 May 2019, 17:55

Todos los horarios son UTC + 1 hora [ DST ]




Nuevo tema Responder al tema  [ 9 mensajes ] 
Autor Mensaje
NotaPublicado: 07 Mar 2019, 14:39 
Desconectado
Avatar de Usuario

Registrado: 10 Ago 2011, 20:39
Mensajes: 9372
Sin programación significa sin hacer un programa que haga la investigación.

No lo consigo...

Age of Empires 1 Rise of Rome:
Spoiler: show
Tuve ganas de jugar partidas así:
Mapa: Minúsculo.
Tipo: Aleatorio pero no islas porque al ser minúsculo y tanta agua no hay suficiente madera y comida en tierra, y la computadora juega mal así.
Jugadores: 8
Grupos: La computadora en el grupo 1, yo en el 2.
Nivel de la computadora: Máximo.
Civilizaciones: Aleatorias.
Posiciones fijas: No.

Primero probé cómo se aumentaba la edad más rápido, no porque lo considerara mejor, fue curiosidad. Los datos siguientes corresponden a luego de que la computadora me destrozara.
Civilización___Aldeanos___Bajas enemigas___Demoliciones___Bajas propias___Tiempo requerido
Parmirena____3________0_______________3____________3____________10
Parmirena____4________0_______________0____________6____________7
Griega_______5________4_______________2___________13____________Fail
Choson______6________4_______________1____________14___________7
Cartaginesa___7________3_______________4___________9____________7-8
Persa________8________2_______________10__________10___________7-8
Choson______9________2_______________4____________19___________Fail
Romana_____10________3_______________9___________11___________Fail
Cartaginesa__11________9_______________14__________19___________Fail
Minoica______12_______15______________8____________21___________Fail
Romana_____13________0______________5____________23___________7-9
Palmirena____14_______7_______________4____________17___________Fail
Palmirena____15_______3_______________4____________20___________Fail

Por ahí tuve ganas de hacer conclusiones probables basado en esos datos. No sé cómo se hace.
Lo primero que hice fue tratar de explicar la relación entre aldeanos y bajas enemigas. Parece claro que entre más aldeanos, más probablemente más bajas enemigas habrá. ¿Pero cómo decirlo de modo más exacto? A lo que llegué fue a que bajas enemigas es igual a Aldeanos con un rango de -13 a +3. Pero eso es sólo ver la máxima diferencia positiva y la máxima diferencia negativa. Algo mejor se me ocurre que sería ver todas las diferencias y hacer un promedio. O ya que Aldeanos suele ser mayor, dividirlo por bajas enemigas y luego hacer un promedio de eso. En cuanto a porcentajes, bajas enemigas puede ser desde 0% a algo más de 100% de los aldeanos, digamos desde *0 a *1.2.
Luego hice algo similar con las demás columnas, pero en eso me hice más consciente de que se pueden analizar 3 a la vez, por ejemplo la cantidad de bajas propias parece relacionada con la cantidad de aldeanos y de si hay fail, porque si lo hay entonces se hacen más aldeanos (avanzar de edad requiere comida, hacer aldeanos también, así que si no se llega a la cantidad de aldeanos requerida porque los matan se seguirán haciendo más, la comida que iba usarse para avanzar se usa en aldeanos, aunque es menos), y la cantidad de bajas enemigas y demoliciones probablemente disminuya la cantidad de aldeanos perdidos porque el tiempo que hubieran dedicado a recolectar cosas para crear más aldeanos que serían derrotados lo dedicaron a pelear, se da más aún si es contra otros aldeanos porque son batallas más largas y ganables. Me pareció mucha cosa y lo dejé por ahora.
También analicé un poco las civilizaciones, está claro que importa cual se esté usando, pero en principio era un dato que quería no tener en cuenta.

Luego probé varias cosas pero no puedo. La idea es hacer pruebas como dice el título. La tabla que mostré es aburrida hacerla y poco productiva. Intenté algo mejor...
Civilización___Producción___Depósitos (granero y almacén)___Acción cuando atacan a aldeanos___Acción de los soldados___Bajas enemigas___Demoliciones___Bajas propias
Dicho de otro modo:
Yamato, aldeanos, no, nada, no hay soldados: 0-2-26. 17 fue la máxima cantidad de aldeanos).
Choson, garrotes, si los recursos están lejos, ir a las defensas, defender: 10-2-9
Cartaginesa, 1 aldeano y edades, si los recursos quedan más cerca, correr lejos, no hay soldados: 0-4-10-Fail
Hitita, hachas sin garrotes, sólo para edad, counter, ataque normal: 0-0-6. Edad en 7-8.
Feinicia, hondas, para edad y si lejos, guardar recursos e ir a defensas, atacar y al ser atacado correr lejos: 1-2-5-Fail.
Cartaginesa, herramienta y exploradores, para edad y si acerca, guardar recursos y correr lejos, 1 ataca y al ser atacado ir hacia las defensas: 3-3-6
Asiria, armadura de infantería y aldeanos y garrotes, sólo para edad, counter con 2, mitad defiende y mitad ataca: 2-4-5-Fail.
Choson, armadura de arquero y arqueros, guardar rec y autodf, 1 defensa y el resto atacar y en caso de counter correr lejos: 2-10-10-Fail.

Hay varios resúmenes así que puede que no entiendan pero en las 1eras filas procuré escribir todo. El problema de este método de pruebas es que yo me hago líos respecto a cómo debo reaccionar o actuar, me olvido, o me desconcentro por ejemplo porque estoy destruyendo edificios que se ponen a crear seguidos, es antinatural forzarme a reaccionar siempre de modos distintos, un lío. Tampoco es tan fácil determinar qué es "lo que sigue", o sea, esto usa varias listas, por ejemplo en depósitos:
No hacer
Sólo si los recursos están lejos
Siempre que los recursos queden más cerca
Sólo para avanzar de edad
To evolve and if far
To ev and if fast
...los últimos 2 son resúmenes de cosas ya nombradas. Eso se repite, luego de probar uno pruebo otro, pero tengo que andar viendo la tabla a ver cual corresponde en cada nueva fila, y encima hay casos en que debo postergar algunas cosas porque son evidentemente inconvenientes (por ejemplo si se requiere avanzar de edad entonces debe ir alguno que diga "para avanzar de edad" o "if fast"). Eso lo tengo que hacer para la mayoría de las columnas también... Y sería mejor asegurarme de no estar repitiendo combinaciones, cosa que no me fijé.
¿Y si veo una nueva posibilidad? Pues reinicio desde que corresponda, lo hice varias veces.

Lo último que hice fue esto:
Depósitos only to ev, civiles ignorar ataques, soldados defender:
Choson, aldeanos: 0-1-27 (aldeanos 20 max)
Asira, garrotes: 10-6-13
Egipcia, hachas: 0-0-3-No ev
Babilonia, hondas: 4-1-11
Cartaginesa, arqueros: 2-1-6
Persa, exploradores: 0-0-3-No ev
Roma, torres: 0-0-3 (a penas la empecé los aldeanos la atacaron. La terminé y reparaba pero la rompieron).
Palmerena, murallas: 0-10-3
Macedonia, herramienta y garrotes: 2-1-4. No cuartel (cuando lo empecé un barco lo vió y plaf)
Yamato, inf df y hachas: 0-2-3-No upgrades (vencido antes).
Cartaginesa, arq df y arqueros: 0-1-5-No ev
Hitita, horses df y exploradores: 0-1-3-No ev
Macedonia, trabajo con madera y torres: 1-3-4-No ev
Choson, trabajo con piedra y hondas: 0-0-4

Hay veces que el enemigo se apodera de todas las ruinas o artefactos y me ataca mucho menos. Eso hace una gran diferencia en cuanto a los resultados a corto plazo.

Eso puede seguir hasta el infinito quizá porque se pueden mezclar cosas y variar el orden. Lo que se mantendrían son las reacciones. Pero llegado este punto quiero variar las reacciones. El problema es que cada reacción la estaba haciendo en distintas hojas y como son infinitas no me van a dar los renglones, pero bueno, lo paso a Excel. Ah, sí, también me di cuenta que debería probar hacer ciertos edificios, aunque aparentemente sea inútil, pero en la edad de piedra pueden servir como murallas (que en esa edad no hay), puede ser crucial porque en la partida que usé murallas ya tenía edificios enemigos casi pegados a mi centro urbano).

El juego es programable (busquen age of empires ai per), así que para acelear las pruebas quizá debería... pero sólo en modo "crear escenario" (sino hay que modificar los archivos "Inmortal" por lo que leí), del cual no me gusta que las civilizaciones y tipo de mapa no sea al azar, tendría que modificarlo manualmente o usar siempre las mismas... Igual véase que el random del juego no es muy bueno, pues la civilización cartaginesa por ejemplo me tocó muchas veces pero la sumeria ninguna.

Con todo el lío también pensé en hacer deducciones, basar la siguiente prueba en las anteriores en vez de cumplir con una lista o "variación absoluta" (aunque en principio está bien). Por ejemplo lo mejor ha sido:
Asira, garrotes: 10-6-13
Palmerena, murallas: 0-10-3
Y podría considerar que el hecho de tener muchas bajas propias es algo valioso:
Choson, aldeanos: 0-1-27
...pero no tiene mucha lógica que digamos (en un estilo RPG sí, poder soportar más golpes es mejor, pero siempre y cuando eso sirva para algo, que acá por los datos no puede deducirse que lo sea). ¿Ahora qué? ¿por qué he de suponer que mezclar garrotes con murallas mejorará el resultado? De hecho puede que no, porque si el cuartel está fuera de las murallas no es reparable, y si está dentro no pueden golpear a los arqueros, etc. Con lo demás surge la misma pregunta: ¿Por qué yo he de suponer que aldeanos y garrotes funcionará mejor que sólo garrotes? Los garroteros tienen más puntos de vida que los aldeanos, por lo que si alguien tiene que atacar a otro los 1eros son más indicados, pero eso no puede saberse simplemente por los datos que estoy anotando, eso se deduce en base a otros datos que yo quiero poner en duda, y por lo tanto por ahora no tengo motivo para pensar que combinados con aldeanos el resultado sería mejor, pues según las pruebas el crear muchos aldeanos no ha servido de mucho. Probar cosas no es difícil, pero hacerlo de modo eficiente sí, no entiendo cómo.


Otro día tal vez:
- Ajedrez
- Super Robot Taisen Original Generation GBA
- Pokemon Emerald GBA
- Romancing Saga SNES
- Final Fantasy Tactics (Playstation y GBA, son distintos)
- Diablo 2

Por cierto, si Felino quiere le juego una partida de Ajedréz. A ver qué tal. Él con las fichas abajo así no pone excusas como hizo Leviatam.

De Legend of Mana de Play ya hablé bastante y pfffff, abarqué muy poco. Es un lío ese juego. El sistema de modificación de armas...

Hay muchos más, como los Fire Emblem, debería hacer un blog con todos las pruebas. Sip, sip.

_________________
Si no puedes hacerlo, intenta primero hacer algo más simple aunque similar.


Arriba
 Perfil  
Responder citando  
NotaPublicado: 07 Mar 2019, 15:58 
Desconectado
Avatar de Usuario

Registrado: 10 Jun 2011, 21:52
Mensajes: 4608
Puedes hacer investigación sin programación, con matemáticas y teoremas.

_________________
Spoiler: show


Arriba
 Perfil  
Responder citando  
NotaPublicado: 07 Mar 2019, 18:32 
Desconectado
Avatar de Usuario

Registrado: 10 Ago 2011, 20:39
Mensajes: 9372
En lo posible dime cómo. Arigato.

_________________
Si no puedes hacerlo, intenta primero hacer algo más simple aunque similar.


Arriba
 Perfil  
Responder citando  
NotaPublicado: 07 Mar 2019, 18:41 
Desconectado
Avatar de Usuario

Registrado: 10 Jun 2011, 21:52
Mensajes: 4608
Marcus Hutter es muy buen ejemplo, lee sus artículos e intenta hacer algo parecido. Por ejemplo éste: https://arxiv.org/abs/cs/0206022

Tú estabas en esto para resolver problemas,¿no?

_________________
Spoiler: show


Arriba
 Perfil  
Responder citando  
NotaPublicado: 10 Mar 2019, 15:05 
Desconectado
Avatar de Usuario

Registrado: 10 Ago 2011, 20:39
Mensajes: 9372
Sigo con el AoE pero cambié de plan (piensen cómo lo harían uds):
1- Crear una carpeta llamada "Egipcia".

2- En Egipcia crear un archivo de excel y llamarle "Ignore, counter".
El nombre del archivo marca reacciones digamos:
Ignore: En caso de aldeanos atacados, no hacer cambios en sus acciones.
counter: Los soldados se mantienen en la ciudad o con los aldeanos y sólo atacan si es atacada o los aldeanos o ellos.

3- A la 1era hoja llamarle "-" o "." o algo similar.
El nombre de las hojas marca qué se producirá inicialmente (en este caso, nada).

4- Crear esta tabla:
Código:
Tam   Tip   2   3   4   5   6   7   8   Coments   Contin
_______________________________________________Aldeanos
_______________________________________________Casas
_______________________________________________Cuarteles
_______________________________________________Almacenes
_______________________________________________Graneros

En cada fila hay una continuación distinta, que puede estar formada por muchas cosas, sólo puse un ejemplo. Tam y Tip corresponden al tamaño y tipo de mapa en la partida en que sea el 1er o 2ndo en perder. Los números 2~8 corresponden a los oponentes de dicha partida. El 1 no se anota porque es él mismo.

5- En el directorio raíz crear otro archivo excel y llamarle "AI".

6- Crear esta tabla:
Código:
Tam   Tip   1   2   3   4   5   6   7   8   Coments   AI      Per
____________________________________________________Aldeanos
____________________________________________________Cuarteles
____________________________________________________Almacenes
____________________________________________________Graneros

De nuevo la tabla en realidad es más larga, esto es sólo un ejemplo.
Casas me lo saltee porque parece imposible aplicarlo, luego explico.
Como en la tabla anterior se anotaran los datos de la partida en que sea el 1er o 2ndo en perder.
Per por ahora no es necesario. Tiene relación con esto:
http://aoe.heavengames.com/siege/AIandP ... ndex.shtml

7- Crear 6 copias de esa hoja y llamarles como 7 civilizaciones, o abreviaciones.
Griega, Babilonia, Asiria, Minoica, Hitita, Fenicia, Sumeria

8- En Hitita agregar esto:
Arcos C Pa___3 At Agres
En Fenicia:
Arq Ele Hi___Ag sin df
En Sumeria
Arq Asiria___Agresiva
Estas son de relleno por ahora, porque producciones con más de 1 elemento no hice aún para esto.

9- En el generador de mapas asignar a los jugadores 2 a 8, los valores AI y Per de las tablas (es necesario crear los archivos AI y Per, ver más adelante).
Jugador 2: Aldeanos-Aldeanos.
Jugador 3: Cuarteles-Cuarteles.
Etc.
Las civilizaciones vienen como las que yo dije, por eso dije esas.

10- En diplomacia poner que todos sean enemigos entre sí.

11- Guardar la configuración.

12- Generar un mapa aleatorio, minúsculo y de tipo interior.

12.5- Tal vez: Poner una ruina y un artefacto en el centro del mapa.
Lo exploro de a poco, así que tendría gracia. Lo malo es que en cada partida habría que poner esas cosas, es tedioso.

13- Empezar la partida jugando según el modo especificado (por ahora en la tabla 1).

14- Cuando 2 jugadores queden sin posibilidad de ganar (sin ruinas/artefactos/maravillas/torres/población ni posibilidad de aumentarla), terminar la partida.

15- En las tablas correspondientes anotar quienes eran los enemigos de los perdedores.

16- Hacer variaciones en los perdedores y guardar config.
Hacer las variaciones es complicado, más adelante explico.

17- Variar el mapa y repetir desde el paso 11.

-----------------------------------------------------------------------------------------------------------------

Archivos Per.

Complicados.

Al parecer, es imposible hacer que la computadora solamente haga casas, las hace sólo si hace aldeanos o algo que las requiera. Por eso la AI Casas es inaplicable. Quizá sí hay un modo:
Citar:
175 SNSpecificBuildItemToBuild
A specific build item that should be inserted into the computer player's list. Must be a valid build ID.
Me funcionó, pero es sólo 1 casa, no sé si se puede poner más, y la verdad especificarlo en un Per es raro, eso se especifica en los archivos AI.

Otra cosa que me complicó bastante es que si mal no recuerdo, poner esto:
Citar:
174 SNMaximumHousesBeforeDropsites
The maximum number of Houses that can be built before a dropsite is built. Must be >= 0.
Con 0, hace que no construya cuarteles. No sé qué tienen que ver las casas con los cuarteles, pero bue.

Y esto:
Citar:
170 SNMinimumFood
The minimum amount of food a computer player likes to keep on hand. Must be >= 0.
171 SNMinimumWood
The minimum amount of wood a computer player likes to keep on hand. Must be >= 0.
172 SNMinimumStone
The minimum amount of stone a computer player likes to keep on hand. Must be >= 0.
173 SNMinimumGold
The minimum amount of gold a computer player likes to keep on hand. Must be >= 0.
190 SNMaximumFood
The maximum amount of food a computer player likes to have on hand. Must be >= 0.
191 SNMaximumWood
The maximum amount of wood a computer player likes to have on hand. Must be >= 0.
192 SNMaximumStone
The maximum amount of stone a computer player likes to have on hand. Must be >= 0.
193 SNMaximumGold
The maximum amount of gold a computer player likes to have on hand. Must be >= 0.
Yo le ponía todo 0 y 10000 de madera como máximo, esperando que así se dedicara a buscar madera (en el caso de Almacenes), pero haciendo pruebas le daba ya 88888 de madera, lo cual resultaba en que no construía almacenes o sólo 1 (no recuerdo), salvo que quitara la línea del oro máximo por ejemplo. No entendía cual era el fallo, antes de eso probé sacar otro montón de líneas, llegué a eso por descarte. En eso noté que el 2ndo almacén lo hacía al lado del oro. He llegado a una conclusión: Aunque la computadora básicamente puede que se ponga a juntar cualquier cosa, creará depósitos sólo si no juntó el máximo requerido.

Por ahora no investigué todas las líneas, y según dicen muchas siguen siendo un misterio... También dicen que el archivo Pasive está mal. Bueno, yo en base al superagresive y alguna otra cosa que leí por ahí tengo este (para Aldeanos):
Código:
DEFAULT
//
//Construcción
//
73   0   //SNMinimumTownSize
74   10000   //SNMaximumTownSize
86   0   //SNStoragePitMaxDistance
87   0   //SNGranaryMaxDistance
88   0   //SNTacticalUpdateFrequency
99   0   //SNScalingFrequency
101   0   //SNBuildFrequency
112   10000   //SNMinimumWaterBodySizeForDock
114   100   //SNNumberBuildAttemptsBeforeSkip
115   100   //SNMaxSkipsPerAttempt
150   0   //SNMaxStoragePits
151   0   //SNMaxGranaries
152   0   //SNHouseOverage
155   1   //SNBuildPlanDivisions
161   0   //SNRequiredFirstBuilding
168   0   //SNRandomPlacementFactor
169   10000   //SNMinimumForestTiles
177   109   //SNUnskippableItemType
180   0   //SNAutoBuildHouses
181   0   //SNUpgradeToToolAgeASAP
182   0   //SNUpgradeToBronzeAgeASAP
183   0   //SNUpgradeToIronAgeASAP
202   0   //SNMinimumDropsiteBuffer
205   0   //SNAutoBuildDropsites
206   0   //SNAutoBuildFarms
207   0   //SNAutoBuildTowers
208   0   //SNAutoBuildDocks
209   0   //SNAutoBuildFishingBoats
210   0   //SNAutoBuildTransports
212   0   //SNDesiredNumberDocks
213   0   //SNDesiredNumberFishingBoats
214   0   //SNDesiredNumberTransports
220   0   //SNMaxFarms
222   0   //SNMaxTowers
223   0   //SNAutoBuildWarships
224   0   //SNDesiredNumberWarships
//
//Aldeanos
//
0   34   //SNPercentCivilianExplorers
3   1   //SNCapCivilianExplorers
1   34   //SNPercentCivilianBuilders
4   1   //SNCapCivilianBuilders
2   34   //SNPercentCivilianGatherers
5   -1   //SNCapCivilianGatherers
18   1   //SNTotalNumberExplorers (GETTING PHASED OUT)
32   10   //SNPercentExplorationRequired
35   0   //SNMinimumCivilianExplorers
100   0   //SNMaximumGAIAAttackResponse
117   98   //SNFoodGathererPercentage
120   2   //SNWoodGathererPercentage
118   0   //SNGoldGathererPercentage
119   0   //SNStoneGathererPercentage
147   1   //SNMostNeededResourceLookAhead
148   0   //SNRetaskGatherAmount
160   100   //SNMaxBuildPlanGathererPercentage
163   1000   //SNFoodDropsiteDistance
164   100   //SNWoodDropsiteDistance
165   0   //SNStoneDropsiteDistance
166   0   //SNGoldDropsiteDistance
170   99999   //SNMinimumFood
190   99999   //SNMaximumFood
171   2000   //SNMinimumWood
191   2000   //SNMaximumWood
172   0   //SNMinimumStone
192   0   //SNMaximumStone
173   0   //SNMinimumGold
193   0   //SNMaximumGold
204   4   //SNMinimumElephantHuntGroupSize
216   0   //SNMinimumAmountForTrading
//
//Grupos
//
37    0     //SNAttackGroupMakeup (UNUSED AT THIS POINT)
39    0     //SNDefendGroupMakeup (UNUSED AT THIS POINT)
40    0     //SNGroupFillMethod
45    0     //SNExploreGroupMakeup (UNUSED AT THIS POINT)
//
//
23    10    //SNArtifactReturnDistance (UNUSED AT THIS POINT)
24    75    //SNPercentVictoryClamp (UNUSED AT THIS POINT)
29    85    //SNMinimumPeaceLikeLevel (UNUSED AT THIS POINT)
32    85    //SNPercentExplorationRequired (TEMPORARILY UNUSED FOR SOLDIERS)
34    50    //SNZeroPriorityDistance
75    2     //SNGroupCommanderSelectionMethod
76    15    //SNConsecutiveIdleUnitLimit
//
36    4     //SNNumberAttackGroups
16    4     //SNMinimumAttackGroupSize
26    7     //SNMaximumAttackGroupSize
41    3     //SNAttackGroupGatherSpacing
30    99    //SNPercentHealthRetreat
31    99    //SNPercentDeathRetreat
91    99    //SNPercentUnitHealthRetreat
//
38    0     //SNNumberDefendGroups
25    0     //SNMinimumDefendGroupSize
28    0     //SNMaximumDefendGroupSize
50    0     //SNGoldDefendPriority
51    0     //SNStoneDefendPriority
52    0     //SNForageDefendPriority
53    0     //SNChokePointDefendPriority (UNUSED AT THIS POINT)
54    0     //SNRuinsDefendPriority
55    0     //SNArtifactDefendPriority
56    0     //SNTownDefendPriority
57    2     //SNDefenseDistance
22    12    //SNSentryDistance
72    2     //SNSentryDistanceVariation
92    10    //SNDefendOverlapDistance
//
42    0     //SNNumberExploreGroups
43    2     //SNMinimumExploreGroupSize
44    3     //SNMaximumExploreGroupSize
//
46    0     //SNAttackSeparationTime
47    2     //SNAttackCoordination
19    99    //SNPercentEnemySightedResponse
20    50    //SNEnemySightedResponseDistance
48    30    //SNAttackResponseSeparationTime
49    0     //SNRetreatAfterTargetDestroyed
71    1     //SNLockAttackAndAttackResponse
//
58    2     //SNNumberBoatAttackGroups
59    1     //SNMinimumBoatAttackGroupSize
60    5     //SNMaximumBoatAttackGroupSize
//
67    0     //SNNumberBoatDefendGroups
68    0     //SNMinimumBoatDefendGroupSize
69    0     //SNMaximumBoatDefendGroupSize
70    0     //SNDockDefendPriority
//
61    1     //SNNumberBoatExploreGroups
62    1     //SNMinimumBoatExploreGroupSize
63    1     //SNMaximumBoatExploreGroupSize
//
64    0     //SNDesiredNumberTradeEscorts
65    0     //SNDesiredNumberFishEscorts
66    0     //SNDesiredNumberTransportEscorts
//
84    1     //SNNumberWallGates
85    4     //SNSizeWallGates
//
77    5     //SNTargetEvaluationDistance
78    1     //SNTargetEvaluationHitpoints
79    1     //SNTargetEvaluationDamageCapability
80    0     //SNTargetEvaluationKills
81    0     //SNTargetEvaluationAllyProximity
82    0     //SNTargetEvaluationROF
83    0     //SNTargetEvaluationRandomness
89    0     //SNTargetEvaluationAttackAttempts
90    0     //SNTargetEvaluationRange
//
//
END
Sólo hace aldeanos, es correcto. Es decir, generalmente una per admite hacer casas y depósitos, pero esta no.

El de Cuarteles (sólo diferencias):
Código:
177   12   //SNUnskippableItemType
117   0   //SNFoodGathererPercentage
120   100   //SNWoodGathererPercentage
163   1   //SNFoodDropsiteDistance
164   1000   //SNWoodDropsiteDistance
165   1   //SNStoneDropsiteDistance
166   1   //SNGoldDropsiteDistance
170   0   //SNMinimumFood
190   0   //SNMaximumFood
171   99999   //SNMinimumWood
191   99999   //SNMaximumWood
Lo de Dropsite no entiendo qué hace, lo cambié para ver.
Citar:
163 SNFoodDropsiteDistance
The maximum number of tiles the computer player likes to walk to drop off its food. Must be >= 3.
Supuestamente el mínimo es 3, pero en fin... Tampoco es que haya analizado eso a fondo.

Basicamente el otro junta comida y un poquito de madera, mientras que este sólo madera.

Almacenes:
Código:
86   10000   //SNStoragePitMaxDistance
150   1000   //SNMaxStoragePits
161   2   //SNRequiredFirstBuilding
169   0   //SNMinimumForestTiles
177   103   //SNUnskippableItemType
205   1   //SNAutoBuildDropsites
117   0   //SNFoodGathererPercentage
120   100   //SNWoodGathererPercentage
163   3   //SNFoodDropsiteDistance
164   3   //SNWoodDropsiteDistance
165   3   //SNStoneDropsiteDistance
166   3   //SNGoldDropsiteDistance
170   0   //SNMinimumFood
190   0   //SNMaximumFood
171   99999   //SNMinimumWood
191   99999   //SNMaximumWood
Los cambios necesarios para que haga almacenes.

Graneros es muy similar.

Hay varias líneas que no entiendo, las comentaré en otra ocasión. Otras aún no las toqué.

-----------------------------------------------------------------------------------------------------------------

Variaciones a los jugadores.

Complicado también. Tengo algunas ideas pero las voy a pulir un poco. Basicamente voy a crear un par de hojas en cada archivo, en las cuales iré contando qué probé, asignando puntajes en unos casos (civilizaciones, AIs y pers en ciertos casos) y una menor cantidad en otros (por ejemplo, si un elemento se usó como continuación de algo (no "-") entonces cuenta como 1.5, o 1.33 si es la 3era, etc. Otra forma podría ser -1 o 2, 3, etc, y usaría siempre el que tenga más valor, exceptuando los que no se hayan usado. Habría más repeticiones pero no me tengo que complicar con los decimales.


La "programación" que estoy usando no es para hallar la solución, sólo estoy modificando el comportamiento de los enemigos en el juego lo cual cuenta como si yo jugara 8 veces en 1, más o menos.

_________________
Si no puedes hacerlo, intenta primero hacer algo más simple aunque similar.


Arriba
 Perfil  
Responder citando  
NotaPublicado: 13 Mar 2019, 23:50 
Desconectado
Avatar de Usuario

Registrado: 10 Ago 2011, 20:39
Mensajes: 9372
Antes de ver tu link, que sinceramente dudo que tenga que ver con el tema, comento las cosas que hice.

-----------------------------------------------------------------------------------------------------------------

El método que describí no me sirvió porque se complicaba ponerle un nombre-resúmen a las combinaciones que yo usaba. Los de la IA eran por ejemplo:
Código:
Fe1   C Urbano
Fe2   Aldeanos
Fe3   Cuarteles
Fe4   Almacenes
Fe5   Graneros
Fe6   C Urbano y Aldeanos
Fe7   C Urbano y Cuarteles
Fe8   C Urbano y Almacenes
Fe9   C Urbano y Graneros
Fe10   Aldeanos y C Urbano
Fe11   Aldeanos y Cuarteles
Fe12   Aldeanos y Casas
Fe13   Aldeanos y Almacenes
Fe14   Aldeanos y Graneros
Fe15   Cuarteles y C Urbano
Fe16   Cuarteles y Aldeanos
Fe17   Cuarteles y Garrotes
Fe18   Cuarteles y Almacenes
Etc
Esas usaban la civilización fenicia (fue una lista de ejemplo, no es que sólo haya probado esa civilización) y producían lo que está luego del número.
Eg1 sería egipcia C Urbano, todas las combinaciones que quería eran nombrables así, con un par de letras y un número.
Pero las combinaciones que yo usaba manualmente incluían reacciones, por lo que Eg1 sería egipcia y centro urbano pero no se sabría si es con aldeanos ignorando ataques o devolviéndolos, etc. Para saber los nombres tenía que hacer las listas, probablemente en el caso que digo no me di cuenta, y además el tema de la variación seguía siendo un problema.

-----------------------------------------------------------------------------------------------------------------

Simplifiqué las anotaciones, así:
Código:
Min   Int      

Civ   Ald   Sold   Proceso/Per
Eg   Ignore   Count   C Urbano
Gr         C Urbano
Ba         Aldeanos
As         Cuarteles
Mi         Almacenes
Hi         Graneros
Fe         Aldeanos y Casas
Su         1Cuarteles y Garrotes
Eso es una hoja de Excel. Lo de arriba es el mapa, luego en cada fila una combinación distinta. La 1era implica reacciones que ya expliqué, de cuando la uso yo (Ald: Qué deben hacer los aldeanos cuando son atacados. Sold: Qué deben hacer los soldados. Count: Counter, me refiero a atacar sólo en caso de ser atacado). En la última, el 1 significa que sólo se hace 1 de lo que está al lado. Sino, infinitos, intercalando (ej: Un cuartel, un soldado, un cuartel... El de casas no funciona así porque no he podido controlarlo, ya expliqué eso).
En otra hoja, lo mismo pero con otro mapa y cambiando a los que hayan tenido peor resultado:
Código:
Peq   Mont      

Civ   Ald   Sold   Proceso/Per
Eg   Ignore   Count   C Urbano
Gr         C Urbano
Ba         Aldeanos
Pe         GRANEROS y 1ALDEANOS
Sh         2ALDEANOS Y ALMACENES
Hi         Graneros
Fe         Aldeanos y Casas
Su         1Cuarteles y Garrotes
Y así sucesivamente (otras hojas, aunque no hice mucho más). Luego hay otro par de hojas distintas:
Código:
                        Uses   Loses   
Eg      Ignore      Count         C Urbano   1   1   2
Si en este foro las cosas conservaran las tabulaciones estaría buenísimo, pero meh. Esta es respecto a las combinaciones usadas por mí. Hasta donde dice Counter es sólo la lista de cada combinación que usé y fue derrotadas o eliminadas por bajo rendimiento (son tan patéticas que sólo la última de la IA ataca, y a penas). Luego hay un elemento (C.U), en cuántas combinaciones lo usé, en cuántas perdió, y un número que es la suma de ambos. Basado en eso se elige la siguiente combinación, pero no llegué a aplicarlo del todo y lo entenderán mejor en la siguiente hoja:
Código:
            Uses   Loses         Uses   Loses   
Eg         C Urbano   1   1   2      5   5   I
Gr   1      Aldeanos   1   1   2      1      II
Ba   1      Casas   -2      -2      1      1I
As   1      Cuarteles   2   1   3      1      I1
Mi   1      Almacenes   2   1   3      1      2I
Hi   1      Graneros   -1   1   0      1      I2
Fe   1      Garrotes   -2      -2            III
Su   1               0            
Pe   1                  
Sh   1                           
Ya                              
Ch
Es de la IA. En la 1er columna están las civilizaciones, y en la 2nda cuánto las usó. Más a la derecha están los elementos, en cuantas combinaciones las usó, cuántas perdió, y la suma de eso. Ah, pero:
Si en la combinación fue lo 1ero en usarse, cuenta como 1. Sino, cuenta como -X, siendo X el momento en que lo haya usado (2ndo=2, 3ero=3, etc).
Más a la derecha están las estructuras usadas, derrotas, y luego la forma de la estructura (la puse en la última columna porque llegaría un punto en que ocuparía mucho espacio).

¡Esas tablas son para obtener la siguiente combinación! La 1era la que usaré yo, la 2nda de las IA.

¿Cómo?
La 1era no la hice del todo.
La 2nda:

Nueva civilización:
Simplemente elegir la que tenga el valor más bajo partiendo desde la última usada (por eso Egipcia aún no se usó).

Estructura:
Empecé probando 5 veces la misma estructura, sólo varié los elementos. Por simplicidad, porque consideraba 5 (Casas no cuenta porque es incontrolable, y Garrotes tampoco porque requiere Cuarteles). Luego usé 5 estructuras diferentes pero iguales en que tienen 2 tipos de elementos cada una. I abrevia 1 elemento usado infinitamente. En fin, no hay mucho misterio, luego 5 diferentes estructuras de 3 tipos de elementos cada una, luego 5 de 4, etc. Aunque algún problema puede que haya tenido, y no tiene mucho sentido que se pruebe tantas veces I y 1, por qué no 25 por ejemplo.

Elementos:
Es complicado. Primero se piensa cómo usar la mayor cantidad de cosas que no hayan sido usadas. Tal como están las cosas (no sé si bien, hace bastante que no toco eso y lo pude haber dejado por la mitad luego de verle errores), lo único es "Avanzar de edad", que requiere 2 edificios distintos (son las reglas del juego). Ahora se elegiría lo que tenga menor número (uses+loses) pero que sea =>0. Granero. Luego tiene que ser Cuarteles o Granero porque "Evo" así lo requiere.
O sea... la idea es elegir siempre lo nuevo o sino algo en base a la cantidad de usos, en qué posición se usó (1ero, 2ndo, etc) y cuántas veces se ha perdido con eso.

¿Es útil? ¿funciona?
Eh... ayuda a lograr usar cosas diferentes y con menos derrotas y usadas más tardidamente, pero hay un par de problemas...
1- En principio, lo que tiene valores negativos tardará en volver a usarse. Llegará un punto en que todo tendrá valores negativos, por ejemplo cuando un elemento haya sido usado en la posición nro 10 tendrá un -10. El tema es que inicialmente las estructuras son cortas por lo que como mínimo sólo podían tener -2. Además hay elementos que sí o sí tienen que ser usados en 2ndo lugar, otros peor aún pues ni siquiera pueden usarse en estructuras o procesos tan cortos.
2- Creo que este método hace imposible que ocurran procesos como Aldeano-Cuartel-Soldado-Aldeano-Cuartel-Soldado, etc, es decir, de mucha repetición, porque siempre que se elige un elemento...

No, wait, me equivoqué en algo.

Si siempre se eligieran 1ero los elementos que tengan valor =>0 habría uno que se elegiría siempre... creo. Y los que tengan más loses se elegirían más y los otros no tanto o no, no está bien.
Y si siempre se eligieran 1ero los que tengan menor valor... está bien. Lo que pasa es que como hay cosas que no se pueden elegir 1ero tuve que hacer excepciones.

En fin, es bastante lioso y no me sirve del todo, por eso lo dejé de lado.

-----------------------------------------------------------------------------------------------------------------

Decidí anotar las cosas así:
Código:
Min   Int      

Eg   Gr   Ba   As
B109, 1   B109, 1   cU83, 50   B12, 2
Ignore         U73, 50
Counter
Seguro las tabulaciones quedan mal, no pienso arreglarlo, simplemente es que en cada columna están los diferentes combinaciones participantes, ahora descritos de una forma más acorde a como se dice en los archivos IA. No recuerdo para qué lo hice así, aunque en una hoja tengo:
Código:
   Loses   1   2   3
B109, 1      1      
cU83, 50      1      
B12, 2      1      
B103, 4         1   
B69, 3            1
Lo cual puede significar que me disponía a variar más el número de repeticiones de los elementos en las estructuras (antes había muchos Inf y 1).

Tampoco recuerdo qué vi mal en eso...

-----------------------------------------------------------------------------------------------------------------

Se me ocurrió una forma de variar las cosas, empezando así:
Código:
Civ   B109   U83   B12   B103   B69
Eg   1   17   33   49   65
Gr      2         
Ba         3      
As            4   
Mi               5
Hi   6            
Fe      7         
Su         8      
Pe            9   
Sh               10
Ya   11            
Ch      12         
Ro         13      
Ca            14   
Pa               15
Ma   16
En la 1er columna están las civilizaciones. En la 1er fila desde la 2nda columna, los elementos. Son las "cabezas" de la tabla. En los cruces entre esas filas-civilizaciones y columnas-elementos hay unos números que marcan en qué momento se probará esa combinación. El resultado es este:
Código:
Eg   B109
Gr   U83
Ba   B12
As   B103
Mi   B69
Hi   B109
Fe   U83
Su   B12
Pe   B103
Sh   B69
Ya   B109
Ch   U83
Ro   B12
Ca   B103
Pa   B69
Ma   B109
Eg   U83
Gr   B12
Ba   B103
As   B69
Mi   B109
Hi   U83
Fe   B12
Su   B103
Pe   B69
Sh   B109
Ya   U83
Ch   B12
Ro   B103
Ca   B69
Pa   B109
Ma   U83
Eg   B12
Gr   B103
Ba   B69
As   B109
Mi   U83
Hi   B12
Fe   B103
Su   B69
Pe   B109
Sh   U83
Ya   B12
Ch   B103
Ro   B69
Ca   B109
Pa   U83
Ma   B12
Eg   B103
Gr   B69
Ba   B109
As   U83
Mi   B12
Hi   B103
Fe   B69
Su   B109
Pe   U83
Sh   B12
Ya   B103
Ch   B69
Ro   B109
Ca   U83
Pa   B12
Ma   B103
Eg   B69
Gr   B109
Ba   U83
As   B12
Mi   B103
Hi   B69
Fe   B109
Su   U83
Pe   B12
Sh   B103
Ya   B69
Ch   B109
Ro   U83
Ca   B12
Pa   B103
Ma   B69
Surge de copiar y pegar las civilizaciones 5 veces (son 5 elementos) y al lado hacer lo mismo con los elementos unas 16 veces (son 16 civiliz). ¡Pero que haya sido tan simple fue casualidad! Ya van a ver que puede ser complicado formar esa listita.

Bueno, combiné 2 elementos, pero se requiere más cosas. A por los 3:
Spoiler: show
Imagen

Ahora en la fila de la cabeza está marcado la cantidad de veces que se producirá el elemento. La lista la hice pero es larga como para andarla poniendo, sólo quería comentar que fue mucho más difícil hacerla. Porque antes dio la casualidad de que... los números de más abajo se ponían justo en la columna anterior a la que se tendrían que poner arriba. El nro 16, bien abajo, está en la columna 1. El nro 17 va en la 2. Dicho de otro modo, si el número de más abajo es puesto en la misma columna en que se puso el 1ero, no hay problema, sino al hacer la lista hay que ir eliminando cosas. Pongo un ejemplo sencillo:
__1__2
A_1
B____2
C_3
En este caso para generar la lista hacen copian 2 veces la columna:
A
B
C
A
B
C
...y 3 veces las filas (convirtiéndola en columnas)
A1
B2
C1
A2
B1
C2
Pero qué pasa si la tabla fuese:
__1__2__3
A_1
B____2
C_______3
A1
B2
C3
A1
B2
C3
A1
B2
C3
No sirve. Puede parecer todo muy obvio pero cuando la lista es muy larga (4000 celdas) y no tienes ni puñetera idea toma su tiempo entender por qué la lista no queda bien como en el 1er caso. La solución es ir salteando elementos:
A1
B2
C3
A2 <- saltear el 1
B3
C1
A3 <- saltear el 2
B1
C2

¿Y todo esto para qué sirve?
Además de servir para hacer campeonatos de modo que todos jueguen contra todos a la misma velocidad (luego explico esto, no sé decirlo mejor), sirve para obtener listas en que las cosas varíen lo más posible.

Una vez me pasó que ibamos a hacer un campeonato de ping pong, digamos que eramos 7, intentamos hacer las fechas:
A vs B
C vs D
E vs F
G libre
...
A vs C
B vs D <- Probable error.
E vs G
F libre
...
A vs D
B vs C <- Idem.
F vs G
E libre
...
¿Y luego? En fin, con el método que dije no sólo uno se ahorra tener que pensar cómo sigue, sino que además se ahorra del posible problema de que llega un punto en el que si se hicieron mal las cosas no hay forma de que todos jueguen contra alguien que no hayan jugado.

En cuanto a mi problema en concreto, me sirve para hacer una lista más interesante que esta:
Eg B109 1
Eg B109 2
Eg B109 3
...
Eg B109 50

Con mi método veo rápidamente qué elegir para que varíe todo, en vez de tener que estarlo pensando o usando a cada rato EgB109.

Pero supongo que hay algún problema porque no me sirvió del todo.

Si mal no recuerdo iba a combinar la nueva lista con un 4to factor: Regresos.

En el juego, la IA puede ser programada para por ejemplo hacer 1 soldado y rehacerlo cada vez que él muera, o puede hacer 1 soldado y rehacerlo X veces. El 4to factor es esa X.

No recuerdo por qué no hice la lista, posiblemente es que iba a ser muy largo todo ¡más de 4000 posibilidades sólo para la 1era línea de código! Imaginad 100 líneas. ¿Cuánto es? ¿400*100 o 400^100? Demasiados copy-paste y saltear elementos para mí. Y demasiadas pruebas a realizar.

-----------------------------------------------------------------------------------------------------------------

No sé bien por qué (me olvido de ciertas cosas >___<), hice un generador de IAs y un generador de Pers.

Lo pongo en otro post porque mi compu está muy lenta, probablemente por todo lo que puse en este.

_________________
Si no puedes hacerlo, intenta primero hacer algo más simple aunque similar.


Arriba
 Perfil  
Responder citando  
NotaPublicado: 14 Mar 2019, 04:31 
Desconectado
Avatar de Usuario

Registrado: 10 Ago 2011, 20:39
Mensajes: 9372
Generador de IAs:
Código:
Escena 1
   actions for fotograma 1
      // WantedLines = 1;
      // Lines = 0;
      // Resp = "";
      // Investigación (requiere C o R):
      I1 = "101\tTool_Age\t\t1\t109";
      I2 = "102\tBronze_Age\t\t1\t109";
      I3 = "103\tIron_Age\t\t1\t109";
      I4 = "63\tAxe\t\t1\t12 ";
      I5 = "46\tTool_Working\t\t1\t103";
      I6 = "40\tLeather_Armor_-_Soldie\t\t1\t103";
      I7 = "41\tLeather_Armor_-_Archer\t\t1\t103";
      I8 = "42\tLeather_Armor_Mounted\t\t1\t103";
      I9 = "11\tStone_Wall\t\t1\t68 ";
      I10 = "16\tWatch_Tower\t\t1\t68 ";
      I11 = "107\tWood_Working \t\t1\t84 ";
      I12 = "108\tGold_Mining\t\t1\t84 ";
      I13 = "109\tStone_Mining \t\t1\t84 ";
      I14 = "81\tDomestication\t\t1\t84 ";
      I15 = "28\tWheel\t\t1\t84 ";
      I16 = "5\tMedium_War_Ship\t\t1\t45 ";
      I17 = "6\tMerchant_Ship\t\t1\t45 ";
      I18 = "4\tFishing_Ship \t\t1\t45 ";
      I19 = "32\tArtisanship\t\t1\t84 ";
      I20 = "21\tMysticism\t\t1\t104";
      I21 = "22\tAstrology\t\t1\t104";
      I22 = "24\tPolytheism \t\t1\t104";
      I23 = "119\tMedicine \t\t1\t104";
      I24 = "43\tScale_Armor_-_Soldiers \t\t1\t103";
      I25 = "44\tScale_Armor_-_Archers\t\t1\t103";
      I26 = "45\tScale_Armor_-_Cavalry\t\t1\t103";
      I27 = "51\tMetal_Working\t\t1\t103";
      I28 = "47\tBronze_Shield\t\t1\t103";
      I29 = "13\tMedium_Wall\t\t1\t68 ";
      I30 = "12\tSentry_Tower \t\t1\t68 ";
      I31 = "64\tShort_Sword\t\t1\t12 ";
      I32 = "65\tBroad_Sword\t\t1\t12 ";
      I33 = "56\tImproved_bow \t\t1\t87 ";
      I34 = "57\tComposit_bow \t\t1\t87 ";
      I35 = "114\tWriting\t\t1\t82 ";
      I36 = "112\tArchitecture \t\t1\t82 ";
      I37 = "121\tLogistics\t\t1\t82";
      I38 = "31\tPlow \t\t1\t84 ";
      I39 = "80\tIrrigation \t\t1\t84 ";
      I40 = "7\tTrireme\t\t1\t45 ";
      I41 = "8\tHeavy_Transport\t\t1\t45 ";
      I42 = "9\tTrireme_with_Catapult\t\t1\t45 ";
      I43 = "19\tMonotheism \t\t1\t104";
      I44 = "20\tFanaticism \t\t1\t104";
      I45 = "18\tAfterlife\t\t1\t104";
      I46 = "23\tJihad\t\t1\t104";
      I47 = "120\tMartyrdom\t\t1\t104";
      I48 = "30\tCoinage\t\t1\t84 ";
      I49 = "110\tCraftmanship \t\t\t1\t84";
      I50 = "111\tSiegecraft \t\t1\t84 ";
      I51 = "106\tBallistics \t\t1\t82 ";
      I52 = "37\tAlchemy\t\t1\t82 ";
      I53 = "35\tEngineering\t\t1\t82 ";
      I54 = "113\tAristocracy\t\t1\t82 ";
      I55 = "15\tGuard_Tower\t\t1\t68 ";
      I56 = "14\tFortifications \t\t1\t68 ";
      I57 = "48\tChain_Mail_-_Soldiers\t\t1\t103";
      I58 = "49\tChain_Mail_-_Archers \t\t1\t103";
      I59 = "50\tChain_Mail_-_Cavalry \t\t1\t103";
      I60 = "52\tMetallurgy \t\t1\t103";
      I61 = "117\tIron_Shield\t\t1\t103";
      I62 = "122\tTower_Shield \t\t1\t103";
      I63 = "54\tHeavy_Catapult \t\t1\t49 ";
      I64 = "66\tLong_Sword \t\t1\t12 ";
      I65 = "126\tScythe_Chariot \t\t1\t101";
      I66 = "71\tHeavy_Cavalry\t\t1\t101";
      I67 = "73\tPhalanx\t\t1\t0";
      I68 = "25\tJuggernaught \t\t1\t45 ";
      I69 = "2\tCatapult_Tower \t\t1\t68 ";
      I70 = "27\tHelepolis\t\t1\t49 ";
      I71 = "36\tMassive_Catapult \t\t1\t49 ";
      I72 = "79\tCenturion\t\t1\t0";
      I73 = "38\tHeavy_Horse_Archer \t\t1\t87 ";
      I74 = "78\tCataphracts\t\t1\t101";
      I75 = "77\tLegion \t\t1\t12 ";
      I76 = "125\tArmored Elephants\t\t1\t101";
      I77 = "34\tNobility \t\t1\t82 ";
      // Edificios (requieren B o A  y Regresos. También la cantidad y el parent):
      E1 = "109\tTown_Center1\t";
      E2 = "70\tHouse\t";
      E3 = "12\tBarracks1\t";
      E4 = "103\tStorage_Pit1\t";
      E5 = "68\tGranary\t";
      E6 = "45\tDock_1\t";
      E7 = "87\tRange1\t";
      E8 = "101\tStable1\t";
      E9 = "84\tMarket1\t";
      E10 = "72\tWall_Small\t";
      E11 = "79\tWatch_Tower\t";
      E12 = "50\tFarm\t";
      E13 = "0\tAcademy\t";
      E14 = "104\tTemple1\t";
      E15 = "49\tSiege_Workshop\t";
      E16 = "82\tGovernment_Center\t";
      E17 = "276\tWonder\t";
      // Unidades (requieren U o T y Regresos):
      U1 = "83\tMan\t";
      U1p2 = "\t109";
      U2 = "73 \tSoldier-Inf\t";
      U2p2 = "\t112";
      U3 = "347\tSoldier-Slinger\t";
      U3p2 = "\t12";
      U4 = "4\tSoldier-Archer1\t";
      U4p2 = "\t87";
      U5 = "299\tSoldier-Scout\t";
      U5p2 = "\t101";
      U6 = "13 \tBoat-Fishing1\t";
      U6p2 = "\t45";
      U7 = "15 \tBoat-Trade1\t";
      U7p2 = "\t45";
      U8 = "19 \tBoat-War1\t\t";
      U8p2 = "\t45";
      U9 = "17 \tBoat-Transport1\t";
      U9p2 = "\t45";
      U10 = "338\tSoldier-Camel\t";
      U10p2 = "\t101";
      U11 = "41 \tSoldier-Chariot2\t";
      U11p2 = "\t87";
      U12 = "125\tPriest\t";
      U12p2 = "\t104";
      U13 = "37 \tSoldier-Cavalry1\t";
      U13p2 = "\t101";
      U14 = "40 \tSoldier-Chariot1\t";
      U14p2 = "\t101";
      U15 = "93 \tSoldier-Phal1\t";
      U15p2 = "\t0";
      U16 = "75 \tSoldier-Inf3\t";
      U16p2 = "\t12";
      U17 = "5\tSoldier-Archer2\t";
      U17p2 = "\t87";
      U18 = "35 \tSoldier-Catapult1\t";
      U18p2 = "\t49";
      U19 = "360\tFire-Galley\t";
      U19p2 = "\t45";
      U20 = "39\tSoldier-Cavalry3_Arc\t";
      U20p2 = "\t87";
      U21 = "250\tBoat-War4\t";
      U21p2 = "\t45";
      U22 = "11 \tSoldier-Balista\t";
      U22p2 = "\t49";
      U23 = "25 Soldier-El_Archer\t";
      U23p2 = "\t87";
      U24 = "46 Soldier-Elephant\t";
      U24p2 = "\t101";
      U25 = "282\tSoldier-Inf6\t";
      U25p2 = "\t12";
      U26 = "277\tJuggernaught\t";
      U26p2 = "\t45";
      U27 = "291\tCenturion\t";
      U27p2 = "\t0";
   actions for fotograma 2
      N = random(3)+1;
      N2 = random(2)+1;
      if (N == 1) {
         // Investigación.
         if (N2 == 1) {
            trace ("C"+eval("I"+(random(76)+1)));
         } else {
            trace ("R"+eval("I"+(random(76)+1)));
         }
         // Resp = Resp+N2+eval("I"+(random(76)+1))+"\t";
      } else if (N == 2) {
         // Edificios.
         if (N2 == 1) {
            // Resp = Resp+"B"+eval("E"+(random(16)+1))+"\r";
            trace ("B"+eval("E"+(random(16)+1))+"\t"+(random(50)+1)+"\t-1");
         } else {
            trace ("A"+eval("E"+(random(16)+1))+"\t"+(random(50)+1)+"\t-1\t"+(random(25)+1));
         }
      } else {
         // Unidades.
         if (N2 == 1) {
            // Resp = Resp+"U"+eval("E"+(random(16)+1))+"\r";
            N2 = random(26)+1;
            trace ("U"+eval("U"+N2)+"\t"+(random(50)+1)+"\t"+eval("U"+N2+"p2"));
            // trace ("B"+eval("E"+(random(16)+1))+"   "+(random(50)+1)+"  -1");
         } else {
            N2 = random(26)+1;
            trace ("T"+eval("U"+N2)+"\t"+(random(50)+1)+"\t"+eval("U"+N2+"p2")+"\t"+(random(25)+1));
            // trace ("T"+eval("U"+(random(26)+1)))+"\t"+random(51);
         }
      }
      // trace ("hola\t f");
   actions for fotograma 3
      gotoAndPlay (2);


Utilidad:
Generar rivales variados rápidamente.

Ejemplo:
Código:
U5   Soldier-Archer2      26      87
T13    Boat-Fishing1      14      45   24
R42   Leather_Armor_Mounted      1   103
U11    Soldier-Balista      14      49
T15    Boat-Trade1      5      45   5
T13    Boat-Fishing1      48      45   5
B0   Academy      30   -1
R44   Scale_Armor_-_Archers      1   103
U277   Juggernaught      38      45
T93    Soldier-Phal1      24      0   18
La lista se va generando y la detengo cuando quiero.

Las tabulaciones son un lío, y esta vez no es culpa del foro. En pantalla se muestran de un modo pero al pegarlas en un archivo de texto quedan de otra. Al final intenté que cada línea ocupe sólo 1 línea, aunque algunas estén más corridas hacia un lado u otro.

Returning 0 no sé si es admisible, aunque mi generador puede producirlo (en la lista que puse no hay un ejemplo, sería:
Código:
T13    Boat-Fishing1      14      45   0


¿Fuerza de la IA?
Casi nula en los casos que probé :? Aunque también debe tenerse en cuenta las Per, en las cuales he causado algunos líos -_o
No obstante, estos pueden ser los motivos:
1- Produce las cosas en cualquier orden, en el ejemplo no está TAN mal (digo, podría ser peor) pero puede que la lista fuese 1ero producir al holpita antes que a la academia, con lo cual, si la Per no está programada para saltearse cosas, el proceso quedará detenido o vaya uno a saber.
1.5- Es un caso incluible en el punto anterior aunque especialmente grave: Puede que se fuerce a producir cosas que son inproducibles en ese momento. Por ejemplo si tiene
Código:
C112   Architecture       1   82
pero no tiene un centro gubernamental entonces creo que el proceso quedará detenido, no sé si algo en la Per puede evitarlo.
2- Es demasiado probable que una unidad sea producida varias veces seguidas.
En el momento no me di cuenta de esto, de hecho aún no sé si debe considerarse un error, pero siendo posibles repeticiones así:
Código:
T4   Soldier-Archer1      1      87   20
T4   Soldier-Archer1      1      87   59
U4   Soldier-Archer1      1      87
No tiene sentido que encima pueda ocurrir (como es probable) que la cantidad en cada caso sea alta:
Código:
T4   Soldier-Archer1      56      87   20
T4   Soldier-Archer1      83      87   59
U4   Soldier-Archer1      85      87


Conclusiones:
El defecto 1 y 1.5 me interesa mantenerlo a ver si alguna Per puede arreglarlo. Aunque de esa forma, los rendimientos generalmente serán mediocres. En principio debería intentar que las IAs sean fuertes y tengan los defectos casi al final, no al inicio. Realmente no pensaba usar programación (puede usarse para muchas cosas, la investigación sigue siendo manual, aunque la producción de enemigos o de candidatos a solución no lo sería), y esto de que aparezcan cosas sólo si han aparecido otras no creo que sea complicado pero, si lo fuera... me complicaría.
El supuesto defecto 2 lo corregiré, creo que es fácil, sólo tengo que limitar las cantidades a 1 (no confundir con los returns, eso es otra cosa). Lo ideal sería que si 2 líneas seguidas son iguales quede sólo una con una cantidad de 2, pero eso creo que es más complicado, e innecesario.

Aunque se generan resultados extremadamente variados, el azar no puede superar a una variación metódica, bien hecha, SI YO SUPIERA CÓMO HACERLA, claro.

Me interesa ver si es posible que la IA genere cosas normalmente imposibles, como héroes que están disponibles en el generador de escenarios. Tengo contadas 77 tecnologías, 17 edificios y 27 unidades. Pero los IDs de las cosas llegan a los 200 en algunos casos. ¿Feel like a hacker/cracker/something? Pero es complicado, hallar algo requeriría acertar el ID de la cosa a producir y el ID del edificio donde se produce, si es que existe... En principio será más fácil intentar hallar un edificio oculto, quizá hay alguno del cual es posible producir cualquier cosa, uno para tests.

-----------------------------------------------------------------------------------------------------------------

Generador de Pers:
Código:
trace ("DEFAULT");               
if (random(2) == 1) {               
   trace ("-1   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("0   "+(random(199999)-99999)+"   //SNPercentCivilianExplorers");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("1   "+(random(199999)-99999)+"   //SNPercentCivilianBuilders");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("2   "+(random(199999)-99999)+"   //SNPercentCivilianGatherers");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("3   "+(random(199999)-99999)+"   //SNCapCivilianExplorers");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("4   "+(random(199999)-99999)+"   //SNCapCivilianBuilders");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("5   "+(random(199999)-99999)+"   //SNCapCivilianGatherers");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("6   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("7   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("8   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("9   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("10   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("11   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("12   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("13   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("14   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("15   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("16   "+(random(199999)-99999)+"   //SNMinimumAttackGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("17   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("18   "+(random(199999)-99999)+"   //SNTotalNumberExplorers");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("19   "+(random(199999)-99999)+"   //SNPercentEnemySightedResponse");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("20   "+(random(199999)-99999)+"   //SNEnemySightedResponseDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("21   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("22   "+(random(199999)-99999)+"   //SNSentryDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("23   "+(random(199999)-99999)+"   //SNArtifactReturnDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("24   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("25   "+(random(199999)-99999)+"   //SNMinimumDefendGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("26   "+(random(199999)-99999)+"   //SNMaximumAttackGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("27   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("28   "+(random(199999)-99999)+"   //SNMaximumDefendGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("29   "+(random(199999)-99999)+"   //SNMinimumPeaceLikeLevel");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("30   "+(random(199999)-99999)+"   //SNPercentHealthRetreat");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("31   "+(random(199999)-99999)+"   //SNPercentDeathRetreat");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("32   "+(random(199999)-99999)+"   //SNPercentExplorationRequired");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("33   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("34   "+(random(199999)-99999)+"   //SNZeroPriorityDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("35   "+(random(199999)-99999)+"   //SNMinimumCivilianExplorers");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("36   "+(random(199999)-99999)+"   //SNNumberAttackGroups");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("37   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("38   "+(random(199999)-99999)+"   //SNNumberDefendGroups");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("39   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("40   "+(random(199999)-99999)+"   //SNGroupFillMethod");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("41   "+(random(199999)-99999)+"   //SNAttackGroupGatherSpacing");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("42   "+(random(199999)-99999)+"   //SNNumberExploreGroups");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("43   "+(random(199999)-99999)+"   //SNMinimumExploreGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("44   "+(random(199999)-99999)+"   //SNMaximumExploreGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("45   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("46   "+(random(199999)-99999)+"   //SNAttackSeparationTime");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("47   "+(random(199999)-99999)+"   //SNAttackCoordination");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("48   "+(random(199999)-99999)+"   //SNAttackResponseSeparationTime");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("49   "+(random(199999)-99999)+"   //SNRetreatAfterTargetDestroyed");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("50   "+(random(199999)-99999)+"   //SNGoldDefendPriority");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("51   "+(random(199999)-99999)+"   //SNStoneDefendPriority");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("52   "+(random(199999)-99999)+"   //SNForageDefendPriority");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("53   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("54   "+(random(199999)-99999)+"   //SNRuinsDefendPriority");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("55   "+(random(199999)-99999)+"   //SNArtifactDefendPriority");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("56   "+(random(199999)-99999)+"   //SNTownDefendPriority");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("57   "+(random(199999)-99999)+"   //SNDefenseDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("58   "+(random(199999)-99999)+"   //SNNumberBoatAttackGroups");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("59   "+(random(199999)-99999)+"   //SNMinimumBoatAttackGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("60   "+(random(199999)-99999)+"   //SNMaximumBoatAttackGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("61   "+(random(199999)-99999)+"   //SNNumberBoatExploreGroups");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("62   "+(random(199999)-99999)+"   //SNMinimumBoatExploreGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("63   "+(random(199999)-99999)+"   //SNMaximumBoatExploreGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("64   "+(random(199999)-99999)+"   //SNDesiredNumberTradeEscorts");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("65   "+(random(199999)-99999)+"   //SNDesiredNumberFishEscorts");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("66   "+(random(199999)-99999)+"   //SNDesiredNumberTransportEscorts");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("67   "+(random(199999)-99999)+"   //SNNumberBoatDefendGroups");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("68   "+(random(199999)-99999)+"   //SNMinimumBoatDefendGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("69   "+(random(199999)-99999)+"   //SNMaximumBoatDefendGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("70   "+(random(199999)-99999)+"   //SNDockDefendPriority");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("71   "+(random(199999)-99999)+"   //SNLockAttackAndAttackResponse ");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("72   "+(random(199999)-99999)+"   //SNSentryDistanceVariation");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("73   "+(random(199999)-99999)+"   //SNMinimumTownSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("74   "+(random(199999)-99999)+"   //SNMaximumTownSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("75   "+(random(199999)-99999)+"   //SNGroupCommanderSelectionMethod");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("76   "+(random(199999)-99999)+"   //SNConsecutiveIdleUnitLimit");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("77   "+(random(199999)-99999)+"   //SNTargetEvaluationDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("78   "+(random(199999)-99999)+"   //SNTargetEvaluationHitpoints");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("79   "+(random(199999)-99999)+"   //SNTargetEvaluationDamageCapability");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("80   "+(random(199999)-99999)+"   //SNTargetEvaluationKills");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("81   "+(random(199999)-99999)+"   //SNTargetEvaluationAllyProximity");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("82   "+(random(199999)-99999)+"   //SNTargetEvaluationROF");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("83   "+(random(199999)-99999)+"   //SNTargetEvaluationRandomness");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("84   "+(random(199999)-99999)+"   //SNNumberWallGates");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("85   "+(random(199999)-99999)+"   //SNSizeWallGates");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("86   "+(random(199999)-99999)+"   //SNStoragePitMaxDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("87   "+(random(199999)-99999)+"   //SNGranaryMaxDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("88   "+(random(199999)-99999)+"   //SNTacticalUpdateFrequency");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("89   "+(random(199999)-99999)+"   //SNTargetEvaluationAttackAttempts");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("90   "+(random(199999)-99999)+"   //SNTargetEvaluationRange");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("91   "+(random(199999)-99999)+"   //SNPercentUnitHealthRetreat");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("92   "+(random(199999)-99999)+"   //SNDefendOverlapDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("93   "+(random(199999)-99999)+"   //SNScaleMinimumAttackGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("94   "+(random(199999)-99999)+"   //SNScaleMaximumAttackGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("95   "+(random(199999)-99999)+"   //SNScalePercentHealthRetreat");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("96   "+(random(199999)-99999)+"   //SNScalePercentDeathRetreat");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("97   "+(random(199999)-99999)+"   //SNScalePercentUnitHealthRetreat");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("98   "+(random(199999)-99999)+"   //SNAttackGroupSizeRandomness");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("99   "+(random(199999)-99999)+"   //SNScalingFrequency");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("100   "+(random(199999)-99999)+"   //SNMaximumGAIAAttackResponse");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("101   "+(random(199999)-99999)+"   //SNBuildFrequency");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("102   "+(random(199999)-99999)+"   //SNAttackSeparationTimeRandomness ");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("103   "+(random(199999)-99999)+"   //SNAttackIntelligence ");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("104   "+(random(199999)-99999)+"   //SNInitialAttackDelay");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("105   "+(random(199999)-99999)+"   //SNSaveScenarioInformation");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("106   "+(random(199999)-99999)+"   //SNSpecialAttackType1");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("107   "+(random(199999)-99999)+"   //SNSpecialAttackType2");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("108   "+(random(199999)-99999)+"   //SNSpecialAttackType3");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("109   "+(random(199999)-99999)+"   //SNSpecialAttackInfluence1");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("110   "+(random(199999)-99999)+"   //SNSpecialAttackInfluence2");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("111   "+(random(199999)-99999)+"   //SNSpecialAttackInfluence3");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("112   "+(random(199999)-99999)+"   //SNMinimumWaterBodySizeForDock ");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("113   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("114   "+(random(199999)-99999)+"   //SNNumberBuildAttemptsBeforeSkip ");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("115   "+(random(199999)-99999)+"   //SNMaxSkipsPerAttempt ");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("116   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("117   "+(random(199999)-99999)+"   //SNFoodGathererPercentage ");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("118   "+(random(199999)-99999)+"   //SNGoldGathererPercentage ");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("119   "+(random(199999)-99999)+"   //SNStoneGathererPercentage ");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("120   "+(random(199999)-99999)+"   //SNWoodGathererPercentage ");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("121   "+(random(199999)-99999)+"   //SNDefendImportantGroupLeaders ");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("122   "+(random(199999)-99999)+"   //SNTargetEvaluationContinent ");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("123   "+(random(199999)-99999)+"   //SNTargetEvaluationSiegeWeapon");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("124   "+(random(199999)-99999)+"   //SNTributeAmount");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("125   "+(random(199999)-99999)+"   //SNTributeChatFrequency");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("126   "+(random(199999)-99999)+"   //SNTributeChatRandomness");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("127   "+(random(199999)-99999)+"   //SNTributeTimeout");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("128   "+(random(199999)-99999)+"   //SNTributePlayer");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("129   "+(random(199999)-99999)+"   //SNTributeSuccessOutcome");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("130   "+(random(199999)-99999)+"   //SNTributeFailureOutcome");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("131   "+(random(199999)-99999)+"   //SNGroupLeaderDefenseDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("132   "+(random(199999)-99999)+"   //SNTributePersistence");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("133   "+(random(199999)-99999)+"   //SNTributeRevokeOnAttack");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("134   "+(random(199999)-99999)+"   //SNInitialAttackDelayType");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("135   "+(random(199999)-99999)+"   //SNBlotExplorationMap");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("136   "+(random(199999)-99999)+"   //SNBlotSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("137   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("138   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("139   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("140   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("141   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("142   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("143   "+(random(199999)-99999)+"   //SNTaskUngroupedSoldiers");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("144   "+(random(199999)-99999)+"   //SNTargetEvaluationBoat");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("145   "+(random(199999)-99999)+"   //SNNumberEnemyObjectsRequired");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("144   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("147   "+(random(199999)-99999)+"   //SNMostNeededResourceLookAhead");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("148   "+(random(199999)-99999)+"   //SNRetaskGatherAmount");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("149   "+(random(199999)-99999)+"   //SNMaxRetaskGatherAmount");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("150   "+(random(199999)-99999)+"   //SNMaxStoragePits");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("151   "+(random(199999)-99999)+"   //SNMaxGranaries");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("152   "+(random(199999)-99999)+"   //SNHouseOverage");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("153   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("154   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("155   "+(random(199999)-99999)+"   //SNBuildPlanDivisions");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("156   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("157   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("158   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("159   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("160   "+(random(199999)-99999)+"   //SNMaxBuildPlanGathererPercentage");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("161   "+(random(199999)-99999)+"   //SNRequiredFirstBuilding");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("162   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("163   "+(random(199999)-99999)+"   //SNFoodDropsiteDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("164   "+(random(199999)-99999)+"   //SNWoodDropsiteDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("165   "+(random(199999)-99999)+"   //SNStoneDropsiteDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("166   "+(random(199999)-99999)+"   //SNGoldDropsiteDistance");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("167   "+(random(199999)-99999)+"   //SNInitialExplorationRequired");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("168   "+(random(199999)-99999)+"   //SNRandomPlacementFactor");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("169   "+(random(199999)-99999)+"   //SNMinimumForestTiles");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("170   "+(random(199999)-99999)+"   //SNMinimumFood");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("171   "+(random(199999)-99999)+"   //SNMinimumWood");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("172   "+(random(199999)-99999)+"   //SNMinimumStone");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("173   "+(random(199999)-99999)+"   //SNMinimumGold");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("174   "+(random(199999)-99999)+"   //SNMaximumHousesBeforeDropsites");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("175   "+(random(199999)-99999)+"   //SNSpecificBuildItemToBuild");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("176   "+(random(199999)-99999)+"   //SNSpecificBuildItemTime");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("177   "+(random(199999)-99999)+"   //SNUnskippableItemType");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("178   "+(random(199999)-99999)+"   //SNAttackDiplomacyImpact");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("179   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("180   "+(random(199999)-99999)+"   //SNAutoBuildHouses");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("181   "+(random(199999)-99999)+"   //SNUpgradeToToolAgeASAP");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("182   "+(random(199999)-99999)+"   //SNUpgradeToBronzeAgeASAP");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("183   "+(random(199999)-99999)+"   //SNUpgradeToIronAgeASAP");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("184   "+(random(199999)-99999)+"   //SNTargetEvaluationTimeKillRatio");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("185   "+(random(199999)-99999)+"   //SNTargetEvaluationInProgress");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("186   "+(random(199999)-99999)+"   //SNCoopDemandTributeInterval");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("187   "+(random(199999)-99999)+"   //SNCoopDemandTributeMaximum");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("188   "+(random(199999)-99999)+"   //SNAttackWinningPlayer");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("189   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("190   "+(random(199999)-99999)+"   //SNMaximumFood");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("191   "+(random(199999)-99999)+"   //SNMaximumWood");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("192   "+(random(199999)-99999)+"   //SNMaximumStone");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("193   "+(random(199999)-99999)+"   //SNMaximumGold");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("194   "+(random(199999)-99999)+"   //SNCoopShareInformation");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("195   "+(random(199999)-99999)+"   //SNAttackWinningPlayerFactor");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("196   "+(random(199999)-99999)+"   //SNCoopShareAttacking");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("197   "+(random(199999)-99999)+"   //SNCoopShareAttackingInterval");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("198   "+(random(199999)-99999)+"   //SNPercentageExploreExterminators");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("199   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("200   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("201   "+(random(199999)-99999)+"   //SNTrackPlayerHistory");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("202   "+(random(199999)-99999)+"   //SNMinimumDropsiteBuffer");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("203   "+(random(199999)-99999)+"   //SNUseByTypeMaxGathering");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("204   "+(random(199999)-99999)+"   //SNMinimumElephantHuntGroupSize");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("205   "+(random(199999)-99999)+"   //SNAutoBuildDropsites");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("206   "+(random(199999)-99999)+"   //SNAutoBuildFarms");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("207   "+(random(199999)-99999)+"   //SNAutoBuildTowers");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("208   "+(random(199999)-99999)+"   //SNAutoBuildDocks");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("209   "+(random(199999)-99999)+"   //SNAutoBuildFishingBoats");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("210   "+(random(199999)-99999)+"   //SNAutoBuildTransports");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("211   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("212   "+(random(199999)-99999)+"   //SNDesiredNumberDocks");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("213   "+(random(199999)-99999)+"   //SNDesiredNumberFishingBoats");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("214   "+(random(199999)-99999)+"   //SNDesiredNumberTransports");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("215   "+(random(199999)-99999)+"   //SNAllowDiplomacyChangeOnAllyAttack");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("216   "+(random(199999)-99999)+"   //SNMinimumAmountForTrading");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("217   "+(random(199999)-99999)+"   //SNAllowDiplomacyChangeOnTribute");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("218   "+(random(199999)-99999)+"   //SNEasiestReactionPercentage");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("219   "+(random(199999)-99999)+"   //SNEasierReactionPercentage");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("220   "+(random(199999)-99999)+"   //SNMaxFarms");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("221   "+(random(199999)-99999)+"   //SNHitsBeforeAllianceChange");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("222   "+(random(199999)-99999)+"   //SNMaxTowers");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("223   "+(random(199999)-99999)+"   //SNAutoBuildWarships");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("224   "+(random(199999)-99999)+"   //SNDesiredNumberWarships");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("225   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("226   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("227   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("228   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("229   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
if (random(2) == 1) {               
   trace ("230   "+(random(199999)-99999)+"   //???");      
} else {               
   trace ("//");            
}               
trace ("END");               
stop ();
Corto el mensaje acá porque no me permite postear algo tan largo.

_________________
Si no puedes hacerlo, intenta primero hacer algo más simple aunque similar.


Arriba
 Perfil  
Responder citando  
NotaPublicado: 14 Mar 2019, 04:33 
Desconectado
Avatar de Usuario

Registrado: 10 Ago 2011, 20:39
Mensajes: 9372
Hacer eso fue un laburo CHINO que si no fuese por ciertos artilugios que saqué de la manga hubiese sido... demasiado aburrido como para que yo lo hiciera. Comentaré los artilugios porque me parecen interesantes.

Los archivos AI y los Per, capaz que en Windows 95 o 98 se podían abrir con el bloc de notas, pero por las razones que sea, en mi XP no funciona, para abrirlos les tengo que cambiar la extensión a txt y para volver a usarlos dejarlo como estaban (ctrl+z ayuda =) ). Creo que es en uno de esos archivos donde se menciona leer "Rules.doc", que no he podido hallar. Pero al fin pude reencontrar un archivo en un viejo cd del AoE, que contiene más o menos lo mismo que vi en un link que ya puse. Posiblemente en el link está mejor, pero bue.

La idea del programa es que genere un número, unos espacios, otro número, espacios, y un comentario, y que eso se repita muchas líneas, variando todo eso, tal como son los archivos per y la info que hay respecto a ellos.
El 1er número no se sabe cómo debe ser, se habla de 0 a 200 y pico con varios saltos, pero yo por probar obvié eso, y posibilité el -1.
El 2ndo número se dice que debe ser acorde al 1ero, dependiendo del caso se habla de 0 o 1, de 0 a 7, =>3, =>0, etc, pero de nuevo obvié todo eso por probar, y números "altamente negativos" son posibles, desde -99999 hasta 99999.
El comentario es sólo para tener una idea de supuestamente qué representa cada 1er número. Por lo tanto, debe ser acorde a él.

Bueno, copié el archivo en Excel y ordené por abecedario. Eso hizo que en general 1ero quedaran las líneas que yo precisaba copiar, aunque ya no estaban clasificadas por grupo (ej: números relativos a aldeanos, números relativos a exploradores). Eso quizá es un defecto que podría corregirse, pero por ahora no pienso hacerlo. Usando esto
http://aoe.heavengames.com/siege/AIandP ... ill2.shtml
capáz que no era necesario el artilugio, pero creo que requeriría otro para que el número y el comentario queden en celdas distintas.
En el archivo dice cosas como:
Citar:
CIVILIAN NUMBERS
0 SNPercentCivilianExplorers
Controls the normal, formula-based percentage of civilian explorers allocated. Must be >= 0.
1 SNPercentCivilianBuilders
Controls the normal, formula-based percentage of builders allocated. Must be >= 0.
Yo tenía que separar las líneas que necesitaba de esas descripciones de abajo. Eso hice con mi artilugio, así me quedó la 1era parte:
Código:
93   SNScaleMinimumAttackGroupSize
94   SNScaleMaximumAttackGroupSize
95   SNScalePercentHealthRetreat
96   SNScalePercentDeathRetreat
97   SNScalePercentUnitHealthRetreat
98   SNAttackGroupSizeRandomness
112   SNMinimumWaterBodySizeForDock
114   SNNumberBuildAttemptsBeforeSkip
115   SNMaxSkipsPerAttempt
117   SNFoodGathererPercentage
118   SNGoldGathererPercentage
119   SNStoneGathererPercentage
120   SNWoodGathererPercentage
121   SNDefendImportantGroupLeaders
122   SNTargetEvaluationContinent
131   SNGroupLeaderDefenseDistance Sets the defense distance for defenders of an important attack group leader.  Must be >= 1.
144   SNTargetEvaluationBoat
145   SNNumberEnemyObjectsRequired
147   SNMostNeededResourceLookAhead
148   SNRetaskGatherAmount
149   SNMaxRetaskGatherAmount
150   SNMaxStoragePits
151   SNMaxGranaries
152   SNHouseOverage
155   SNBuildPlanDivisions
160   SNMaxBuildPlanGathererPercentage
161   SNRequiredFirstBuilding
163   SNFoodDropsiteDistance
164   SNWoodDropsiteDistance
165   SNStoneDropsiteDistance
166   SNGoldDropsiteDistance
167   SNInitialExplorationRequired
168   SNRandomPlacementFactor
169   SNMinimumForestTiles
170   SNMinimumFood
171   SNMinimumWood
172   SNMinimumStone
173   SNMinimumGold
174   SNMaximumHousesBeforeDropsites
175   SNSpecificBuildItemToBuild
176   SNSpecificBuildItemTime
177   SNUnskippableItemType
178   SNAttackDiplomacyImpact
180   SNAutoBuildHouses
181   SNUpgradeToToolAgeASAP
182   SNUpgradeToBronzeAgeASAP
183   SNUpgradeToIronAgeASAP
184   SNTargetEvaluationTimeKillRatio
185   SNTargetEvaluationInProgress
186   SNCoopDemandTributeInterval
187   SNCoopDemandTributeMaximum
188   SNAttackWinningPlayer
190   SNMaximumFood
191   SNMaximumWood
192   SNMaximumStone
193   SNMaximumGold
194   SNCoopShareInformation
195   SNAttackWinningPlayerFactor
196   SNCoopShareAttacking
197   SNCoopShareAttackingInterval
198   SNPercentageExploreExterminators
201   SNTrackPlayerHistory
202   SNMinimumDropsiteBuffer
203   SNUseByTypeMaxGathering
204   SNMinimumElephantHuntGroupSize
205   SNAutoBuildDropsites
206   SNAutoBuildFarms
207   SNAutoBuildTowers
208   SNAutoBuildDocks
209   SNAutoBuildFishingBoats
210   SNAutoBuildTransports
212   SNDesiredNumberDocks
213   SNDesiredNumberFishingBoats
214   SNDesiredNumberTransports
215   SNAllowDiplomacyChangeOnAllyAttack
216   SNMinimumAmountForTrading
217   SNAllowDiplomacyChangeOnTribute
218   SNEasiestReactionPercentage
219   SNEasierReactionPercentage
220   SNMaxFarms
221   SNHitsBeforeAllianceChange
222   SNMaxTowers
223   SNAutoBuildWarships
224   SNDesiredNumberWarships
    
    
 35    SNMinimumCivilianExplorers   
//   
//   
//ExampleDEFAULT0     34    //SNPercentCivilianExplorers1     34    //SNPercentCivilianBuilders   
© Microsoft Corporation, 1997   
0     SNPercentCivilianExplorers   
1     SNPercentCivilianBuilders   
100   SNMaximumGAIAAttackResponse   
101   SNBuildFrequency   
102   SNAttackSeparationTimeRandomness    
103   SNAttackIntelligence    
104   SNInitialAttackDelay   
105   SNSaveScenarioInformation   
106   SNSpecialAttackType1   
107   SNSpecialAttackType2   
108   SNSpecialAttackType3   
109   SNSpecialAttackInfluence1   
110   SNSpecialAttackInfluence2   
111   SNSpecialAttackInfluence3   
123            SNTargetEvaluationSiegeWeapon   
124            SNTributeAmount   
125            SNTributeChatFrequency   
126            SNTributeChatRandomness   
127            SNTributeTimeout   
128            SNTributePlayer   
129            SNTributeSuccessOutcome   
130            SNTributeFailureOutcome   
132SNTributePersistence   
133SNTributeRevokeOnAttack   
134   SNInitialAttackDelayType   
135    SNBlotExplorationMap   
136    SNBlotSize   
143SNTaskUngroupedSoldiers   
16    SNMinimumAttackGroupSize   
18    SNTotalNumberExplorers   
19    SNPercentEnemySightedResponse   
2     SNPercentCivilianGatherers   
20    SNEnemySightedResponseDistance   
22    SNSentryDistance   
23       SNArtifactReturnDistance   
25    SNMinimumDefendGroupSize   
26    SNMaximumAttackGroupSize   
28    SNMaximumDefendGroupSize   
29    SNMinimumPeaceLikeLevel   
3     SNCapCivilianExplorers   
30    SNPercentHealthRetreat   
31    SNPercentDeathRetreat   
32    SNPercentExplorationRequired   
34    SNZeroPriorityDistance   
36    SNNumberAttackGroups   
38    SNNumberDefendGroups   
4     SNCapCivilianBuilders   
40    SNGroupFillMethod   
41    SNAttackGroupGatherSpacing   
42    SNNumberExploreGroups   
43    SNMinimumExploreGroupSizeSets the minimum size of land-based soldier exploration groups.  A group must meet its minimum size as one of the tasking prerequisites.  Must be >= 0.    
44    SNMaximumExploreGroupSize   
46    SNAttackSeparationTime   
47    SNAttackCoordination   
48    SNAttackResponseSeparationTime   
49    SNRetreatAfterTargetDestroyed   
5     SNCapCivilianGatherers   
50    SNGoldDefendPriority   
51    SNStoneDefendPriority   
52    SNForageDefendPriority   
54    SNRuinsDefendPriority   
55    SNArtifactDefendPriority   
56    SNTownDefendPriority   
57    SNDefenseDistance   
58    SNNumberBoatAttackGroups   
59    SNMinimumBoatAttackGroupSize   
60    SNMaximumBoatAttackGroupSize   
61    SNNumberBoatExploreGroups   
62    SNMinimumBoatExploreGroupSize   
63    SNMaximumBoatExploreGroupSize   
64    SNDesiredNumberTradeEscorts   
65    SNDesiredNumberFishEscorts   
66    SNDesiredNumberTransportEscorts   
67    SNNumberBoatDefendGroups   
68    SNMinimumBoatDefendGroupSize   
69    SNMaximumBoatDefendGroupSize   
70    SNDockDefendPriority   
71    SNLockAttackAndAttackResponse    
72    SNSentryDistanceVariation   
73    SNMinimumTownSize   
74    SNMaximumTownSize   
75    SNGroupCommanderSelectionMethod   
76    SNConsecutiveIdleUnitLimit   
77    SNTargetEvaluationDistance   
78    SNTargetEvaluationHitpoints   
79    SNTargetEvaluationDamageCapability   
80    SNTargetEvaluationKills   
81    SNTargetEvaluationAllyProximity   
82    SNTargetEvaluationROF   
83    SNTargetEvaluationRandomness   
84    SNNumberWallGates   
85    SNSizeWallGates   
86    SNStoragePitMaxDistance   
87    SNGranaryMaxDistance   
88    SNTacticalUpdateFrequency   
89    SNTargetEvaluationAttackAttempts   
90    SNTargetEvaluationRange   
91    SNPercentUnitHealthRetreatSets the percentage of hit points that a unit can lose (relative to what it started the attack with) before retreating.  Must be >= 1 and <= 100.   
92    SNDefendOverlapDistance   
99    SNScalingFrequency   
Acomodé algunas cosas, y reemplacé 5 espacios por un tab, luego 4, luego 3, y con eso creo que ya quedó. No lo haré de nuevo. Ya con las líneas prolijas, las volví a llegar a Excel. En una columna anterior escribí trace (" en todas las filas (usando copy paste claro). Puse una columna entre medio del 1er número y el comentario. En esa columna puse el random, el código necesario para que se genere un número al azar de -99999 a 99999, más unas comillas porque lo demás es texto, así va quedando:
Código:
trace ("   número   "+(random(199999)-99999)+"   comentario
En una columna al final puse ");. Eso lo fui copiando a las distintas filas, en las cuales sólo variabla el número y el comentario. Copié todo al bloc de notas y ahí reemplacé los tabs por vacío, usando opciones de ahí, no lo hice uno por uno.
´
Ahora esas líneas tenía que ponerlas entre un if y un end if.
Ejemplo gráfico de cómo lo hice:
Código:
if (random(2) == 1) {                  1
if (random(2) == 1) {                  2
if (random(2) == 1) {                  3
   trace ("-1   +(random(199999)-99999)+   //???");         1
   trace ("0   +(random(199999)-99999)+   //SNPercentCivilianExplorers");         2
   trace ("1   +(random(199999)-99999)+   //SNPercentCivilianBuilders");         3
}                  1
}                  2
}                  3
Al ordenar por los números en la derecha queda como se quiere. No es mucho trabajo, es copiar las líneas que ya tenía, ponerles números (Excel lo hace fácil), crear un if, copiarlo tantas veces como líneas necesarias, numerarlo, lo mismo con el endif abajo... y tarán:
Código:
if (random(2) == 1) {                  1
   trace ("-1   +(random(199999)-99999)+   //???");         1
}                  1
if (random(2) == 1) {                  2
   trace ("0   +(random(199999)-99999)+   //SNPercentCivilianExplorers");         2
}                  2
if (random(2) == 1) {                  3
   trace ("1   +(random(199999)-99999)+   //SNPercentCivilianBuilders");         3
}                  3
Si se ve mal mala suerte, problema del foro.

Eso es todo.

Ejemplo:
Spoiler: show
Código:
DEFAULT
//
0   63095   //SNPercentCivilianExplorers
//
2   -89475   //SNPercentCivilianGatherers
3   -89869   //SNCapCivilianExplorers
//
5   -48510   //SNCapCivilianGatherers
//
7   -51555   //???
8   80786   //???
9   -30007   //???
10   54997   //???
//
//
//
14   20708   //???
15   40044   //???
16   76535   //SNMinimumAttackGroupSize
//
//
//
//
//
//
23   71409   //SNArtifactReturnDistance
//
25   -99662   //SNMinimumDefendGroupSize
//
27   -50717   //???
//
//
30   -34102   //SNPercentHealthRetreat
//
//
//
34   -76536   //SNZeroPriorityDistance
//
//
37   35855   //???
38   -14855   //SNNumberDefendGroups
//
40   5156   //SNGroupFillMethod
//
//
43   -9354   //SNMinimumExploreGroupSize
44   -51906   //SNMaximumExploreGroupSize
//
46   -8469   //SNAttackSeparationTime
47   -5681   //SNAttackCoordination
48   -81366   //SNAttackResponseSeparationTime
//
//
//
52   53150   //SNForageDefendPriority
53   -88964   //???
//
55   -71214   //SNArtifactDefendPriority
56   46490   //SNTownDefendPriority
57   19153   //SNDefenseDistance
58   5731   //SNNumberBoatAttackGroups
//
60   -65351   //SNMaximumBoatAttackGroupSize
//
62   -60127   //SNMinimumBoatExploreGroupSize
//
64   -64652   //SNDesiredNumberTradeEscorts
65   9806   //SNDesiredNumberFishEscorts
//
//
//
69   -10295   //SNMaximumBoatDefendGroupSize
70   4727   //SNDockDefendPriority
71   -27780   //SNLockAttackAndAttackResponse
//
//
74   43984   //SNMaximumTownSize
//
//
//
78   -16268   //SNTargetEvaluationHitpoints
//
80   -98994   //SNTargetEvaluationKills
//
82   52778   //SNTargetEvaluationROF
83   -86814   //SNTargetEvaluationRandomness
//
//
86   -86368   //SNStoragePitMaxDistance
87   75630   //SNGranaryMaxDistance
88   -94659   //SNTacticalUpdateFrequency
//
//
91   -41690   //SNPercentUnitHealthRetreat
//
//
//
//
//
97   73209   //SNScalePercentUnitHealthRetreat
//
//
100   -68862   //SNMaximumGAIAAttackResponse
101   12675   //SNBuildFrequency
102   -12202   //SNAttackSeparationTimeRandomness
103   -14856   //SNAttackIntelligence
104   71402   //SNInitialAttackDelay
105   -40987   //SNSaveScenarioInformation
//
//
//
109   -68610   //SNSpecialAttackInfluence1
110   -46018   //SNSpecialAttackInfluence2
111   -83146   //SNSpecialAttackInfluence3
112   91156   //SNMinimumWaterBodySizeForDock
//
//
//
116   16674   //???
117   -20691   //SNFoodGathererPercentage
//
119   60689   //SNStoneGathererPercentage
//
121   -56710   //SNDefendImportantGroupLeaders
//
123   10613   //SNTargetEvaluationSiegeWeapon
124   -25993   //SNTributeAmount
//
//
//
//
129   -12638   //SNTributeSuccessOutcome
130   -86479   //SNTributeFailureOutcome
//
//
133   16314   //SNTributeRevokeOnAttack
//
//
//
//
//
139   79504   //???
//
//
//
143   -64500   //SNTaskUngroupedSoldiers
//
145   -44973   //SNNumberEnemyObjectsRequired
//
//
//
//
150   88201   //SNMaxStoragePits
//
//
//
154   -80979   //???
155   4658   //SNBuildPlanDivisions
156   52395   //???
//
158   -34352   //???
//
160   -1481   //SNMaxBuildPlanGathererPercentage
161   -10396   //SNRequiredFirstBuilding
//
//
164   96658   //SNWoodDropsiteDistance
165   79673   //SNStoneDropsiteDistance
//
167   64160   //SNInitialExplorationRequired
168   44245   //SNRandomPlacementFactor
169   95069   //SNMinimumForestTiles
//
171   90941   //SNMinimumWood
172   -68032   //SNMinimumStone
//
//
175   91378   //SNSpecificBuildItemToBuild
176   -64415   //SNSpecificBuildItemTime
177   -67110   //SNUnskippableItemType
//
//
180   94167   //SNAutoBuildHouses
181   54485   //SNUpgradeToToolAgeASAP
//
//
184   -77158   //SNTargetEvaluationTimeKillRatio
185   -64608   //SNTargetEvaluationInProgress
//
187   -97833   //SNCoopDemandTributeMaximum
//
189   -34850   //???
190   10321   //SNMaximumFood
//
//
//
//
195   -72122   //SNAttackWinningPlayerFactor
196   51006   //SNCoopShareAttacking
197   86059   //SNCoopShareAttackingInterval
//
199   44668   //???
//
//
202   40489   //SNMinimumDropsiteBuffer
//
//
205   -38884   //SNAutoBuildDropsites
206   89146   //SNAutoBuildFarms
207   -4154   //SNAutoBuildTowers
208   4650   //SNAutoBuildDocks
//
210   97697   //SNAutoBuildTransports
211   59985   //???
212   -27705   //SNDesiredNumberDocks
//
214   89481   //SNDesiredNumberTransports
//
//
217   54595   //SNAllowDiplomacyChangeOnTribute
//
219   -70104   //SNEasierReactionPercentage
//
//
222   16464   //SNMaxTowers
//
224   63075   //SNDesiredNumberWarships
//
//
//
228   -56466   //???
//
230   75429   //???
END
Los comentarios vacíos los agregué porque me facilita comparar unas con otras.

Utilidad:
Generar pers variadas rápidamente.

Problemas:
Puede generar pers que enlentezcan el juego a niveles injugables. Eso se debe a que algunos números son muy altos o muy bajos, podría ceñirme a lo que dice el manual pero no me fío de ellos.

Búsqueda de cuales son los errores:
Les cuento algo curioso al respecto. La Per7 enlentece la partida. ¿Puedes averiguar por qué?
Spoiler: show
Imagen
Yo lo intenté pero sólo pude haciendo pruebas a lo bruto. Esto es lo que hice antes:

En una tabla averigué los mínimos y máximos de cada valor de las Per que funcionan bien. Luego en cada fila de la Per7 intenté esto:
Si no hay número, dejarlo así.
Sino si no se halló mínimo y máximo, quitar el número.
Sino si el mínimo es igual al máximo, usar cualquiera de ellos.
Sino si el número es menor al mínimo, usar el mínimo.
Sino si el número es mayor al máximo, usar el máximo.

Pero siguió lenta.

Es decir, a los números que eran más negativos o más altos que los de las otras Per, los normalicé al nivel de ellas.
En los casos en que sólo hubo un valor válido conocido (sólo una per asignó un número a eso), se usa ese número (si es que se estaba usando otro).
En los casos en que no hubo un valor válido conocido, no asignar valor (hay un caso así).

Quizá hice mal algo de eso, pero lo que hice no funcionó.

Tras varias pruebas a lo bruto quitando líneas del archivo vi que el error es esto:
Código:
36   -79404   //SNNumberAttackGroups
40   -76963   //SNGroupFillMethod
Están en la tabla. No una cosa sino la presencia de ambas. Chocan se ve. Quizá asignando ciertos valores a ciertas líneas ya no haya problema, es decir, parece que tengo la costumbre de creer que el problema es una pieza particular, y que mejorando eso se arregla la cosa, pero como esto muestra, a veces el problema no es una cosa simple sino la interacción de ella con otra, por lo que el problema puede ser en parte la otra.

Compu lentra otra vez, bye.

Aunque si escribo en el bloc de notas y luego lo pego no problem. De hecho ya estoy escribiendo ahí.

Edit: Lo separo por esto:
El formulario enviado era no válido. Intente enviarlo de nuevo.
Su mensaje contiene 72387 caracteres. El máximo número de caracteres permitidos es 60000.

¡Te gané Alex!

------------------------------------------------------------------------------------------------

Basicamente estoy como al inicio. Sigo sin saber cómo crear altas variaciones. Pero tengo un par de conceptos nuevos... máxima variación de una estructura. Y algunas propiedades de ella.

También anduve simplificando.
Supongamos que queremos variar de la mejor forma un valor, que puede ir del 1 al 9. Esta quizá es una forma:
9
1
5
7
3
8
2
6
4
Por qué:
9: No se sabe a priori qué es lo mejor... pero suelen serlo los topes.
1: Si el tope no funcionó, puede que el mínimo. Es el número más diferente del anterior.
5: Centro. El que digamos no resulta suficientemente igual a los anteriores.
7: Centro entre 5 y 9, alejado del 1 que fue usado más recientemente que el 9.
3: Centro entre 5 y 1, alejado del 7.
8: Centro entre 9 y 7, alejado del 3.
Bueno, más o menos se entiende. Escucho otras teorías...

Ahora algo más interesante aunque complicado: Si fuesen 2 números.
9 y 1
2 y 8
5 y 5
7 y 3
4 y 6
Lo puedo seguir pensando pero el hecho es que no tengo mucha idea.
1ero se eligen 2 extremos, sigue la lógica de antes.
Luego un poco menos extremo (para no repetir valores ya usados) y en orden inverso.
Luego algo dudoso... una repetición... debe ir en algún punto pero quizá es muy pronto.
Después la diferencia sigue bajando como si fuese desde el inicio. En cierto modo se podría decir que se está variando un número del -8 al 8 (rango de resultados de restar un número al otro):
8
-6
0
4
-2

¿Para qué sirve esto, qué sentido tiene?
Hay problemas cuya solución es basicamente un par de números. ¿Cómo son, la mayoría de esos pares? ¿cual es el orden de pruebas que en general halla las soluciones más rápido? Y con algo de divertido, porque probar:
1 y 1
1 y 2
1 y 3
etc puede ser rápido pero aburrido.
...
En definitiva serviría para buscar soluciones de un modo más eficiente y divertido.

En el juego también hay números, por ejemplo la civilización (1~16), el 1er objeto a crear (1~5 aprox), la cantidad de regresos, el 2ndo objeto, sus regresos, y así sucesivamente. En algunos casos, que los números sean extremos o centrales importa un comino, pero en otros es probable que importe.

------------------------------------------------------------------------------------------------

Máxima variación de estructuras.

Esto tiene que ver con lo anterior, aunque no sé qué tanto.

A continuación, las letras representan elementos (aldeanos, soldados, almacenes, etc).

Supongamos que se plantea la estructura:
A

La próxima no debe incluir A, porque... puede ser como si jugando al ajedréz elegimos usar 1 peón, perdimos, y ahora queremos usar de nuevo otro y alguna otra cosa, cuando lo probable es que si elegimos todo distinto elijamos algo mejor. Entonces:
B-C
Notese que aumentó la extensión, estaba compuesta por 1 elemento y ahora por 2. Podría haber aumentado a extensión 10, 938u23, pero me gusta así de a 1.

La próxima yo diría que debe ser:
D-E-D
Aunque no sé bien justificarlo. Es que hasta ahora siempre se usaron elementos distintos en una estructura. Siguiendo la lógica de probar cosas nuevas deberíamos probar elementos nuevos, pero esto también es nuevo, algunas cosas funcionan mejor cuando se combinan consigo mismas.

Una tabla:
Estructura___1s__2s__3s__4s
A__________1
B-C________3
D-E-D______4___1
Explicación:
1s significa la cantidad de veces que hasta ahora (con la nueva estructura inclusive) hubo elementos que sólo estuvieron presentes 1 vez en la estructura.
2s significa... 2 presencias.
...
¿Utilidad?
Intento que esos números marquen o guien cómo sería la siguiente estructura.

Ah, una cosa: No debe haber 2 elementos seguidos iguales. Entiendo que no tiene mucho sentido, esto lo estaba pensando para cosas como:
Aldeanos-Cuarteles, en lo cual yo variaba los números, por ejemplo 49 aldeanos, 1 cuartel, por eso no tenía sentido decir 40 aldeanos, 9 aldeanos.

Estructura___1s__2s__3s__4s
A__________1
BC_________3
DED________4___1
FGFG_______4___3
HIHIH_______4___4__1
JKJKJK______4___4__3
LMLMLML____4___4__4___1
etc

Problema:
Con este sistema las estructuras siempre estarían compuestas de máximo 2 elementos (a excepción de la 1era y sólo porque tiene 1 elemento solo).

¿Solución?
Quizá variar la repetición de la mínima distancia... o la cantidad de tipo de elementos.

------------------------------------------------------------------------------------------------

¿Se entiende la cuestión? Me suele pasar en todos los juegos, comienzo teniendo en cuenta unas variables, luego voy agregando otras, intento variarlas y a las estructuras, empezar por estructuras simples (equivale a usar 1 solo personaje por ejemplo, o siempre usar el mismo poder) y en muchos casos no puedo hacer algo prolijo o concreto, puro lío.

_________________
Si no puedes hacerlo, intenta primero hacer algo más simple aunque similar.


Arriba
 Perfil  
Responder citando  
NotaPublicado: 15 Mar 2019, 04:24 
Desconectado
Avatar de Usuario

Registrado: 10 Ago 2011, 20:39
Mensajes: 9372
Nil escribió:
Marcus Hutter es muy buen ejemplo, lee sus artículos e intenta hacer algo parecido. Por ejemplo éste: https://arxiv.org/abs/cs/0206022

Tú estabas en esto para resolver problemas,¿no?
¿Pero tú entiendes lo que él hace? Yo le haría un test de turing. Por lo que leí habla de un programa que basicamente resulta mejor buscador de soluciones que otros, pero no se llega a entender cómo está hecho, es como si un sacerdote estuviese diciendo que hay un ser mejor que otros sin decir cómo es, quién le cree. También está claro que yo no tengo el nivel como para entender todas las referencias que hace a otros algoritmos.

No sé, no leí mucho, pero lo veo demasiado teórico, hablando de cosas que no parece mostrar. Si lo has entendido, en lo posible explicame. Sino, fijate más o menos mis post en este tema, planteo diversos problemas...

-----------------------------------------------------------------------------------------------------------------

Continué pensando en "la máxima variación de una estructura", de extensión 2. Propiedades a tener en cuenta:
- Cantidad de veces que hubo un 1.
- Cantidad de veces que hubo un 2.
Eso se repite hasta 9 inclusive.
- Cantidad de veces que la diferencia es -8
- Cantidad de veces que la diferencia es -7
Eso se repite hasta 8 inclusive.
- Cantidad de veces que hubo 1 y 2.
- Cantidad de veces que hubo 1 y 3.
Eso se repite hasta 8 y 9. Son las "combinaciones" en que no hay repetición y no importa el orden.

Lo muestro en Excel:
Imagen
La siguiente estructura debe ser la que ayude a mantener un balance en las propiedades de la derecha. Por ejemplo una de las peores elegibles es 9 y 1, porque hace que una diferencia de 6 haya ocurrido 2 veces mientras que muchas otras siguen en 0 veces, y la mezcla 1 y 9 ocurrió 2 veces mientras que muchas otras siguen en 0. Pero a pesar de eso no logro ver cual es la estructura en cuestión, todas parecen tener algún defecto.

Hay algunas cosas que no estoy diciendo en la tabla, por ejemplo que (teniendo en cuenta la tabla) una diferencia de -7 es preferible a un 8, pues aunque ambas ocurrieron 0 veces, sí ha ocurrido -8 aunque no 7, es decir... en algunos problemas puede que no importe si la diferencia es X o -X, basta conque sea X, entonces intento variar el número en vez de usarlo y luego negativo o viceversa.
Otra cosa importante aunque quizá sólo por estética u orden es el último número usado. Por ejemplo la última diferencia es 2, por lo que se preferiría, ahora, una diferencia negativa o quizá neutra, pero no positiva otra vez.

Bueno, volviendo al tema de los defectos. La parte de presencias no da mucha pista respecto a qué hacer, sólo que deberíamos evitar el 5 por ahora. La parte de diferencias nos dice que deberíamos intentar que sea alguna de estas: -7, -6, -5, -3, -2, -1, 0 y otras pero como dije es preferible una negativa o neutra por ahora.
-6, -2 y 0 son menos preferibles porque sus contrarios ya ocurrieron, y en el caso de 0 ya ocurrió él mismo.
Eso nos deja -7, -5, -3 y -1.

-7 podría ser:
2 y 9: 9 ya fue usado en 2ndo lugar (1er estructura: 1 y 9) pero en el lugar 1 no, por lo que si ha de usarse un 9 sería preferible usarlo ahí.
1 y 8: 1 ya fue usado en 1er lugar.

-5:
4 y 9: 9 ya fue...
3 y 8: 3 ya...
2 y 7: 7 ya...
1 y 6: 1 ya...

En fin, puedo seguir pensando cual correspondería pero como ven no me es fácil, no me doy cuenta. A ver si puedo automatizar el proceso de elección.

-----------------------------------------------------------------------------------------------------------------

Fui a un liceo a consultar más o menos por esto que estoy haciendo, lo de investigar en el orden más probablemente eficiente. A una profesora de biología creo le pregunté casi al final de la conversación cómo buscaban los científicos la cura de las enfermedades, le dije que hacían pruebas y les pregunté en qué orden, a lo cual me dijo que no sabía y así acabó la charla. Un profesor de matemática me dijo que no sabía y me recomendó preguntar en la facultad de ingeniería o ciencias.

Continuará...

_________________
Si no puedes hacerlo, intenta primero hacer algo más simple aunque similar.


Arriba
 Perfil  
Responder citando  
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 9 mensajes ] 

Todos los horarios son UTC + 1 hora [ DST ]


¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot], Google [Bot] y 0 invitados


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Saltar a:  
POWERED_BY
Traducción al español por Huan Manwë para phpbb-es.com
phpBB SEO