Используйте и анализируйте текстовый файл в C #, чтобы инициализировать компонентную модель игры. - PullRequest
4 голосов
/ 15 июля 2010

У меня есть текстовый файл, который должен инициализировать мои объекты, построенные вокруг модели на основе компонентов, я впервые пытаюсь использовать подход, основанный на данных, и я не уверен, что я иду в правильном направлении здесь.

Файл, который я сейчас имею в виду, выглядит следующим образом

EliteGoblin.txt

@Goblin.txt


[general]
hp += 20
strength = 12
description = "A big menacing goblin"
tacticModifier +=  1.3

[skills]
fireball

Где символ @ указывает, какие другие файлы нужно проанализировать в этот момент.имена в [] соответствуют классам компонентов в коде, а под ними - как их настроить

Например, hp += 20 увеличит значение, взятое из goblin.txt, и увеличит его на 20 и т. д.

У меня вопрос: как мне разобрать этот файл, есть ли какой-то синтаксический анализатор, встроенный в C #?

Могу ли я изменить формат моего документа, чтобы он соответствовал уже определенному формату, уже имеющему поддержку в .net?

Как мне понять, какой тип у каждого значения?int / float / string

Кажется ли это вообще приемлемым решением?

Заранее спасибо, Xtapodi.

Ответы [ 4 ]

12 голосов
/ 15 июля 2010

Бросьте плоский файл и возьмите XML.Определенно посмотрите на XML-сериализацию.Вы можете просто создать все свои объекты в C # как классы, сериализовать их в XML и перезагрузить их в свое приложение, не беспокоясь о разборе плоского файла.Поскольку ваши объекты будут действовать как схема для вашего XML, вам не придется беспокоиться о приведении объектов и написании огромной процедуры синтаксического анализа, .NET справится с этим за вас.Вы сэкономите много лун головной боли.

Например, вы можете переписать свой класс, чтобы он выглядел так:

public class Monster
{
     public GeneralInfo General {get; set;}
     public SkillsInfo  Skills {get; set;}
}
public class GeneralInfo
{
  public int Hp {get; set;}
  public string Description {get; set;}
  public double TacticModifier {get; set;}
}
public class SkillsInfo
{
  public string[] SkillTypes {get; set;}
}

... и ваш XML будет десериализован в нечто вроде ...

<Monster>
   <General>
       <Hp>20</Hp>
       <Description>A big menacing goblin</Description>
       <TacticModifier>1.3</TacticModifier>
   </General>
   <SkillTypes>
        <SkillType>Fireball</SkillType>
        <SkillType>Water</SkillType>
   </SkillTypes>
</Monster>

.. Некоторые из моих имен классов, иерархии и т. Д. Могут быть неправильными, поскольку я очень быстро это ударил, но вы понимаете, как будет работать сериализация.

2 голосов
/ 15 июля 2010

Возможно, вы захотите проверить Sprache , библиотеку .net, которая может создавать DSL от автора Autofac Николаса Блумхардта. С сайта Google:

Sprache - небольшая библиотека для конструирование парсеров непосредственно в C # Код.

Это не "промышленная сила" рамки - это вписывается где-то в между регулярными выражениями и полноценный набор инструментов типа ANTLR.

Использование В отличие от большинства синтаксических сборок рамки, вы используете Sprache напрямую из кода вашей программы, и не нужно установить любой код времени сборки генерация задач. Sprache сам по себе является одна крошечная сборка.

Простой парсер может анализировать последовательность символов:

// Разбор любого количества заглавных 'A в строка var parseA = Parse.Char ( 'А') AtLeastOnce (). Sprache предоставляет ряд встроенных функции, которые могут сделать парсеры большего размера от меньших, часто вызываемых через Понимание запросов Linq:

Идентификатор парсера = от ведущих в Parse.Whitespace.Many () сначала в Parse.Letter.Once () с отдыха в Parse.LetterOrDigit.Many () из трейлинга в Parse.Whitespace.Many () выберите новую строку (first.Concat (rest) .ToArray ());

var id = identifier.Parse ("abc123 «);

Assert.AreEqual ("abc123", id);

Ссылка на статью создает вопросник, который управляется простым текстовым файлом в следующем формате:

identification  "Personal Details"
[
    name        "Full Name"
    department  "Department"
]

employment      "Current Employer"
[
    name        "Your Employer"
    contact     "Contact Number"
    #months     "Total Months Employed"
]
1 голос
/ 15 июля 2010

Нет встроенной функции, которая бы выполняла то, что вы хотите, но вы можете легко написать это.

0 голосов
/ 15 июля 2010

То, что вы хотите сделать, не будет легким. Статистика наследования в частности.

Итак, если вы не можете найти какой-либо существующий код для использования, я предлагаю вам начать с более простых требований с целью добавления более сложной функциональности позже и наращивания функциональности постепенно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...