逻辑教学应用:玩家可以从逻辑门组装电路(电路)。我希望他能收集到某种锁链,然后将它们合二为一。
例如,我们组装一个由两个门(AND 和 NOT)组成的电路,并将其组合成一个 NAND 门:
在这种情况下,每个阀门可以有一个或多个输入(input)和一个或多个输出(outputs)。
我想不通怎么写这样的门类。这是我的想法:
创建委托:'委托列表 GateFunction(List)'
门类包含一个“GateFunction func”字段,该字段定义将输入转换为输出的函数。
门类包含一个“List _inputs”数组,该数组包含对连接到此门的输入的先前门的输出的引用。
一个阀门可以有多个输出是非常重要的,一个阀门的不同输出可以转到不同的阀门。
我需要这样一种体系结构,该类的每个实例都存储一个对基本函数进行操作的 SPECIFIC func 函数。
最主要的是,在运行时,用户将构建并保存他自己的、新的、自定义的阀门,包括以前创建的(或基本的:和/或/不)。
我将不胜感激一般建议和代码。也许我错过了一些方便的明显模式......
想法和截图来自 Sebastian Lague 视频 ( https://youtu.be/QZwneRb-zqA )。它完美地展示了我需要 4 到 5 分钟的时间。
UPD:解释示例。场上的玩家可以从可用的方块中收集左边的方案,点击“创建”按钮,得到右边对应的方块。同时可以看到,左边的所有功能都打开了,也就是可以连接到原来的联系人(屏幕左边第一个截图)。使用鼠标按钮打开和关闭这些联系人。也就是说,这些触点不包含在阀门本身中。因此,有必要能够告诉完成的、组装好的阀门其输入端连接到哪些触点。
UPD2:通过单击“创建”按钮,阀门应保存到菜单中,以便以后可以从那里获取和使用:
你的
BoolValve
应该包含BoolChain
可以是任何东西。例如,同一个[False]
门将包含new NotChain(new TrueChain())
"Not(True)"
. 加一个prototype来复制整个链条Clone()
,如果加任何flagIsSelected
,就可以限制复制CloneSelected()
,放到一个新的BoolValve
,不管是什么。不是 Unity 程序员,但考虑到块必须支持从 GUI 更改的能力,在普通 C# 中可以这样实现。
信号发生器:
阀门:
具有多个输入的阀门:
带 1 个入口的阀门:
Класс
SingleInputGate
создан для удобного взаимодействия (например, позволяет писатьgate.InputGenerator
вместоgate.InputGenerators[0]
).Пользовательский вентиль:
Тут сразу стоит пояснить, что весь сакральный смысл состоит в том, что каждый вход и выход пользовательского вентиля тоже является вентилем (DirectGate). Благодаря этому мы можем сделать связи как на картинке:
Как видно из картинки, мы подключаем генератор (GEN) не напрямую к какому-то из внутренних вентелей (AND/NOT), а к входным вентилям (0/1), которые потом подключаются к внутренним (AND/NOT). Аналогично с выходом (R)
Пример из картинки в виде кода:
Протестировать онлайн можно тут.
СОХРАНЕНИЕ
Я не реализовывал сериализацию, но я думаю она вполне возможна с моим кодом. Я это вижу так:
Guid
将其唯一 ID 存储在模式中ILogicGate
我们需要制作一个转换器,将其所有输入转换为数组Guid
,反之亦然。为了使反序列化工作,您需要将列表更改IReadOnlyList<ISignalGenerator> InputGenerators
为可变的。理想情况下,您应该制作自己的列表,以便您可以安全地更改值并检查null
.我正在用伪代码编写。夏普已经忘记了)
好吧,或者给自己修一家工厂,该工厂将发布具有必要设置的阀门