Bonjour,
Tout d’abord, je m’exuse pour ce titre qui n’est probablement pas très clair. Je cherche à savoir comment organiser un terrain de jeu non rectangulaire, hexagonal en l’occurence. Le but c’est bien sûr de faire quelque chose d’efficace, et si possible simple.
Pour illustrer ce que je souhaite faire, je vais prendre une grille rectangulaire classique en example. Ensuite la question est la même à chaque fois: comment transpose-t-on cela à un terrain hexagonal ?
Problème n°1: les coordonnées
Tout le monde sait que sur une grille rectangulaire, on peut désigner une case de manière unique à l’aide de deux coordonnées. A une case correspond exactement une seule coordonnée (x;y), et à une coordonnée (x;y) correspond exactement une seule case. Mathématiquement parlant, c’est une bijection.
Pour un terrain hexagonal, vu qu’on passe de 2 à 3 axes, on pourrait se dire naïvement qu’on n’a qu’à ajouter une troisième coordonnée.
Malheureusement on s’aperçoit très vite, même sans grand raisonnement compliqué, que (-1;1;0) désigne la même case que (0;0;1). Je laisse les pros s’amuser à prouver ce que j’avance, et qu’on ne peut pas construire un système linéairement indépendant avec trois coordonnées dans ce cas s’ils en ont envie, mais ce n’est pas le but premier de ce sujet.
Ce qui m’intéresse de savoir est, y a-t-il une solution en utilisant deux coordonnées ? Ou trois avec un moyen tordu pour éviter les ambiguïtés ? OU mieux vaut carrément numéroter les cases linéairement (équivalent à de la 1D) ? Les pros pourront s’amuser à prouver qu’il existe, ou qu’il n’existe pas d’isomorphisme avec une grille rectangulaire… de nouveau je ne cherche pas de preuve, seulement une solution à utiliser de manière pratique si elle existe. Je suis informaticien, pas mathématicien.
Problème 2: le nombre de cases
Pour une grille rectangulaire, si je décide qu’elle fait 6 cases de côté, alors c’est facile: il y a 6x6=36 cases. De manière générale, tout simplement x².
Pour un terrain hexagonal, j’arrive à la formule suivante par récurrences: l’exagone de 1 case de côté fait exactement 1 case, et pour construire l’exagone de côté n, on ajoute 6(n-1) cases à l’hexagone de côté n-1. Ce qui donne:
- 1 => 1
- 2 => 6(2-1)+1 = 6+1 = 7
- 3 => 12+7 = 19
- 4 => 18+19 = 37
- 5 => 24+37 = 61
- 6 => 91 (mince il n’est plus premier ! C’était trop beau)
- …
J’ai la flemme de compter pour voir si c’est correct. Ca ferait un problème de moins, mais attendez la suite !
Problème 3: Tableau 1D
Vous ne trouvez pas que les tableaux multidimensionels, c’est lourd à gérer, source d’erreurs idiotes et pas spécialement pratique, peu importe le langage de programmation ? C’est pour ça que j’aimerais bien représenter mon terrain dans un tableau 1D, c’est beaucoup plus simple.
D’où d’abord la nécessité de connaître le nombre de cases (problème précédent). Maintenant il faut ressortir le problème n°1, celui des coordonnées. Si on est resté sur deux coordonnées, on fait comment pour passer des coordonnées à l’index dans le tableau et vice-versa ?
Pour une grille rectangulaire c’est très simple: pour l la taille du côté, i l’index et (x;y) les coordonnées, on a:
- i = ly +x
- x = i%l; y = i/l
Évidemment il faudrait que la solution soit générale, c-à-d fonctionnant pour n’importe quelle valeur de l>0.
Problème 4: navigation
Mettons que sur une grille rectangulaire de taille 10x10, je me trouve sur la case à l’index 25. Par convention on va nommer les deux axes nord-sud et est-ouest, et on va dire que la case à l’index 0 (coordonnées (0;0)) est en haut à gauche. Sans même parler de conversion index=>coordonnées et vice-versa, on a:
- La case immédiatement à l’est est la case à l’index 25+1 = 26
- La case immédiatement à l’ouest est la case 25-1 = 24
- La case immédiatement au nord est la case 25-10 = 15
- Et finalement celle juste au sud est la 25+10 = 35
Et en bonus:
-
JE sais que la case 29 est sur le bord droit car 29%10==10-1
-
JE sais que la case 40 est sur le bord gauche car 40%10==0
-
Je sais que la case 7 est sur le bord u haut car 7/10==0
-
Je sais que 96 est sur le bord du bas car 96/10==10-1
Et maintenant pour mon terrain hexagonal ça donne quoi ? Vu que la réponse à ce problème découle du système de coordonnées choisi, je ne peux pas vraiment avoir d’idée… mais il faut que ça soit assez simple. Le but au final c’est quand même d’avoir un terrain où les pions se déplacent d’une case à l’autre sur les 3 axes.
Problème n°5: et si on recommençait ?
Eh oui, si on recommençait ? Parce que c’est aussi intéressant de se poser les mêmes questions pour un terrain fait de cases en forme de triangles équilatéraux par exemple; ou autre chose encore (qui est assez fou pour faire un jeu à plateau pentagonal, heptagonal ou décagonal si c’était possible ? pour les octogones je crois que ce n’est pas possible)
Conclusion
Merci pour vos réponses!