首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将if语句存储为字符串?C#

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

Stack Overflow用户
提问于 2017-02-28 04:30:35
回答 1查看 879关注 0票数 0

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

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

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

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

示例:

事件名称: event1

触发器:'ChestOpened','PlayerDigs‘

条件:玩家位置在1,1 (2D游戏)。

动作:给玩家10金。

现在,我让扳机检查和动作起作用。现在我所要做的就是增加条件。以下是我的困境:

在存储映射时,需要一种方法将条件存储在事件的条件文件中。我在想这个文件会包含这样的内容:‘playerPosition(1,1)’,但这是非常广泛的,变量'playerPosition‘可能不存在,我不得不解析它奇怪。

问题:如何将conparisions (条件、if语句)存储在映射文件(String)中?

更多信息:地图是存储在游戏可执行文件旁边的地图存储文件夹中的目录。在map文件夹中,有一个事件文件夹。在events文件夹中,每个事件都有一个文件夹。在每个事件文件夹中都有一个触发器文件、一个条件文件和一个操作文件。触发器和操作现在都起作用了,但是条件是我想要添加的。

档案结构:

代码语言:javascript
复制
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#编写文件。我知道这个。

我想问的是:

代码语言:javascript
复制
if (playerPosition == new Point(0, 0)) { }

转换成一个文本文件,我将解析并存储在一个变量中?如何将If语句存储在变量中,以及如何将该变量存储在文件中?

解决方案:

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web.Script.Serialization;
using System.Windows.Forms;

namespace Entropy
{
    public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();

            a b = new a { s = ":D" };

            string json = new JavaScriptSerializer().Serialize(b);

            Dictionary<string, object> c = (Dictionary<string, object>)new       JavaScriptSerializer().DeserializeObject(json);
            MessageBox.Show(c["s"].ToString());
            //Out: ':D'
         }
    }

    public class a
    {
        public string s = string.Empty;
    }
}
EN

Stack Overflow用户

回答已采纳

发布于 2017-02-28 05:52:31

将比较存储在字符串中,然后将它们转换为代码.这叫做编写编译器!计算机科学支持这一点!

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

您的迷你语言是非常迷你的:它只有谓词(可能是嵌套谓词)

您可以查看C#编译器解析器/生成器。你的阅读很有趣。

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

所以你可能

代码语言:javascript
复制
var condition = new Condition { 
    Object = Objects.Player, 
    Comparison = Comparisons.Equals, 
    Value = new Value { type = Position, innerValue = "2,1" }
};

然后你把它序列化成一个可以保存的字符串..。

代码语言:javascript
复制
var json = new JavaScriptSerializer().Serialize(obj);

然后,通过将json反序列化回一个对象,您可以在稍后再次加载它。

有一些对比较对象调用的“评估”方法,它会破坏对象层次结构,为您计算一个答案。

我以前做过这样的事情,用脚本语言代替Lua,Lua在游戏中很受欢迎,但是Python对互操作性也很好。

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42500259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档