Desarrollando un juego de mesa - Hex

Estoy comenzando a desarrollar un juego de mesa con Mono C#, y decidí hacer Hex, que me parece sumamente interesante. La idea es, usando TDD, ir construyendo el juego, y la posibilidad de jugarse de a dos personas (la primer versión), o contra la máquina (una segunda versión).

Comienzo creando la solución con los proyectos (BoardGame.Hex: el core del juego; BoardGame.Hex.UnitTest: los test de unidad. La capa de presentación queda para más adelante).

Como corresponde a TDD, comienzo creando un test, que, como es un juego de mesa, arranco por el tablero. Como Hex puede tener diferentes tamaños de tablero, arranco con algo estándar, el de 11x11. Esa es la primer prueba.

using BoardGame.Hex;
using NUnit.Framework;
namespace BoardGame.Hex.UnitTest
{
	[TestFixture()]
	public class BoardTest {
		[Test()]
		public void CreateDefaultBoard () {
			BoardHex boardHex = new BoardHex();
			
			Assert.IsNotNull(boardHex);
			Assert.AreEqual(11, boardHex.Size);
		}
	}
}

Obviamente, al intentar compilar, como todavía no existe BoardHex, no funciona, así que creo las clases que necesitamos y escribiendo el código para que pase nuestro test. La clase BoardHex queda así:

using System;
namespace BoardGame.Hex
{
	public class BoardHex
	{
		public int Size {
			get;
			private set;
		}
		
		public BoardHex () {
			this.Size = 11;
		}
	}
}

Bien, de acá en más, la construcción del proyecto sigue... creo diferentes tableros de diferentes tamaños. Veo que un tablero de menos de 5x5 no es interesante de jugar (por lo menos, pensandolo en el aire), así que especifico un tamaño mínimo de tablero. Luego, arrancamos con el juego... lo básico, iniciar el juego pudiendo especificar el tablero a utilizar, y los jugadores, o dejando que al iniciar el sistema genere todo automáticamente. El juego (la clase GameHex) posee propiedades para acceder al tablero y a los jugadores. De acá, armo test para verificar que los movimientos sean válidos... un test llamado TurnTest valida que inicie el juego el jugador Negro, que después de que un jugador mueva le toque el turno al otro y que no se puedan hacer movimientos inválidos (que juegue 2 veces seguidas el mismo jugador, o que se coloque una ficha en un casillero ocupado, etc).

Dejo el código adjunto a este post, por si alguien lo quiere ir viendo. Quizás mas adelante, lo suba a un repositorio de código, depende de como vaya evolucionando.

Actualización: Repositorio de Hex-Board Game Actualización 12-05-2011: Se movió el repositorio a Assembla.