我试图了解如何以面向对象的方式进行设计和思考,并希望从社区获得有关此主题的一些反馈.以下是我希望以OO方式设计的国际象棋游戏的示例.这是一个非常广泛的设计,我在这个阶段的重点只是确定谁负责什么消息以及对象如何相互交互来模拟游戏.请指出是否有不良设计元素(高耦合,内聚力差等)以及如何改进它们.
国际象棋游戏有以下几类
董事会由正方形组成,因此董事会可以负责创建和管理Square对象.每件作品也都放在一个正方形上,因此每件作品都可以参考它所在的正方形.(这有意义吗?).然后每件作品都有责任将自己从一个方格移动到另一个方格.Player类拥有对他拥有的所有作品的引用,并且还负责创建它们(玩家应该创建Pieces吗?).播放器有一个方法takeTurn,后者又调用一个方法movePiece,它属于片段Class,它将片段的位置从当前位置改变到另一个位置.现在我对Board类必须负责的内容感到困惑.我认为需要确定游戏的当前状态并知道游戏何时结束.但当一件作品发生变化时 位置如何更新电路板?它应该保持一个单独的正方形数组,其中存在碎片并随着碎片的移动而得到更新吗?
此外,ChessGame最初创建棋盘和玩家对象,他们分别创建正方形和棋子并开始模拟.简而言之,这可能是ChessGame中的代码可能是什么样子
Player p1 =new Player();
Player p2 = new Player();
Board b = new Board();
while(b.isGameOver())
{
p1.takeTurn(); // calls movePiece on the Piece object
p2.takeTurn();
}
Run Code Online (Sandbox Code Playgroud)
我不清楚董事会的状态将如何更新.应该是否有参考板?责任在哪里?谁持有什么参考?请帮助我提供您的输入并指出此设计中的问题.我故意不关注任何算法或游戏的进一步细节,因为我只对设计方面感兴趣.我希望这个社区可以提供有价值的见解.
我遇到了以下问题.
给定n个元素的数组和整数k,其中k < n.元素{ a 0 ... a k }和{ a k +1 ... a n }已经排序.给出一个算法在O(n)时间和O(1)空间中排序.
在我看来,它不能在O(n)时间和O(1)空间中完成.问题实际上似乎是询问如何进行mergesort的合并步骤,而不是就地.如果有可能,那么不会以这种方式实现mergesort吗?我无法说服自己,但需要一些意见.
我编写了以下代码,用于从inorder和preorder遍历构造树.它看起来对我来说是正确的,但它产生的最终树不具有与它构建的输出相同的顺序输出.任何人都可以帮我找到这个功能的缺陷吗?
public btree makeTree(int[] preorder, int[] inorder, int left,int right)
{
if(left > right)
return null;
if(preIndex >= preorder.length)
return null;
btree tree = new btree(preorder[preIndex]);
preIndex++;
int i=0;
for(i=left; i<= right;i++)
{
if(inorder[i]==tree.value)
break;
}
tree.left = makeTree(preorder, inorder,left, i-1);
tree.right = makeTree(preorder, inorder,i+1, right );
return tree;
}
Run Code Online (Sandbox Code Playgroud)
注意:preIndex是在函数外声明的静态.