Как я уже сказал в комментарии выше, приобретает хорошие привычки сейчас, как новичок , и вам не придется отказываться от этих привычек позже. Давайте посмотрим, как мы можем разработать вашу систему. Начните с хорошо разработанной иерархии классов. Допустим, у нас есть три вида оружия: мечи, кинжалы и дубины. Общее, что у них есть, входит в абстрактный базовый класс:
abstract class Weapon
{
Что у них общего? Ущерб, стоимость и имя. Сделайте абстрактные свойства только для чтения для них:
public abstract int Damage { get; }
public abstract decimal Cost { get; }
public abstract string Name { get; }
}
Теперь создайте несколько производных классов. Планируете ли вы расширить их дальше? Если нет, запечатайте их:
sealed class Sword : Weapon
{
public override int Damage => 10;
public override decimal Cost => 12.5m;
public override string Name => "normal sword";
}
и т. Д.
Теперь сделайте то же самое для игрока. Допустим, мы можем изменить оружие игрока, но не его имя. Так что Name
должно быть свойством только для чтения, а Weapon
должно быть свойством только для чтения и записи:
sealed class Player
{
public string Name { get; private set; }
public Weapon Weapon { get; set; }
public int Strength { get; private set; }
public int BaseDamage { get; private set; }
public Player(string name, Weapon weapon, int strength, int baseDamage)
{
this.Name = name;
this.Weapon = weapon;
this.Strength = strength;
this.BaseDamage = baseDamage;
}
}
Теперь мы можем сделать несколько видов оружия:
Weapon weapon1 = new Sword();
Weapon weapon2 = new Dagger();
Weapon weapon3 = new Club();
Player fighter = new Player("Bob", weapon3, 5, 10);
Или, лучше:
var weapons = new List<Weapon> { new Sword(), new Dagger(), new Club() };
// weapons is indexed 0, 1, 2.
Player fighter = new Player("Bob", weapons[2], 5, 10);
А теперь, если у вас в руках игрок:
static void Attack(Player p)
{
int damage = p.BaseDamage * p.Strength + p.Weapon.Damage;
string text = $"Player {p.Name} attacks with {p.Weapon.Name}";
Нет строк для ссылок на объекты! Не используйте строки ни для чего, кроме text . Ссылки на объекты должны быть ссылками на объекты, а не на строки.
Теперь только для продвинутых игроков , бывают случаи, когда вам нужно что-то искать по строке. То, как вы делаете это в C #:
var d = new Dictionary<string, Weapon> {
{ "weapon1", new Sword() },
{ "weapon2", new Dagger() },
{ "weapon3", new Club() }
};
Weapon w = d["weapon1"]; // w is a Sword.
Но не делают этого по умолчанию . Это не обычный способ ссылаться на что-то в C #.