// (c) 2005 kp@kp73.com
using System;
namespace KP.Tetris{
/// <summary>
/// Returns a psudeo random tetramino instance.
/// </summary>
internal class TetraminoFactory
{
/// <summary>
/// Psudo random number generator.
/// </summary>
private Random randomGenerator;
/// <summary>
/// Factory singleton instance.
/// </summary>
private static TetraminoFactory m_instance;
/// <summary>
/// Collection of tetramino instances.
/// </summary>
private Tetramino[] pieceStore = new Tetramino[7];
/// <summary>
/// Construct an instance of the factory.
/// </summary>
private TetraminoFactory() // prevent instance creation outside this class
{
// populate the store
pieceStore[0] = new Tetraminos.O();
pieceStore[1] = new Tetraminos.I();
pieceStore[2] = new Tetraminos.S();
pieceStore[3] = new Tetraminos.Z();
pieceStore[4] = new Tetraminos.L();
pieceStore[5] = new Tetraminos.J();
pieceStore[6] = new Tetraminos.T();
pieceStore[0].Initialise();
pieceStore[1].Initialise();
pieceStore[2].Initialise();
pieceStore[3].Initialise();
pieceStore[4].Initialise();
pieceStore[5].Initialise();
pieceStore[6].Initialise();
}
/// <summary>
/// Creates the singleton instance if necessary.
/// </summary>
private static void CheckInstance()
{
lock (typeof(TetraminoFactory))
{
if (m_instance == null) m_instance = new TetraminoFactory();
}
}
/// <summary>
/// Get the random number generator instance.
/// </summary>
internal Random Rand
{
get { return randomGenerator; }
}
/// <summary>
/// Provides a staring value for the random number generator instance.
/// </summary>
internal static void SeedRandom()
{
CheckInstance();
string tickText = System.Environment.TickCount.ToString();
int seed = int.Parse(tickText.Substring(tickText.Length - 4));
m_instance.randomGenerator = new Random(seed);
}
/// <summary>
/// Get a new tetramino instance.
/// </summary>
internal static Tetramino NewTetramino
{
get
{
CheckInstance();
return (Tetramino)m_instance.GetNew();
}
}
/// <summary>
/// Selects and returns random tetramino instance from the store.
/// </summary>
/// <returns>Random tetramino instance from the store</returns>
private Tetramino GetNew()
{
int pieceNumber = this.Rand.Next(0, 7);
return pieceStore[pieceNumber];
}
} // class TetraminoFactory
} // namespace KP.Tetris
|