Skip to content

完整示例

基于官方示例 Library/Module/Example/ExampleGameModule.csExampleSkill.csExampleItem.cs)。

创建自定义游戏模式

混战模式(Mix)

csharp
using FunGame.Core.Entity;
using FunGame.Core.Model.Framework;
using FunGame.Core.Model.Queue;

// 准备角色列表(角色通过继承 Character 定义,见《自定义角色》)
List<Character> characters = [player, enemy1, enemy2, enemy3];

// 创建混战队列
MixGamingQueue queue = new(characters, Console.WriteLine)
{
    GameplayEquilibriumConstant = new EquilibriumConstant(),
    IsDebug = true
};

// 加载地图(可选)
// queue.LoadGameMap(myMap);

// 初始化
queue.InitActionQueue();
queue.SetCharactersToAIControl(cancel: false, characters);

团队模式(Team)

csharp
using FunGame.Core.Entity;
using FunGame.Core.Model.Framework;
using FunGame.Core.Model.Queue;

// 创建团队队列
TeamGamingQueue queue = new(Console.WriteLine)
{
    GameplayEquilibriumConstant = new EquilibriumConstant()
};

// 添加团队
queue.AddTeam("红队", [player1, player2, player3]);
queue.AddTeam("蓝队", [enemy1, enemy2, enemy3]);

// 初始化角色
queue.InitCharacters(allCharacters);
queue.InitActionQueue();

自定义继承

默认的队友判定基于召唤物(Master)关系;团队模式基于队伍。如需自定义规则,重写 GetTeammatesGetEnemies 内部会调用它):

csharp
public class MyGameMode : GamingQueue
{
    public MyGameMode(Action<string> writer) : base(writer) { }

    // 重写队友判定逻辑(例如:与角色同 Master 的角色视为队友)
    public override List<Character> GetTeammates(Character character)
        => AllCharacters
            .Where(c => c != character && IsSameFactionAs(c, character))
            .ToList();
}

完整的游戏循环

csharp
double totalTime = 0;
int round = 1;

while (round < 999)
{
    // 获取下一个可行动的角色(硬直时间归零)
    Character? actor = queue.NextCharacter();

    if (actor != null)
    {
        Console.WriteLine($"=== 回合 {round++} ===");

        // ProcessTurn 内部会触发所有事件
        bool isGameEnd = queue.ProcessTurn(actor);
        if (isGameEnd) break;

        queue.DisplayQueue();
    }

    // 时间流逝 → 硬直时间衰退
    totalTime += queue.TimeLapse();
}

Console.WriteLine($"总游戏时长:{totalTime:0.##}");

手动控制(玩家决策)需把事件绑定到 UI,见 事件绑定与游戏循环


调整游戏平衡

通过 EquilibriumConstant 定制数值(FunGame.Core.Model.Framework):

csharp
var eq = new EquilibriumConstant
{
    InitialHP = 100,
    InitialATK = 20,
    InitialDEF = 8,
    MaxLevel = 60,
    CritRate = 0.08,          // 8% 初始暴击
    CritDMG = 1.5,            // 150% 暴击伤害
    SPDUpperLimit = 2000,     // 速度上限
    MaxEP = 200,              // 最大爆发能量
    InGameCurrency = "金币",
    InGameTime = "秒",
};

var queue = new MixGamingQueue(characters, Console.WriteLine)
{
    GameplayEquilibriumConstant = eq
};

赛后统计

csharp
// GamingQueue 自动记录了所有统计数据(CharacterStatistics)
foreach (Character character in queue.CharacterStatistics
    .OrderByDescending(d => d.Value.Rating).Select(d => d.Key))
{
    CharacterStatistics stats = queue.CharacterStatistics[character];
    Console.WriteLine($"[ {character} ]");
    Console.WriteLine($"技术得分:{stats.Rating:0.0#}");
    Console.WriteLine($"击杀:{stats.Kills} / 助攻:{stats.Assists}");
    Console.WriteLine($"总计伤害:{stats.TotalDamage:0.##}");
    Console.WriteLine($"每秒伤害:{stats.DamagePerSecond:0.##}");
}

即时外发

游戏过程中的数据可以实时外发到专用服务器(观战/回放):

csharp
using FunGame.Core.Api;
using FunGame.Core.Model.Queue;

DefaultRoundRecordSink sink = new("https://example.com/api/round",
[
    RoundRecordSinkEventIds.Action,
    RoundRecordSinkEventIds.Round,
    RoundRecordSinkEventIds.CheckpointRound,
    RoundRecordSinkEventIds.CharacterStatistics,
    RoundRecordSinkEventIds.Characters,
    RoundRecordSinkEventIds.QueueData,
    RoundRecordSinkEventIds.EliminatedCharacters,
]);

MixGamingQueue queue = new(characters, Console.WriteLine)
{
    GameplayEquilibriumConstant = eq,
    RoundRecordSink = sink
};

详见 即时外发功能


下一步

基于 LGPL-3.0 许可证发布