本节概要
- 重构游戏的现有引擎结构
- 规划游戏的 Flutter 层与原生引擎之间的接口
- 提前解决启用开局库的问题
- 实现 Flutter 层面的引擎封装
「单机对战」和「挑战云主机」两种游戏模式都是处理人机对弈的场景。我们计划在两种场景使用相同的 BattlePage 页面,仅配置不同的 AI 引擎。
调整引擎组织方式
我们之前已经存在 CloudEngine 了,它和本地引擎将有一些不同的实现方式,但却有一些相同的对外接口。对此,我们做一个面向对象的抽象思考,以便让 BattlePage 页面可以使用多态方式调用不同的引擎。
在 lib/engine 文件夹下,我们新建一个 engine.dart 文件,在其中实现一个抽象的 AiEngine 引擎类,并且将 EngineResponse 类从 CloudEngine 中移到此文件中来 — 显然 EngineResponse 是不同引擎公用的:
/// 引擎查询结果包裹
/// type 为 move 时表示正常结果反馈,value 用于携带结果值
/// type 其它可能值至少包含:timeout / nobestmove / network-error / data-error
class EngineResponse {
final String type;
final dynamic value;
EngineResponse(this.type, {this.value});
}
abstract class AiEngine {
// 启动引擎
Future&