问一个简单的设计问题

radiohead001 2010-04-09 10:23:43
一个地图类 MAP;
一个角色类 ROLE;
ROLE可以在MAP的范围内移动,希望在运行期可以动态的给地图添加角色,怎么样设置MAP和ROLE的关系呢?多谢!
...全文
194 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
radiohead001 2010-04-12
  • 打赏
  • 举报
回复
最后是这样做的:
Controller 类;
MAP 类;
ROLE 类。

ROLE 中有个指针指向 MAP,通过调用MAP 提供的一个函数来检查是否在其范围内。
Controller包括一个MAP指针,一个ROLE链表, 处理MAP和ROLE的相互关系。
lzali 2010-04-10
  • 打赏
  • 举报
回复
bang ding
radiohead001 2010-04-09
  • 打赏
  • 举报
回复
多谢各位,我再想想啊
qybao 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 radiohead001 的回复:]
多谢9L,我的主要问题是MAP和ROLE之间的关系。我第一反应是包含么,但感觉这样是不是耦合度太高了。地图只是一个很简单的平面坐标,ROLE可以在上面前后左右移动,输出的只是ROLE的位置坐标,连系比较简单。想请教一下能不能在ROLE做MOVE的时候传入一个地图对象的引用,这样两者关联度就不是那么高了。
[/Quote]
这样是可以的,这样ROLE里就不需要MAP属性了,也就是这个一对一关系可以去掉,然后在移动方法中加一个MAP参数
fengqieer1986 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 qybao 的回复:]
如果是在MAP中动态添加ROLE,那就是MAP中有个ROLE集合,即一对多
为了限制ROLE不超出MAP,ROLE对MAP可以是一对一,当然也可以不要这个关系
for example

Java code

class MAP {
private Set<ROLE> roleSet = new HashSet<ROLE>();
private int width; ……
[/Quote]
学习学习
liyoc 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 princess_rosie 的回复:]
持有对方引用就可以了.

Java code

class Role{
Map m=null;
}

class Map{
Role r=null;



这样在调用的时候直接引用对方,想怎么在自己的类里改用对方的方法什么的都可以.
[/Quote]

这样设计的话, 会给人误解, 因为这样本身就是 多对多了, role 可以包含多个map, map 可以包含多个role
qybao 2010-04-09
  • 打赏
  • 举报
回复
如果是在MAP中动态添加ROLE,那就是MAP中有个ROLE集合,即一对多
为了限制ROLE不超出MAP,ROLE对MAP可以是一对一,当然也可以不要这个关系
for example

class MAP {
private Set<ROLE> roleSet = new HashSet<ROLE>();
private int width; //地图宽
private int height; //地图高
MAP(int width, int height);
public int getWidth();
public int getHeight();
public void addRole(ROLE role);
public boolean removeRole(ROLE role);
....
}

class ROLE {
private MAP map; //这个属性看具体情况,可以不要
private int x; //x坐标
private int y; //y坐标 也可以用Point类来做位置属性
public int getX();
public int getY();
public setLocation(int x, int y); //移动到某个位置
...
}
princess_rosie 2010-04-09
  • 打赏
  • 举报
回复
持有对方引用就可以了.

class Role{
Map m=null;
}

class Map{
Role r=null;


这样在调用的时候直接引用对方,想怎么在自己的类里改用对方的方法什么的都可以.
liyoc 2010-04-09
  • 打赏
  • 举报
回复
如果不考虑扩展的话, 耦合度高点没关系

除非你的地图是很多变的, 那就使用工厂模式动态建立地图对象吧, 耦合度就低很多了, 不够低就可以使用抽象工厂定制地图的部件吧

不过我建议先实现,实现中会遇到许多新的问题点, 也有助于整体的把握, 耦合度可以放在后面考虑, 有了初步原型, 加几个接口还是很简单的
radiohead001 2010-04-09
  • 打赏
  • 举报
回复
多谢9L,我的主要问题是MAP和ROLE之间的关系。我第一反应是包含么,但感觉这样是不是耦合度太高了。地图只是一个很简单的平面坐标,ROLE可以在上面前后左右移动,输出的只是ROLE的位置坐标,连系比较简单。想请教一下能不能在ROLE做MOVE的时候传入一个地图对象的引用,这样两者关联度就不是那么高了。
romeo5431 2010-04-09
  • 打赏
  • 举报
回复
楼上的有道理
zoeg 2010-04-09
  • 打赏
  • 举报
回复
首先要考察确立这个角色所能够存在的目标的颗粒数;
如果是道路交通图,那就是每个交叉路口;
如果有网游,那就是地图上的任何一个没有障碍物的地方;
两种不同颗粒数要分别对待,如果是道路交通图,应该再追加一个交叉口的类:XO,MAP和ROLE之间使用XO类来关联,MAP中存储所有的XO实例,同时XO自描述相邻关系
比如XO.left();XO.right()等等.MAP用hasA的方式使用XO,表示自己的当前位置,移动时下一个目标必须从当前的XO中获得,这样才能限制其移动的连贯性.
如果是网游,你把数以百万计的空间点全部实例化,内存会不够的,应该用坐标系来处理!
MAP对象描述坐标系的可能算法,比如MAP.test(x,y)判断该坐标是否障碍物,是否可以作为目标移动;
要考虑的东西太多,你说的太少!
radiohead001 2010-04-09
  • 打赏
  • 举报
回复
回4L,多谢了,是我没说清楚,就是你说的AddRole()这样的,可以有0-N个ROLE,一对多而已。
liyoc 2010-04-09
  • 打赏
  • 举报
回复
一对多怎么实现呢?

public M(){
Role[] roles;
}

public Role(){
}
liyoc 2010-04-09
  • 打赏
  • 举报
回复
MAP与ROLE不采用包含关系?
可以, 那你就要一个公共类, 这个类里面包含 一个 map, 和一个role 数组 或者 list
radiohead001 2010-04-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 justwalking 的回复:]
map和role一对多
role添加坐标属性
[/Quote]
弱问一下,一对多怎么实现呢...
liyoc 2010-04-09
  • 打赏
  • 举报
回复
map 下面包含一个 role 数组或 list

运行期可以动态的给地图添加角色, 这句话没有很清晰
你的意思是每隔一段时间, 添加一个role 到 map 里面? 那就还是那句话 map 对 role 是一对多, 用 数组 或者 list 包含就可以了

map 里面有 add(Role role) 方法, 可以添加一个role进来

main 方法里面(运行时), 用 thread.sleep(3000);(这个来做延时), 然后调用 add 就行了

ROLE可以在MAP的范围内移动, 那就看你想怎么做了, 如果有个 move (int x, int y), 这样去定位在 map 中的位置就行了
radiohead001 2010-04-09
  • 打赏
  • 举报
回复
我也是这么想的么,那样MAP中是不是要有个链表维护当前的各个ROLE?
或者可不可以MAP与ROLE不采用包含关系?
justwalking 2010-04-09
  • 打赏
  • 举报
回复
map和role一对多
role添加坐标属性
romeo5431 2010-04-09
  • 打赏
  • 举报
回复
应该是坐标确定的Role再Map的位置。这个关系可以理解为Role属于Map?或者Map包含Role?

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧