Files
aibis-dream/Assets/Scripts/MiniGame/BlockPuzzle/Interface/IBlockPuzzleGameLogic.cs
T
2025-11-27 18:14:24 +08:00

140 lines
3.6 KiB
C#

using System;
namespace AibisDream
{
/// <summary>
/// 游戏状态
/// </summary>
public enum GameState
{
NotStarted, // 未开始
Playing, // 游戏中
Paused, // 暂停
GameOver // 游戏结束
}
/// <summary>
/// 游戏逻辑接口
/// 负责管理游戏的整体流程和状态
/// </summary>
public interface IBlockPuzzleGameLogic
{
/// <summary>
/// 当前游戏状态
/// </summary>
GameState CurrentState { get; }
/// <summary>
/// 当前分数(已放置的格子数量)
/// </summary>
int Score { get; }
/// <summary>
/// 当前选中的形状
/// </summary>
IBlockShape CurrentShape { get; }
/// <summary>
/// 网格系统
/// </summary>
IBlockPuzzleGrid Grid { get; }
/// <summary>
/// 放置验证器
/// </summary>
IPlacementValidator Validator { get; }
/// <summary>
/// 游戏开始事件
/// </summary>
event Action OnGameStart;
/// <summary>
/// 游戏结束事件
/// </summary>
event Action OnGameOver;
/// <summary>
/// 形状放置成功事件
/// </summary>
event Action<IBlockShape, int, int> OnShapePlaced;
/// <summary>
/// 形状放置失败事件
/// </summary>
event Action<IBlockShape, PlacementResult> OnShapePlaceFailed;
/// <summary>
/// 分数变化事件
/// </summary>
event Action<int> OnScoreChanged;
/// <summary>
/// 初始化游戏
/// </summary>
/// <param name="gridWidth">网格宽度</param>
/// <param name="gridHeight">网格高度</param>
void InitializeGame(int gridWidth, int gridHeight);
/// <summary>
/// 开始游戏
/// </summary>
void StartGame();
/// <summary>
/// 暂停游戏
/// </summary>
void PauseGame();
/// <summary>
/// 继续游戏
/// </summary>
void ResumeGame();
/// <summary>
/// 结束游戏
/// </summary>
void EndGame();
/// <summary>
/// 重置游戏
/// </summary>
void ResetGame();
/// <summary>
/// 选择形状
/// </summary>
/// <param name="shape">要选择的形状</param>
void SelectShape(IBlockShape shape);
/// <summary>
/// 尝试放置当前选中的形状到指定位置
/// </summary>
/// <param name="gridX">网格X坐标</param>
/// <param name="gridY">网格Y坐标</param>
/// <returns>是否放置成功</returns>
bool TryPlaceShape(int gridX, int gridY);
/// <summary>
/// 旋转当前选中的形状
/// </summary>
/// <param name="angle">旋转角度</param>
void RotateCurrentShape(RotationAngle angle);
/// <summary>
/// 检查是否还有可放置的形状
/// </summary>
/// <param name="availableShapes">可用的形状列表</param>
/// <returns>是否还有可放置的形状</returns>
bool HasPlaceableShapes(IBlockShape[] availableShapes);
/// <summary>
/// 获取下一个可用的形状
/// </summary>
/// <param name="shapePool">形状池</param>
/// <returns>下一个形状,如果没有则返回null</returns>
IBlockShape GetNextShape(IBlockShape[] shapePool);
}
}