日期:2014-05-16  浏览次数:20402 次

对象间的(通信 ,串联)网络的构思 !(口述题,不用动脑子)
前言:
  我们在做棋类游戏时,有一个对象间串接的问题。
  可能是我在构思和设计时出现的问题。
构思:
  每个棋子是一个单独的对象,它的属性有:
  谁的棋(黑 OR 白 OR...)[枚举],
  值(如象棋中的“将or 仕or 马or...”)[枚举],
  当前座标,如(1,5)[point obj],
  可走点()array 的[point obj],

棋盘也是一个对象:
  它是一个二维数组。

问题:
  现在棋子走了一步。 棋子对象内的属性会自动改变,
  但棋盘也要跟上那个改变。(因为我们要读取[棋盘]中的每个座标,来决定,棋子的可走点。)
  我不想让,每走下步,棋盘对象都要编历所有[棋子对象],来确定棋盘。

请问:
 如何构思,设计才会让编码做得更高效,简洁,易懂呢?



------解决方案--------------------
可走点() 做成一个Function , 通过棋子坐在坐标,返回可走坐标。

如 :

function 可走点(){
var r = [];
r.push([this.坐标.x + 3,this.坐标.x + 1])
r.push([this.坐标.x + 2,this.坐标.x + 2])
return r
}
------解决方案--------------------
不太了解下棋的算法,基于面向对象的设计原则,提出一些设想,供 LZ 参考:
棋盘作为基本对象,提供对所有棋子的访问和操作方法,具体实现时可能不一定由棋盘对象完全实现,而是适当调用棋子对象相对应的方法,此为封装设计;
棋子当然也应当设计为对象,但 LZ 的设计试乎想保留一些冗余(如 #1 所诉),从设计逻辑的复杂性来说,如不是为性能考虑应当避免此类冗余。
至于说遍历的效率问题,作为棋盘这样大小的一个数组,其实是非常小的。如果不是算法设计有问题,远没有到要考虑遍历的效率的程度。如果 LZ 认为有必要考虑,可以参考数据库管理的模式,为要反复计算的结果建立索引,在发生相应操作时,实时更新索引中的值。但索引的设计一定要合理,否则可能更新索引付出的代价更大。