/// <summary> /// フィールド内の移動を試みます /// </summary> /// <param name="commandType"></param> /// <returns>移動に成功したら true</returns> public bool TryMove(CommandTypes commandType) { if (!_directionTable.ContainsKey(commandType)) { return(false); } var direction = _directionTable[commandType]; var nextPosition = _map.PlayerPosition + direction; var nextField = _map.GetField(nextPosition); if (nextField == FieldTypes.Wall) { return(false); } if (nextField == FieldTypes.Space) { _commandManager.Do(new Command( () => _map.PlayerPosition += direction, () => _map.PlayerPosition -= direction)); return(true); } if (nextField == FieldTypes.Block) { var nextNextPosition = nextPosition + direction; if (_map.GetField(nextNextPosition) != FieldTypes.Space) { return(false); } _commandManager.Do(new Command( () => { _map.PlayerPosition += direction; _map.SetField(nextPosition, FieldTypes.Space); _map.SetField(nextNextPosition, FieldTypes.Block); }, () => { _map.PlayerPosition -= direction; _map.SetField(nextPosition, FieldTypes.Block); _map.SetField(nextNextPosition, FieldTypes.Space); })); return(true); } return(false); }
/// <summary> /// 表示用のフィールド種類を取得します /// </summary> /// <param name="map"></param> /// <param name="position"></param> /// <returns>表示用のフィールド種類</returns> FieldTypes GetDisplayFieldType(Map map, Point position) { var fieldType = position == map.PlayerPosition ? FieldTypes.Player : map.GetField(position); if (map.GoalPositions.Contains(position)) { fieldType = GetOnGoalFieldType(fieldType); } return(fieldType); }