2

我正在编写一个 Hubnet 应用程序,我希望每个客户端的视图都依赖于我可以看到的那个客户端的变量 turtles 中的海龟。特别是我想向她隐藏所有不在客户 turtlesIcansee 中的海龟。

通过选中 Hubnet-control Center 中的“客户端上的镜像 2D 视图”框并添加以下代码,我已设法使其工作

ask turtles[hubnet-send-override [user-id] of self turtles "hidden?" [true]]
ask turtles[hubnet-send-override [user-id] of self [turtlesicansee] of self "hidden?" [false]]

尽管目前这似乎可行,但我对代码有两个问题:

1)如果我可以在第二行取turtlesicansee的补码(并将false切换为true),第一行是多余的。有没有办法做到这一点,有效地说我想隐藏所有不在 turtlesicansee 中的海龟?

2)我不确定第二个陈述中的量化。我想告诉每只海龟(客户),她能看到的唯一海龟是她的 turtlesicansee 中的海龟。这是我得到的吗?让我感到困惑的部分原因是我要求海龟发送覆盖消息,但我真的不明白为什么消息来自哪个海龟很重要(但我还没有弄清楚如何在没有问海龟命令)

无论如何,任何人都可以帮助我吗?

4

1 回答 1

2

关于第一行的补充和必要性(告诉每个客户隐藏所有海龟)

首先,我假设... 1)模型中的每个海龟都与一个 hubnet 客户端(学生)相关联 2)模型中没有其他海龟或海龟种类。3) 代理集“turtlesicansee”是一个随时间变化的海龟变量

鉴于这些假设,获得turtlesicansee 补集的一种方法是

let onesicantsee turtles with [ not member? self turtlesicansee ] 

这将创建一个带有turtlesicansee 补码的临时变量。

因此,您可以通过以下方式以更少的冗余来执行您的两个命令:

ask turtles[
  let onesicantsee turtles with [ not member? self turtlesicansee ]
  hubnet-send-override user-id   turtlesicansee   "hidden?" [false] 
  hubnet-send-override user-id   onesicantsee     "hidden?" [true]
]

但是,在客户端上设置覆盖(至少在我对事物的理解/心理模型中)并不昂贵。它实际上并不会导致某些事情发生,它会在下一次显示更新时设置一个“过滤器”。因此,您的原始代码还不错。您需要为所有海龟操作过滤器的行为,而且您的方法实际上可能比我在这里写的更快。

关于 HubNet 命令的“逻辑”问题,以及您的“让我感到困惑的部分......”说明。我同意,这很奇怪。“hubnet-send-override”命令可以在 ask-turtles 块之外发出。但是在这种情况下(并且在大多数情况下),您需要通过使用他们的用户 ID 和他们的 turtlesicansee 变量来个性化每个海龟(学生)的“过滤器”。因此,在 ask turtles 中执行命令会依次将这些变量的范围设置给每个学生。[那有意义吗?]

于 2014-02-08T02:06:01.857 回答