programmation autours d'un jeu - Divers - Programmation
Marsh Posté le 18-02-2013 à 12:53:45
C'est pas clair,
Tu dis :
Citation : Cela est toujours faisable en 5 retournements minimum (démontré via théorie des groupes). |
puis :
Citation : *Trouver ainsi le nombre totale de positions résolvables en : 1, 2, 3, 4 et 5 retournements minimum. |
Marsh Posté le 18-02-2013 à 13:10:00
Je souhaite connaitre pour chacune des 64000 positions le nombre minimum de retournements necessaires. Je pense qu'il faut lire la regle du jeu
Marsh Posté le 18-02-2013 à 13:29:23
Le Khalou est un jeu de plateau 4X4 comportant des jetons bifaces (noires et blanches).
Le principe du jeu est le suivant :
*Le jeu débute par une répartition aléatoire des jetons (et de leurs faces visibles) sur le plateau
*Le but est de parvenir en une succession de mouvements différents à un plateau de jeu tout blanc (tous les jetons avec leurs faces visibles blanches).
*2 Types de mouvements principaux sont autorisés :
*Retournement des faces visibles sur une ligne, colonne, ou grande diagonale. Dans ce cas chacun des 4 jetons sur toute la ligne, colonne ou diagonale sélectionnée voit sa face visible changer de couleur.
*Retournement des faces visibles sur « un coude » : le coude est une position en « L » impactant 3 jetons dans n’importe quelle direction. Chacun des 3 jetons sélectionnés par ce retournement voit ainsi sa face visible changer de couleur.
Le but du jeu du Khalou est donc de rendre blancs tous les jetons uniquement grâce à ces types de retournements. Cela est toujours possible en 5 retournements maximum.
Marsh Posté le 18-02-2013 à 14:24:08
pour moi il y a 46 mouvements possibles dont 36 mouvements en coudes.
Marsh Posté le 18-02-2013 à 14:26:30
J'avais mal lu les règles sur les coudes (en forme de L, j'étais parti sur des coudes de 4 cases, et toujours en coin).
Il y a 36 coudes (1 coude par coin, 2 coudes par case du bord qui n'est pas un coin, et 4 coudes par case centrale) 1*4 + 2*8 + 4*4 = 36
On voit a la base que il y a 4 + 4 + 2 + 34 = 46 mouvements distincts donc peut procéder en partant d'un damier blanc et en effectuant les 44 mouvements pour les solutions en 1 coup, puis partant des solutions en un coup, les 45 mouvements (on ne fait pas deux fois de suite le même mouvement, car cela s'annule) pour les solutions en deux coups (pas déjà trouvées dans les solutions en un coup) etc.
A+,
Marsh Posté le 18-02-2013 à 14:26:34
46 positions resolvables en 1 coup
46*45/2 positions resolvables en 2 coups
Marsh Posté le 18-02-2013 à 14:33:12
Oui, 36, pas 34 pour les coudes, si j'arrive plus à faire une addition correctement...
au plus 188628750 opérations de transformation à effectuer, ça doit être possible dans un temps correct.
Je regarderais si ça prends pas trop de temps en perl ce soir, parce que je suis offline d'ici la.
A+,
Marsh Posté le 18-02-2013 à 14:37:29
Pour moi le plus simple et rapide serait de representer chaque position par un nombre de 16 chiffres composé de 0 ou de 1 (0 = blanc et 1 = noir) et de faire tourner toutes les posibilités
Marsh Posté le 18-02-2013 à 19:00:24
*Il existe 2^16-1 positions = 65.535. En effet on ne compte pas la position avec jetons tout blancs.
*On peut représenter chaque position par un nombre de 16 chiffres composé de 0 ou de 1 (0 = blanc et 1 = noir) et faire tourner toutes les possibilités. En ne comptant pas celle composée de 16 chiffres 0.
*Il existe 46 mouvements possibles. Chaque mouvement permet de changer 3 ou 4 chiffres du nombre désignant la position initial. Par exemple si les couleurs des 16 jetons sont représentées dans le chiffres de gauche a droite et de haut en bas alors le retournement de la ligne du haut change les 4 premiers chiffres du nombre a 16 chiffres représentant la position d’origine.
Ainsi si la position d’origine est : 1000.1100.0001.1010 retourner la première ligne aboutit à la position notée : 0111.1100.0001.1010
Ou si la position d’origine est : 1000.1100.0001.1010 retourner le premier coude aboutit à la position notée : 0100.0100.0001.1010
Le but étant avec un minimum de retournements d’aboutir au chiffre : 0000.0000.0000.0000
*Il suffit alors de faire tourner les 65.535 positions et pour chacune d’elles de modifier le chiffre de cette position avec les 46 puis 46^2 puis 46^3 puis 46^4 retournements possibles.
Quand le chiffre 0000.0000.0000.0000 apparait (cela arrivera plusieurs fois souvent) on note le nombre de retournements minimum utilisés. Sinon c’est qu’il eut fallu 5 retournements.
Ce n’est de loin pas le meilleur algorithme mais selon moi le plus simple.
D’autres idées ????
Marsh Posté le 19-02-2013 à 00:53:45
Code :
|
C:\Perl>perl khalou.pl |
C'est peut être optimisable, mais même sur ma vieille bécane qui n'a que 2 Go de mémoire et un pentium4, ça ne prend que qques secondes, donc ça vaut pas trop la peine de chercher à optimiser cela.
A+,
Marsh Posté le 19-02-2013 à 01:09:01
Le truc qui a pris le plus de temps, c'est de déterminer tous les mouvements pour générer @moves.
Je me suis servi de deux fonctions auxiliaires qui me permettent de lire et imprimer un board:
Code :
|
et d'une liste des 64 boards représentant un mouvement:
Code :
|
(on peut retrouver cette liste en appliquant printboard aux éléments de @moves)
Le seul truc qu'il fallait voir, c'est qu'on pouvait coder tout board initial comme un entier entre 0 et 65535, par sa représentation binaire, tout mouvement comme un entier dans cet intervalle aussi, et que partant d'un board b, l'opération qui consiste à lui appliquer un mouvement m revient a faire le xor de b et m.
A+,
Marsh Posté le 19-02-2013 à 01:28:40
A partir du code donné, on peut facilement écrire une routine résolvant n'importe quelle position de départ en un minimum de mouvements:
Code :
|
Ce qui donne:
Depart: |
A+,
Marsh Posté le 18-02-2013 à 12:41:28
Bonjour,
Je recherche un programmeur qui pourrait m’aider a faire tourner un ptit programme au sujet d’un jeu.
Ce jeu se nomme KHALOU et est disponible gratuitement sur Itunes pour Iphone et Ipad.
https://itunes.apple.com/fr/app/khalou/id589404904?mt=8
Je vous laisse en lire les règles. Voici mes requêtes :
Il existe pour ce jeu 2^16 = 65536 positions différentes.
Les jetons de ce jeu peuvent se retourner de différentes façons. Je cherche un petit script a faire tourner qui pourrait me donner :
*Pour chacune des positions : le nombre de retournement minimum pour rendre le damier du jeu tout blanc (le but du jeu). Cela est toujours faisable en 5 retournements minimum (démontré via théorie des groupes).
*Trouver ainsi le nombre totale de positions résolvables en : 1, 2, 3, 4 et 5 retournements minimum.
Qui pourrait m’aider pour cette programmation ?
Merci
Dan