我正在尝试重构我的旧 Colorchess (ChessHighlight) 程序。这是一个旨在增强棋手在每回合中的影响力的棋盘,以帮助初学者理解游戏。
根据给定转弯时船上的压力平衡,瓷砖的颜色如下:
- 绿色 = 无压力
- 白色 = 白色玩家拥有该牌
- 黑色 = 黑色玩家拥有该牌
- 从渐变绿色-黄色-橙色-红色中挑选的颜色:此图块的冲突情况
AI 在项目中,但目前我专注于让这款游戏在两种情况下都能在设备上正确玩:平板电脑上的桌面游戏或网络游戏。
我决定用 javascript 编写客户端代码,我喜欢它!并且服务器同步将在 PHP 中,因为我的实际托管环境在下面。
当我尝试将所有内容放在一起时,我的问题就出现了:
(客户端库)-RequireJS--> 加载文件--KnockoutJS--> 绑定 UI 事件--ICanHaz--> 模板化--Zepto--> DOM 操作-也许还有用于实用程序的 underscoreJS
我担心制作意大利面条代码,难以理解和维护。
在旧程序 ChessHighlight 中,有很多交错的构造声明和原型扩展,例如:
// file board.js
function Board() { ... }
function Tile() { ... }
// next included file :
function Chessman() { ... }
// again in a third included file
// since board and chessmen are defined
Tile.prototype.put(chessman) { ... }
Tile.prototype.empty() { ... }
由于游戏的高度耦合性,堆栈中的每个文件包含的定义越来越多,代码变得杂乱无章......
一个困难是游戏需要事务性实现,因为我做了像这样的设置器:
// both... (think ACID commit in a RDBMS)
tile_h8.chessman = rook_white_1;
rook_white_1.tile = tile_h8;
现在我通过创建一个旨在存储的“对象关系池管理器”来部分解决这个问题:
- 引用任何类型的对象(棋盘、棋子、瓷砖、影响...)
- 对象之间的关系
- 以及明显的一些类型检查和基数/数量求和
(我此时正在烤代码)
一些问题 :
- 如何以定义基本代码原子的方式编写可扩展代码(优雅地,没有类和接口模拟,而是原型和闭包):Tile,Board,Chessman 在非常短的文件中,然后在另一部分中将它们粘合在一起:添加行为wirh回调?
注意:我尝试阅读游戏引擎代码(Crafty、Quintus...),但这些引擎的核心(1600 行代码)虽然有据可查,但很难理解(起点在哪里?运行时流程在哪里? ??)
UML:我觉得经典方法可能会因闭包、回调和嵌套范围而迅速失败,我似乎本能地编写和理解,但绘制拖动图似乎是一种技巧……优秀的 JS 开发人员使用什么作为安全绳爬上 1500+ 行代码高峰?
- 最后一个:我将有一个“类似 jquery”的引擎 API,可以轻松地将其插入 GUI 的 KnockOut ViewModels 的计算 observables 中。像这样的东西
[代码]
var colorchess = new Colorchess( my_VM_for_this_DIV_part );
colorchess.reset( "standard-game" );
colorchess("a1") --> a wrapper for "a1" tile
colorchess("h8").chessman() --> a wrapper for "h8" tile's chessman (rook)
// iterate on black chessman
colorchess("black").each( function( ref, chessman) {})
// a chainable example
colorchess("white").chessman("queen").influences()
[/代码]
...但目前,我不知道如何建模、编写和测试这些可变对象。
欢迎提出建议。感谢帮助。