Première étape de franchie pour TwiXNA !

TwiXNA avance correctement. J'ai plus ou moins terminé l'ensemble des classes qui me permettront de gérer une partie de jeu. Et pour tester le tout, j'ai mis en place une interface sommaire, en Winfoms, que vous pourrez télécharger à  la fin de ce billet.

Pour ce qui est de l'implémentation, j'ai trois classes principales : Board (plateau), Peg (Pilier) et Bridge (Pont). Avec ces trois classes, et principalement Board, je peux gérer une partie, avec le placement des pièces qui respecte le jeu de règles (pas de croisement de ponts, chaque joueur limité à  utiliser ses piliers, ...), et qui peut détecter la fin de la partie.

Le code suivant permet par exemple de commencer une partie, et de poser quelques piliers et un pont :

Board gameBoard = new Board(24); gameBoard.PlacePeg(4, 6, Player.TopBottom); gameBoard.PlacePeg(4, 5, Player.LeftRight); gameBoard.PlacePeg(5, 8, Player.TopBottom); gameBoard.PlaceBridge(gameBoard.Pegs[0], gameBoard.Pegs[2], player.TopBottom);

Tiens, je viens à  l'instant de voir qu'un PlaceBridge utilisant un paramètres les coordonnées des Piliers serait très utile. Enfin ... Je n'ai pas limité l'ordre de jeu, ni la taille du plateau, de façon à  obtenir un jeu "corruptible" facilement. Je pense également prévoir un moyen de sauvegarder / charger des parties, ou pourquoi pas des tableaux de jeu avec des situations difficiles dont il faut se sortir.

J'ai eu quelques soucis d'implémentation, dont j'ai réussi à  me sortir grâce à  mes différents tests. Pour commencer, j'avais mal exprimé la méthode de détection des croisements. Je vérifiais que les deux ponts ne partageaient pas de cases communes (c'est assez facile de trouver les 2 cases qu'occupe un pont). Seulement, quand deux ponts sont issus du même pilier (ce que je n'avais pas testé), et ben je considérais que les ponts se croisaient !

Il y a aussi les boucles qui sont apparues dans ma première version de la fonction récursive GetCompleteLine :

private List GetCompleteLine(Peg sourcePeg) List lsReturn = null; List lsConnected = null;

// Check if the peg is an ending one if (sourcePeg.IsEnding()) // Return the last peg in the list lsReturn = new List(); lsReturn.Add(sourcePeg); return lsReturn;
// Go through the pegs connected to the source lsConnected = sourcePeg.ConnectedPegs(); for (int i = 0; i < lsConnected.Count; i++) // Recursive call lsReturn = GetCompleteLine(lsConnected[i]); if (lsReturn != null) lsReturn.Add(sourcePeg); return lsReturn;
return lsReturn; // == null

Dans ce cas, la boucle ne quittera jamais le premier pont, faisant d'incessants allers-retours. En rajoutant une liste des piliers déjà  visités (et qui sont donc ignorés) en paramètres de cette fonction, tout est revenu en ordre.

Le code de ce projet sera placé sous licence GNU/GPL pour l'instant, et sans doute jusqu'à  la fin. Vous le trouverez sous la forme d'un projet Visual Studio Express 2008 à  la fin du billet.

Si vous souhaitez découvrir l'expérience assez pourrie que je vous propose à  base de Winforms, c'est aussi disponible. Je vous invite à  lire les règles du Twixt sur la page Wikipedia correspondante. C'est bon ? Alors, dans sa version Winforms, Twixt se joue en alternance entre le joueur Rouge et le joueur Bleu. Pour commencer, le joueur actif place son pilier, à  l'aide de coordonnées (A-X : 1-24). Si la case est invalide (occupée ou dans les zones extrêmes), le choix est refusé.

Une fois le pilier placé, on dispose de deux listes déroulantes qui affichent la liste des ponts que l'on peut enlever, et ceux qu'on peut rajouter. Les listes sont mises à  jour par rapport aux ajouts / retraits. On passe la main avec le bouton "End of Turn". Si un joueur gagne, un message l'indique, et pouf, c'est fini !

Winforms TwiXNA

Alors oui, j'aurais pu ajouter les coordonnées. Mais c'était pas si simple, et j'ai pas voulu rentrer dans des trucs même un peu complexes. La partie graphique sera en XNA, le Winforms n'étant là  que pour cette première étape. J'ai aussi volontairement oublié de coder la détection des parties mortes. J'y reviendrai après.

Prochaine étape : concevoir une IA, pas forcément performante, mais proposant un défi sympa même en test. Et qui pourra se confronter à  elle-même. Je vais faire en sorte de proposer une Interface (au sens C# du terme) pour offrir la possibilité à  d'autres de coder d'autres IA.

A la prochaine !


Contact