C# 如何将if语句存储为字符串?C

C# 如何将if语句存储为字符串?C,c#,game-engine,C#,Game Engine,我正在使用OpenTK和OpenGL用C创建一个游戏引擎。我的游戏的更新系统是在事件队列中工作的,在事件队列中,当发生什么事情时,它会被添加到事件队列中。每个事件都有一组触发器和一组操作 假设玩家走路。“PlayerWalked”触发器运行。游戏中列表中带有“PlayerWalked”触发器的每个事件都会添加到队列中 现在,游戏上的更新函数每秒调用几次。每次调用它时,都会运行队列中最早的事件。事件的操作列表中的每个操作都将运行 现在,我想添加一个条件系统。在触发器“PlayerWalked”上,

我正在使用OpenTK和OpenGL用C创建一个游戏引擎。我的游戏的更新系统是在事件队列中工作的,在事件队列中,当发生什么事情时,它会被添加到事件队列中。每个事件都有一组触发器和一组操作

假设玩家走路。“PlayerWalked”触发器运行。游戏中列表中带有“PlayerWalked”触发器的每个事件都会添加到队列中

现在,游戏上的更新函数每秒调用几次。每次调用它时,都会运行队列中最早的事件。事件的操作列表中的每个操作都将运行

现在,我想添加一个条件系统。在触发器“PlayerWalked”上,它检查触发器,检查条件,然后将其添加到队列中,而不仅仅是将其添加到列表中

例如:

事件 名称:event1 触发器:'ChestOpened','PlayerDigs' 条件:玩家位置为1,1 2D游戏。 行动:给玩家10金币

现在,我有了触发器检查和动作。现在我只需要添加条件。我的困境是:

在存储映射时,我需要一种将条件存储在事件的条件文件中的方法。我在想文件会包含以下内容: “玩家位置| 1,1” 但这是非常广泛的,变量“playerPosition”可能不存在,我必须解析它

问题:如果语句位于映射文件字符串中,我将如何存储划分条件

更多信息: 地图是一个目录,存储在游戏可执行文件旁边的地图存储文件夹中。在映射文件夹中,有一个用于事件的文件夹。在“事件”文件夹中,每个事件都有一个文件夹。在每个事件文件夹中都有一个触发器文件、一个条件文件和一个操作文件。触发器和操作现在正在工作,但条件就是我要添加的

文件结构:

Maps (Directory)
    Map1 (Directory)
        Events (Directory)
            Event1 (Directory)
                Triggers (File)
                Conditions (File)
                Actions (File)
            Event2 (Directory)
                Triggers (File)
                Conditions (File)
                Actions (File)
            Event3 (Directory)
                Triggers (File)
                Conditions (File)
                Actions (File)
我使用OpenTK作为OpenGL的包装器,但还没有声音引擎。这是一款2D RPG游戏

编辑:有人提醒我,好像我在问如何用C写一个文件。我知道。 我想问的是:你会怎么做

if (playerPosition == new Point(0, 0)) { }
翻译成一个文本文件,我将解析并存储在变量中?如何将If语句存储在变量中,如何将该变量存储在文件中

解决:


将比较存储在字符串中,然后将其转换为代码。。。。这就是所谓的编写编译器!计算机科学支持你

所以你会问,对于我的领域特定语言,我能做的最简单的编译器是什么

你们知道,迷你语言是非常迷你的:它只有谓词,可能是嵌套的谓词

您可以查看C编译器解析器/生成器。你前面还有一些有趣的阅读

或者,您可以创建一个包含这些嵌套谓词的类结构,然后将它们序列化为json,并存储json

所以你可能有

var condition = new Condition { 
    Object = Objects.Player, 
    Comparison = Comparisons.Equals, 
    Value = new Value { type = Position, innerValue = "2,1" }
};
然后将其序列化为可以保存的字符串

var json = new JavaScriptSerializer().Serialize(obj);
然后,您可以稍后通过将json反序列化回一个对象来再次加载它

在比较对象上调用了一些“Evaluate”方法,它会遍历对象层次结构,为您计算答案


我在过去做过类似的事情,而不是引用脚本语言,Lua在游戏中这种类型的活动很流行,但Python也有利于互操作性。

创建类似于公共类PlayerPositionCondition的东西,并创建一个方法public bool,使其中的if逻辑得到满足,怎么样?因此,与其将if语句存储在某个地方,不如只存储要通过反射实例化的类名,或者稍后可以使用一些代码使用FactoryMethod模式实例化适当的类?您将为每个条件创建一个类,并可能将参数传递给该类……好吧,将有很多比较。PlayerLocation、PlayerHasInventoryItem、GameIsOver、GameHasStarted等,可能有数百个。现在,我可以为所有这些使用枚举。梅比…谢谢你!这正是我要找的!看看这个类似的问题:谢谢!我没有真正使用LINQ,所以我对它不是很熟悉。
var json = new JavaScriptSerializer().Serialize(obj);