Pull to refresh

Comments 12

UFO just landed and posted this here

Либо на своем визарде сделайте список классов оружия, которое он может надевать. Либо на оружии список классов игрока, которые его могут надевать.

Всё это надо выражать в данных, а не коде. Иначе геймдизайнер ничего не сможет настроить без программиста.

Это правильный подход. Но статья о другом - как задать правила и ограничения с помощью системы типов языка C#.
Автор статьи не разработчик игр, он разработчик компилятора.

Спасибо за перевод. Жду следующие части.

Интересно как вы будете решать проблемы, которые очевидно следуют далее:

  • Посох не один, их много типов, так как как и условный меч

  • Для использования конкретного посоха/меча необходим N уровень персонажа

  • Персонаж определяется не типом жестко фиксированным, а набором статов

  • Игрок может перекидывать статы, что может в любой момент превратить персонажа из война в мага и наоборот

  • Маг все таки может иметь меч, но зачарованный допустим

Мне кажется, в этом примере ограничение средствами системы типов - изначально провальная идея, потому что получится такой клубок, который при критическом кол-ве условий просто невозможно будет распутать.

Очевидно, что проблема решается иначе - всё оружие разбивается на типы, например "одноручное", "двуручное", "посохи", "огнестрел", etc. Под каждый тип заводится интерфейс/базовый класс, и эти интерфейсы используются в потомках базового класса игрока, но никак не в базовом.

Да, я понимаю, что тут не совсем удачный пример выбран, но это решение для данной задачи.

Можете привести пример кода?

Нам достаточно одноручного и посохов и те же два класса - волшебник и воин. Так чтобы работать с ними можно было полиморфно и нельзя было дать волшебнику не посох.

public interface IPlayer 
{
  Weapon Weapon { get; }
}

public class Wizard : IPlayer
{
  public Weapon Weapon => Staff;
  public Staff Staff { get; set; }
}

Так не подойдёт? всё равно при "установке" оружия нужно знать тип

Что-то я так и не увидел своего варианта, позволяющего сохранить и LSP, и полиморфизм подтипов.


abstract class Player
{
    public abstract bool CanHoldWeapon(Weapon weapon);

    /// <exception cref="WeaponNotSupprtedException"></exception>
    public abstract Weapon Weapon { get; set; }
}

Попытка выдать меч волшебнику всё ещё исключение, но теперь оно ожидаемое.


Ну или даже вот так можно:


abstract class Player
{
    public abstract bool CanHoldWeapon(Weapon weapon);

    public abstract Weapon Weapon { get; }

    public abstract bool TrySetWeapon(Weapon weapon);
}

Про это будет в финальной 5ой части

Sign up to leave a comment.

Articles