private Direction GetMoveDirection(ActionType actionType)
		{
			Direction direction = 0;

			switch (actionType.Name)
			{
				case DefaultActionTypes.Up:
					direction = Direction.Up;
					break;

				case DefaultActionTypes.Down:
					direction = Direction.Down;
					break;

				case DefaultActionTypes.Left:
					direction = Direction.Left;
					break;

				case DefaultActionTypes.Right:
					direction = Direction.Right;
					break;
			}

			return direction;
		}
		protected override ActionType GetUndoActionType(ActionType actionType)
		{
			ActionType undoActionType;

			switch (actionType.Name)
			{
				case DefaultActionTypes.Up:
					undoActionType = ActionType.Get(DefaultActionTypes.Down);
					break;

				case DefaultActionTypes.Down:
					undoActionType = ActionType.Get(DefaultActionTypes.Up);
					break;

				case DefaultActionTypes.Left:
					undoActionType = ActionType.Get(DefaultActionTypes.Right);
					break;

				case DefaultActionTypes.Right:
					undoActionType = ActionType.Get(DefaultActionTypes.Left);
					break;

				default:
					undoActionType = ActionType.Get(DefaultActionTypes.Unmapped);
					break;
			}

			return undoActionType;
		}
		public void Execute(ActionType actionType)
		{
			this._gameEngine.FieldInvalidate();

			switch (actionType.Name)
			{
				case DefaultActionTypes.Up:
				case DefaultActionTypes.Down:
				case DefaultActionTypes.Left:
				case DefaultActionTypes.Right:
					var direction = this.GetMoveDirection(actionType);

					if (this._gameEngine.Move(direction))
					{
						this._gameEngine.FieldInvalidate();
					}
					else
					{
						this._gameEngine.IllegalMove();
					}

					this._gameEngine.Player.Score++;
					break;

				case DefaultActionTypes.Exit:
					this._gameEngine.Exit();
					break;

				case DefaultActionTypes.Reset:
					this._gameEngine.StartGame();
					break;

				case DefaultActionTypes.Scores:
					this._gameEngine.ShowScore();
					break;

				case DefaultActionTypes.Unmapped:
				default:
					this._gameEngine.IllegalCommand();
					break;
			}
		}
		/// <summary>
		/// Indicates whether this instance and a specified object are equal.
		/// </summary>
		/// <param name="other">The action type to compare to this object.</param>
		/// <returns>
		/// true if <paramref name="obj" /> and this instance are the same type and represent the same
		/// value; otherwise, false.
		/// </returns>
		public bool Equals(ActionType other)
		{
			return string.Equals(this.Name, other.Name);
		}
		public GameAction(ActionType actionType, IActionReceiver actionReceiver)
		{
			this.ActionReceiver = actionReceiver;
			this.ActionType = actionType;
		}
		protected virtual ActionType GetUndoActionType(ActionType actionType)
		{
			return ActionType.Get("Unmapped");
		}
		public virtual IGameAction GetAction(ActionType actionType, IActionReceiver actionReceiver)
		{
			var action = new KeyValuePair<ActionType, IActionReceiver>(actionType, actionReceiver);
			return _ActionsCache.GetOrAdd(action, this.CreateAction);
		}
		public DefaultGameAction(ActionType actionType, IActionReceiver actionReceiver)
			: base(actionType, actionReceiver)
		{
		}