Je cherche à créer une fonction de résolubilité pour un algorithme de jeu. Fondamentalement, une fonction qui renvoie vrai ou faux pour un jeu donné pour déterminer s'il est résoluble ou non.
Le jeu est Buttonia.com (qui n'implémente pas encore l'algorithme), un type de jeu de lumières. Fondamentalement, vous avez une grille de boutons, chacun desquels, lorsqu'il est pressé, changera l'état de certains de ses voisins. Actuellement, je génère une configuration de jeu aléatoire puis j'applique des heuristiques autant que possible. Le reste est décidé par une recherche de force brute.
Mon avancée jusqu'à présent a été de créer un système d'équations pour modéliser le jeu. Comme chaque bouton doit changer d'état un nombre impair de fois pour se retrouver dans un état bas, son équation serait la suivante :
bouton_A = 1 - (bouton_1 + bouton_2 + ... + bouton_X) % 2
Où bouton_1 à bouton_X sont les états des boutons ayant un effet sur bouton_A. Certains boutons peuvent être résolus immédiatement, s'ils ne dépendent pas des autres. Pour le reste, j'essaie une configuration jusqu'à ce que je rencontre un conflit et je reviens en arrière.
Actuellement, cet algorithme est pratique pour des configurations plus petites. Je l'ai testé à partir de jeux 3x3 jusqu'à des tailles de 10x10. Où 6x6 est presque une limite supérieure pour un jeu pratique.
Les équations réduisent énormément l'espace de recherche de la force brute, le rendant pratique. Il pourrait y avoir un moyen purement mathématique de résoudre le système d'équations.
Exemple de jeu 3x3 en ascii (de buttonia.com/?game=2964) :
||#
-o-
+#|
Légende :
o = affecte seulement soi-même
- = affecte les voisins de gauche et de droite
| = affecte les voisins du haut et du bas
+ = affecte les voisins de gauche, de droite, du haut et du bas
# = affecte tous les 8 voisins environnants
Solution, appuyez sur ces boutons : (0,0), (2,0), (1, 2), (0, 1), (1, 1), (2,1)
Équations pour ce jeu :
Bouton_0_0 = 1 - (0) % 2
Bouton_1_0 = 1 - (Bouton_2_0) % 2
Bouton_2_0 = 1 - (0) % 2
Bouton_0_1 = 1 - (Bouton_0_0 + Bouton_0_2 + Bouton_1_2) % 2
Bouton_1_1 = 1 - (Bouton_1_0 + Bouton_2_0 + Bouton_0_1 + Bouton_2_1 + Bouton_1_2) % 2
Bouton_2_1 = 1 - (Bouton_2_0 + Bouton_1_2 + Bouton_2_2) % 2
Bouton_0_2 = 1 - (Bouton_1_2) % 2
Bouton_1_2 = 1 - (Bouton_0_2) % 2
Bouton_2_2 = 1 - (Bouton_1_2) % 2
Solution potentielle :
Modifier les fonctions mathématiques pour éviter le besoin du modulo nous permet de déplacer les termes du côté gauche vers la droite, créant la configuration matricielle soignée dont nous avons besoin pour la méthode de Gauss. Ainsi, les deux premières équations se convertiraient respectivement en :
-1 = -1*B00 + 0*B10 + 0*B20 + 0*B01 + 0*B11 + 0*B21 + 0*B02 + 0*B12 + 0*B22
-1 = 0*B00 + -1*B10 + -1*B20 + 0*B01 + 0*B11 + 0*B21 + 0*B02 + 0*B12 + 0*B22
Solution discutée ici : Élimination de Gauss avec des opérateurs personnalisés
De plus en plus proche. Presque prêt à afficher la solution complète : Inverse de réseaux binaires