Plop. (so 2013)
Je programme actuellement Cube C, version complètement refaite (et beaucoup moins conne) de Cube On, je devrais surement l'avoir fini dans une à deux semaines, en comptant une autre semaine pour le debug, disons 2 à 3 semaines avant qu'il soit up.
L'algorithme de décision de Cube ne se base pas sur les particularités d'un tier ou les combo courants, il pourra donc jouer en tout tier singles (bon le LC va demander quelques aménagements quand même ...), à condition d'avoir une chose : une base de donnée de sets. CAD que quand cube voit un poké adverse, faut pas déconner, il n'est pas totalement extérieur à la méta pokémon parce que sinon il va se demander si Garchomp va utiliser gros yeux ou mimi queue alors que franchement ... bon, on s'abstient.
Pour jouer dans un tier, Cube aura donc besoin d'une chose : une base de donnée associée, recensant tous les sets courants que peut avoir un pokémon.
La base de donnée de l'OU, je vais la faire intégralement, mais j'appréhende déjà que je me sentirai pas de la faire pour chaque tier ... Donc ! S'il y aura des gens intéressés pour faire combattre Cube, par exemple, en PU, eh bah vous pouvez aider à faire quelques entrées de la DB.
Une entrée ressemble en fait à ça :
- Code:
-
Set('venusaur','life orb,leftovers,black sludge','overgrow,chlorophyll','255/0-/255+/0/0/4,4/0-/0/255/0/255+','gigadrain,synthesis,sleeppowder,sludgebomb,hiddenpowerfire',[ {'move':'gigadrain'}, ['implies',{'EVs':'255/0-/255+/0/0/4'},{'move':'synthesis'} ] ,['implies',{'EVs':'255/0-/255+/0/0/4'},['or',{'item':'leftovers'},{'item':'black sludge'}] ], ['implies',{'EVs':'4/0-/0/255/0/255+'},{'move':'hiddenpowerfire','move2':'sludgebomb','ability':'chlorophyll'}], ['implies',{'move':'hiddenpowerfire'},{'move':'sludgebomb'}] ])
Et là, (bon c'est un exemple donc c'est pas la version finale), cube vient d'apprendre à jouer contre florizarre.
Un pokémon peut prendre quelques milliers de sets (donc là c'est assez compact pour tous les dire ...), donc voilà une explication :
Au lieu d'écrire 1000 lignes par poké, (non. juste non.) on donne en fait tous les choix de ce poké dans chaque catégorie : les objets qu'il peut prendre, les capacités qu'il peut prendre, les réparts EVs qu'il peut prendre (écrites en x/x/x/x+/x/x-), les attaques.
A partir de là tous les sets possibles et imaginables avec ces choix sont imaginés. Mais vu qu'ils sont potentiellement nuls (SALUT MOI C'EST VENU LO REPART OFFENSIVE OVERGROW AVEC HP FIRE SLEEP POWDER SYNTHESIS ET SLUDGE BOMB), on les épure à grand coup de ... ce qui arrive après. Ca :
- Code:
-
[ {'move':'gigadrain'}, ['implies',{'EVs':'255/0-/255+/0/0/4'},{'move':'synthesis'} ] ,['implies',{'EVs':'255/0-/255+/0/0/4'},['or',{'item':'leftovers'},{'item':'black sludge'}] ], ['implies',{'EVs':'4/0-/0/255/0/255+'},{'move':'hiddenpowerfire','move2':'sludgebomb','ability':'chlorophyll'}], ['implies',{'move':'hiddenpowerfire'},{'move':'sludgebomb'}] ]
Ceci est une liste de "phrases logiques" (prédicats.) qui définit des relations entre les choix pour faire des sets potables.
La liste ici dit :
- Venusaur a Giga Drain.
- Si Venusaur a une répart défensive, alors il a synthesis.
- Si Venusaur a une répart défensive, alors "Venusaur a soit des Leftovers, soit un Black Sludge"
- Si Venusaur a une répart offensive, alors Venusaur a : HP Fire, Sludge Bomb, et a comme capacité Chlorophyll.
- Si Venusaur a HP Fire, alors Venusaur a Sludge Bomb.
Et en disant tout ça, il ne reste que les sets répondant à toutes ces affirmations, et qui sont donc viables si on a mis des conditions pertinentes.
Comment faire cette liste :
"Venusaur a pour X Y" se dit {X:Y} (on se fout des espaces btw)
Comme : { "item" : "leftovers" }
ou encore { "move" : "gigadrain" }
Après, pour faire une connection :
[ "connecteur logique" , "ceci" , "cela" ]
Les connecteurs logiques que j'ai programmé sont : and (et) ; or ( ou inclusif ) ; xor ; (ou exclusif, l'un ou l'autre, mais pas les deux) ; implies (si ceci, cela) ; nand ( pas ceci, ou pas cela); biimplies (s'il y a l'un, il y a l'autre)
Par exemple si je veux dire que venusaur doit avoir solarbeam ou giga drain, mais pas les deux ensembles, ce sera :
[ "xor" , {"move" : "gigadrain"} , {"move" : "solarbeam"} ]
Et ... bah c'est à peu près tout. Une fois qu'on a écrit toutes les phrases logiques on les juxtapose :
[ phrase logique 1, phrase logique 2, ... ]
Et pour rigoler on peut y aller en récursif :
['implies',{'EVs':'255/0-/255+/0/0/4'},['or',{'item':'leftovers'},{'item':'black sludge'}] ]
^ Ceci signifie "Si répart défensive, alors : phrase logique ['or',{'item':'leftovers'},{'item':'black sludge'}] doit être vraie"
Et on peut continuer ...
J'ajouterais enfin juste qu'on peut mettre plus que 2 infos dans un and ou un or :
["or", {"move":"gigadrain"} , {"move":"leaf storm"} , {"move":"solarbeam"} ]
= il y a au moins un des moves parmis giga drain, leaf storm et solarbeam
Pour un implies, ça ne voudrait rien dire.
Voilà, en espérant avoir expliqué à peu près correctement ... si vous vous sentez d'aider, ce serait sympa ! (Enfin cube sera prob opérationel seulement fin août)