J'essaie d'écrire un solveur en C # .NET pour un jeu appelé Flowerz. Pour votre référence, vous pouvez le jouer sur MSN, ici: http://zone.msn.com/gameplayer/gameplayer.aspx?game=flowerz . Je l'écris pour le plaisir, pas pour tout type de mission ou quoi que ce soit lié au travail. Pour cette raison, la seule limite est mon ordinateur (un noyau Intel i7, avec 8 Go de RAM). Il n'a pas besoin de fonctionner ailleurs, en ce qui me concerne.
En bref, ses règles sont comme ceci:
- Il y a une file d'attente remplie de fleurs colorées. Sa longueur est arbitraire
- La file d'attente ne peut pas être influencée
- La file d'attente est générée au début du niveau
- Les fleurs ont une ou deux couleurs.
- S'il y a deux couleurs, alors il y a une couleur extérieure et une couleur intérieure. Dans le cas de deux couleurs, la couleur extérieure est utilisée pour l'appariement.
- S'il y a une correspondance, la couleur extérieure disparaît et la fleur est maintenant une fleur de couleur unique avec la même couleur que la fleur intérieure
- Le but du jeu est de créer des matchs de trois (ou plus) de la même couleur
- Lorsqu'une fleur d'une seule couleur fait partie d'un match, elle est supprimée du terrain de jeu, créant un espace vide
- Vous pouvez faire correspondre une fleur d'une seule couleur avec la couleur extérieure d'une fleur bicolore. Dans ce cas, la fleur unicolore disparaît, la couleur extérieure de la fleur bicolore disparaît et la couleur intérieure reste
- Vous gagnez la manche lorsque la file d'attente est vide et qu'il reste au moins un espace vide
- Des correspondances en cascade sont possibles. Une cascade se produit lorsque trois (ou plus) fleurs extérieures disparaissent, et lorsque leurs couleurs intérieures forment une autre chaîne de 3 (ou plus de fleurs).
- Le terrain de jeu est toujours 7x7
- Certains espaces sur le terrain sont couverts de roches
- Vous ne pouvez pas placer des fleurs sur des rochers
- La file d'attente peut également contenir une pelle que vous pouvez utiliser pour déplacer n'importe quelle fleur placée vers un espace inoccupé
- Vous devez utiliser la pelle, mais vous n'avez pas vraiment à déplacer la fleur: il est parfaitement légal de la replacer d'où elle est venue
- La file d'attente peut également contenir un papillon coloré. Lorsque vous utilisez ce papillon sur une fleur, la fleur prend la couleur du papillon
- L'application d'un papillon sur une fleur à deux couleurs fait que la fleur n'a qu'une seule couleur, à savoir celle du papillon
- Vous pouvez gaspiller le papillon sur un espace vide ou une fleur qui a déjà cette couleur
- Vider le terrain ne gagne pas la partie
Le but du solveur est simple: trouver un moyen de vider la file d'attente, avec autant d'espaces restants sur le terrain que possible. Fondamentalement, l'IA joue le jeu pour moi. La sortie du solveur est une liste des mouvements qu'il a trouvés. Je ne m'intéresse pas au score, mais à survivre le plus longtemps possible, donc je m'intéresse aux mouvements qui laissent autant d'espaces ouverts que possible.
Inutile de dire que l'espace de recherche augmente rapidement plus la file d'attente est grande, il est donc hors de question d'avoir recours à une force brute. La file d'attente commence à 15 et augmente avec 5 tous les deux ou trois niveaux, si je me souviens bien. Et, bien sûr, placer la première fleur sur (0,0) et la seconde sur (0,1) est différent de placer la première sur (1,0) et la deuxième fleur sur (0,0), surtout lorsque le champ est déjà peuplé de fleurs d'un cycle précédent. Une décision aussi simple pourrait faire la différence en la rendant ou non.
Mes questions sont les suivantes:
- Quel genre de problème est-ce? (pensez vendeur ambulant, sac à dos ou autre problème combinatoire). Le savoir pourrait rendre mon Google-fu un peu meilleur.
- Quel type d'algorithme pourrait me donner de bons résultats, rapidement?
En ce qui concerne ce dernier: au début, j'ai essayé d'écrire mon propre algorithme heuristique (essentiellement: comment pourrais-je le résoudre, si je connaissais la file d'attente?), Mais cela se traduit par de nombreux cas marginaux et des correspondances de score que je pourrais manquer.
Je pensais utiliser un algorithme génétique (parce que je sais au moins comment l'utiliser ...), mais j'ai du mal à décider d'une représentation binaire de la carte. Ensuite, il y a le problème du croisement, mais cela peut être résolu avec un opérateur de croisement ordonné ou un type d'opération similaire.
Je suppose que le solveur doit toujours connaître la configuration de la carte et la file d'attente qu'il essaie de vider.
Je connais quelques autres algorithmes heuristiques tels que les réseaux de neurones et les systèmes de logique floue, mais je n'ai pas l'expérience pour savoir lequel est le mieux applicable, ou s'il y en a d'autres qui sont mieux adaptés à la tâche à accomplir.