Могу ли я определить (случайную) переменную в начале программы C#, которая остается неизменной для всей программы? - PullRequest
3 голосов
/ 12 января 2020

Я пытаюсь сделать текстовый проводник подземелий в C#, и у меня все лабиринт работает. Я использовал некоторые методы, которые ссылаются друг на друга, когда вы выбираете направление, которое вы хотите go in.

«Карта» разделена на 13 номеров. Это пример того, когда вы выходите из стартовой комнаты.

Console.WriteLine("REMEMBER! You are always looking north when deciding which room you go in.");
Console.WriteLine("one room goes right in front of you, one goes behind you, another one goes to the right and the third one goes straight in front of you.");
Console.WriteLine("if you want to give up, type 'give up'");
Console.WriteLine("which way do you go?");
choice = Console.ReadLine().ToLower();

while (choice != "behind" && choice != "right" && choice != "in front" && choice != "give up")
{
    Console.WriteLine("you cant stay here, can you?");
    Console.WriteLine("Type: 'behind', 'right' of 'in front' to move in a specific direction.");
    choice = Console.ReadLine().ToLower();
}

switch (choice)
{
    case "in front":
        Console.Clear();
        room1();
        break;

    case "behind":
        Console.Clear();
        room11();
        break;

    case "right":
        Console.Clear();
        room7();
        break;
}

И это сам лабиринт: maze Просто лабиринт это весело, но я бы хотел, чтобы там был элемент неожиданности. Например, я думал о том, чтобы поместить монстра в комнату 8. Монстр не должен быть там в каждой игре. В начале игры я хотел бы определить переменную, которая решает, будет ли монстр или нет (я планировал сделать это с массивом и случайным числом, чтобы вероятность была 50/50). Проблема в том, чтобы сохранить переменную, чтобы она не менялась при каждом перемещении в другую комнату.

Кто-нибудь знает, как я могу определить переменную (или, может быть, что-то еще, чего я не знаю? Я несколько новичок в программировании несколькими способами) в начале игры, чтобы определить, есть ли монстр или нет? Я пытался работать с различными классами, но я никогда не делал этого раньше, поэтому я не знаю, как я могу работать в разных классах в одном и том же пространстве имен.

Я также буду далее использовать это, чтобы определить, в каких Поместите меч, чтобы убить монстра, и в какой комнате ключ от двери спасения - et c.

Ответы [ 2 ]

3 голосов
/ 12 января 2020

Я не совсем уверен, что понимаю, чего вы хотите достичь, но простой ответ мог бы иметь класс Room, который сам определяет, есть ли у него монстр. Это может быть рандомизировано в конструкторе объектов (метод, который вызывается, когда инициализируется новый экземпляр объекта).

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

Примерно так:

public static class Utility
{
    private static readonly Random random = new Random();

    // Returns true or false, with a user defined chance of 'True'
    // E.g. chanceForTrue = 30 means a 30% chance of 'True'
    public static bool GetRandomBool(int chanceForTrue)
    {
        return random.Next(101) < chanceForTrue;
    }
}

public class Room 
{
    // If true, there is a monster in the room
    private readonly bool hasMonster;

    // Constructor
    public Room()
    {
        // 50% chance of having a monster
        hasMonster = Utility.GetRandomBool(50);
    }
    // ...rest of the class
}

Метод Random.Next (2) вернет целое число меньше 2 (т. Е. 0 или 1), что означает, что существует шанс 50/50 на комнату, содержащую монстра. Вы можете настроить это по своему вкусу.

Вы просто получаете комнату, говоря:

var room8 = new Room();

Однако, как правило, это не очень хороший способ хранения нескольких экземпляров одного и того же объекта (класса). Вам следует заняться их хранением в какой-то коллекции, может быть, в словаре:

var rooms = new Dictionary<int, Room>();
rooms.Add(8, new Room()); // Adds a room with key '8'

И логи c, из которых комнаты являются вспомогательными, могут храниться на карте или в Room сам класс, имея список AdjecantRooms. Но теперь мы как бы уходим от первоначального вопроса, поэтому я остановлюсь: -).

0 голосов
/ 12 января 2020

Решение состоит в том, чтобы код проходил через эти переменные и реагировал соответствующим образом (порождает монстра в указанной комнате или не реагирует вовсе) до начала игры.

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

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

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