Я начинаю свой сторонний проект, и одна из моих целей - научиться лучше использовать Classes
и Subclasses
. Однако я столкнулся с проблемой, поскольку пытался сделать что-то, что я должен был делать раньше в Java
для моего курса, но я не уверен, как это сделать в C#
.
Моя проблема в том, что я хочу определить данный атрибут в мастер-классе, и у каждого подкласса есть свое собственное значение для указанного атрибута (примечание, каждый подкласс, , а не каждый экземпляр).
Я посмотрел, как работают атрибуты и классы в C#
, но я не совсем понял документы по этому вопросу.
Я довольно плохо знаком с классами в C#, поэтому, если отвечать go, простота предпочтительнее эффективности.
Вот код, с которым я работаю:
class Rooms
{
protected static bool sameDir(char[] dir1, char[] dir2)
{
if(dir1.Length != dir2.Length)
{
return false;
}
bool check;
foreach (char item1 in dir1)
{
check = false;
foreach(char item2 in dir2)
{
if(item1 == item2)
{
check = true;
break;
}
}
if(check = false)
{
return false;
}
}
return true;
}
protected char[] rdir { get; set; }
public char[] getrdir() { return rdir; }
protected string enterText;
public string getEnterText() { return enterText; }
static public Rooms getRoom(char[] dir, int id = -1)
{
List<Rooms> allRooms = new List<Rooms>();
#region Add an instance of every type of room
allRooms.Add(new Entrance());
allRooms.Add(new ChestRoom());
allRooms.Add(new MonsterRoom());
allRooms.Add(new PlaceholderRoom());
#endregion
List<Rooms> requested = new List<Rooms>();
foreach(Rooms room in allRooms)
{
if(sameDir(dir, room.getrdir()))
{
//Checks if the array of directions entered has the same elements as the arrays' directions.
requested.Add(room);
}
}
if (id == -1)
{
//Checks if the user had chosen to give an id
Random random = new Random();
return requested[random.Next(0, requested.Count)];
}
return allRooms[id];
}
}
class Entrance : Rooms
{
public char[] getrdir()
{
return new char[1] { 'w' };
}
public string enterText()
{
return "You arrive at the opening of a cave.\n";
}
}
class ChestRoom : Rooms
{
public char[] getrdir()
{
return new char[2] { 'w', 's' };
}
public string enterText()
{
return "You enter a somewhat fancy room, with a chest in the middle of the room.\n";
}
}
Более подробно: я делаю текстовое приключение, используя Winforms
. Я собираюсь сделать каждый из типов комнат как Subclass
из Masterclass Rooms
. В моей функции Rooms
я создал функцию, которая должна вызывать меня для нового экземпляра комнаты, чтобы обеспечить как случайную планировку подземелья, так и убедиться, что каждая комната имеет смежную доступную комнату на дверь.
Проблема, к которой привела моя текущая попытка, состоит в том, что мой массив символов rdir
всегда пуст, иначе он не принимает значение, как определено в Subclasses
. Я хочу иметь возможность установить атрибут в Masterclass
, чтобы иметь функцию getRoom
, но установить значение rdir
для каждой комнаты отдельно.
Поэтому меня попросили упростить мою цель немного. Я хочу class
для каждого отдельного типа комнаты. Я хочу, чтобы в каждой комнате была указана информация о том, как игрок может go из указанной комнаты, это должно быть одинаково для всех instance
той же комнаты. Ака каждая входная комната должна только иметь 1 направление, на которое игрок может go, и это вперед.
Я также хочу иметь возможность получить комнату запрашивая конкретные c направления. Ака, я хочу иметь возможность получить комнату с указанием c направлений, по которым игрок может пройти по ней.
Надеюсь, это поможет?