@justslipknot

Как реализовать эту функцию на C#?

В общем, сил моих больше нет, я даже не знаю, что уже гуглить.
Суть вопроса: есть некий класс Character, у класса есть 3 свойства: Health, Stamina, Mana (в будущем их будет больше). Есть коллекция объектов типа Item и коллекция типа Perks, в них хранятся предметы и перки персонажа соответственно. Хочу сделать так, чтоб пользователь в окне приложения выбирал кол-во здоровья, маны и тд. Потом выбирал предметы и перки, которые хочет добавить. На выходе должен получаться файл с консольными командами игры. Команды такого вида: player.additem id count, player.modav health "count", player.addperk id. На выходе должен получится файл .txt со списком команд. При всем при этом, если пользователь, например, не менял значения Health, Stamina и тд. в окне приложения. То не добавлять команду, которая отвечает за этот параметр, чтобы не получилось что-то типа player.modav health 0. Можно было бы if`ами , но я точно знаю, что таких параметров в будущем будет больше 10. Старался максимально понятно расписать. Спасибо
  • Вопрос задан
  • 289 просмотров
Пригласить эксперта
Ответы на вопрос 2
devspec
@devspec
Помогло? Отметь решением
Можно (и, наверное, нужно) переопределить ToString класса Character, сериализовать там объект в json и результат сохранять в файл.
https://www.newtonsoft.com/json/help/html/Serializ...
https://stackoverflow.com/questions/16921652/how-t...
и т.д.

P.S. Если нужны команды, как вы описываете, то их тоже можно сохранять в файл в функции ToString(), используя например, string format
System.IO.File.WriteAllText(@"D:\path.txt", $"player.additem {this.id} {this.count}...");

P.P.S. Если нужно отслеживать, какие данные изменились... в сеттере любого свойства можно добавлять новое значение свойства в приватный список, соответствующий этому свойству. Если предыдущий элемент списка равен новому - добавляем null. Затем с помощью такого оператора в string.format определяем, какую команду выводить в файл (если текущий item приватного списка НЕ null), а какую нет (если текущий item приватного списка null).
Ответ написан
@nexus478
Вам требуется паттерн Команда, он позволит избежать большого количества if-ов и при этом даст возможность добавлять гибко добавлять новые команды. Почитайте про этот паттерн на метаните, внимательно изучите схемы и постарайтесь понять, какую роль играет каждый участник паттерна.
Примерно это может выглядеть вот так
public interface ICommand
{
    void Execute(CommandParameter parameter);
}

public class CommandParameter
{
    public int Id { get; set; }
    public int Count { get; set; }
    // сюда можно добавлять сколько угодно новых параметров, 
    // которые вам требуется записывать в файл
}

public class AddHealthCommand : ICommand
{
    public void Execute(CommandParameter parameter)
    {
        File.WriteAllText(@"D:\path.txt", $"player.modav health {parameter.Count}");
    }
}

public class AddItemCommand : ICommand
{
    public void Execute(CommandParameter parameter)
    {
        File.WriteAllText(@"D:\path.txt", $"player.additem {parameter.Id} {parameter.Count}");
    }
}

public class CommandWriter
{
    public void WriteCommand(ICommand command, CommandParameter parameter)
    {
        command.Execute(parameter);
    }
}


Например, пользователь решил добавить здоровья, это будет выглядеть так
var addHealthParameter = new CommandParameter {Count = value}; //value пришло откуда-то из интерфейса
commandWriter.WriteCommand(new AddHealthCommand(), addHealthParameter);

Если пользователь захочет добавить предмет, то запись будет выглядеть так
var addItemParameter = new CommandParameter {Id = id, Count = count};
commandWriter.WriteCommand(new AddItemCommand(), addItemParameter);


И если вам захочется добавить новую команду, вы просто делаете наследника ICommand и реализуете там логику добавления. А класс CommandParameter даст вам гибкость в добавлении новых параметров в команды.

У вас WPF или WinForms приложение, так ведь?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы