Вопрос о переменной C # и текстовая попытка RPG - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь написать текстовую RPG на C #.У меня возникают проблемы с пониманием того, как я могу эффективно сделать символьные данные доступными для многих других объектов.

Я довольно новичок в программировании, и мне определенно не хватает информации.Я читал руководства и вопросы в Интернете, и это дошло до меня, но я чувствую, что либо думаю об этом неправильно, либо что-то упускаю полностью.

Я пытаюсь написать все настолько гибко, насколько это возможно, поскольку я планирую многое добавить в этот проект, если смогу пройти этот этап.Но мне кажется трудным позволить всем этим объектам активно общаться друг с другом.Может ли использование Unity помочь с этим?В основном я делаю это, чтобы выучить язык, чтобы потом использовать его с Unity, но я хотел выучить язык напрямую, поэтому решил отказаться от Unity.Если есть какие-либо предлагаемые ресурсы, чтобы узнать о языке, я мог бы действительно использовать рекомендации.

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

namespace GameMain
{
public class Game
{

    static void Main()
    {
        MainMenu Game = new MainMenu();
        Game.Menu();
        return;
    }

}
public class MainMenu
{
    Character CurrentPlayer = new Character();
    public void Menu()
    {
        Music MusicPlayer = new Music();
        LocationEngine Location = new LocationEngine();
        Tester Testman = new Tester();
        MusicPlayer.Track("0");
        while (true)
        {
        Menu:
            Console.WriteLine("Welcome to the main menu. Enter 'create' to create a character and begin the game. Enter 'play' to log in.\r\nSaving features are to be implemented.\r\n");
            while (true)
            {
                string MenuSelection = Console.ReadLine();
                if (MenuSelection == "create")
                {
                    CurrentPlayer.Creation();
                    goto Menu;
                }
                else if (MenuSelection == "play")
                {
                    if (CurrentPlayer.CharacterPass != "")
                    {
                        Console.Write("\r\nEnter your password: ");
                        string Password = Console.ReadLine();
                        bool Check = CurrentPlayer.Login(Password);
                        if (Check == true)
                        {
                            Console.WriteLine("\r\nAdd transition to location here.");
                            break;
                        }
                        else
                        {
                            break;
                        }
                    }
                    else
                    {
                        Console.WriteLine("Please create a character first.\r\n");
                        break;

                    }

                }
            }
            while (true)
            {
                Console.WriteLine("\r\nPress any key to continue.\r\n");
                Console.ReadKey();
                string TownSelection = "";
                Console.WriteLine("\r\nYou are in Town.\r\n\r\nYou can 'explore' for encounters\r\nYou can use 'stats' to check your character\r\nOr you can 'sleep' to return to the main menu\r\n");
                TownSelection = Console.ReadLine();
                if (TownSelection == "sleep")
                {
                    Console.WriteLine("");
                    break;
                }
                else if (TownSelection == "stats")
                {
                    CurrentPlayer.CharacterStats();
                }
            }







        }
    }
}
}

Я не знаю, как сделать объект CurrentPlayer доступным для других объектов, таких как Location,Лучше ли передавать каждый соответствующий бит в качестве ссылки на всем протяжении кроличьей норы?

Я разместил здесь все на github, если вы чувствуете себя лишним: https://github.com/Slocknog/rpgproject

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

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

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

Цель каждого класса должна быть ясной и ограниченной: должно быть достаточно очевидно, присутствует ли какая-либо функциональностьпринадлежит к определенному классу или нет, и ни один класс не должен брать на себя слишком большую ответственность.Я бы посоветовал вам написать комментарии к документации по каждому классу, чтобы объяснить его назначение - это поможет вам вернуться и спросить себя, действительно ли какой-то аспект состояния и функциональности имеет смысл для этого класса.

Затем подумайте о трех способах, которыми данные могут быть доступны классу:

  • Через статические переменные.Это фактически глобальное состояние, и его лучше всего ограничить естественными константами.Глобальное состояние обычно должно быть неизменным (если это не что-то вроде кэша), так как в противном случае это может затруднить тестирование и анализ вашего кода.
  • Через переменные экземпляра.Это состояние для экземпляра класса (объекта).Должно быть состояние, которое кажется естественным образом принадлежащим экземпляру в течение всего времени его жизни.
  • Через параметры метода.Это информация, которая полезна только на время одного вызова метода.Например, я не думаю, что LocationEngine должен действительно знать о Character как части глобального состояния или состояния экземпляра, но может иметь смысл передать ссылку Character в метод.(Возможно, имеет смысл передать в метод ссылку Location, которую можно получить из Character - трудно сказать, не пытаясь эффективно выполнить большую часть дизайна для вас.)

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

(О, ина мой взгляд, разумно отделить «изучение C #» от «изучения Unity». Довольно много Unity использует идиомы / методы / соглашения, которые вызовут удивление в других кодовых базах C #. Изучение их только при переходе в Unity означает, что выс меньшей вероятностью перенести их на написание кода C # где-либо еще. Кроме того, отладка «обычного» кода C #, особенно консольных приложений, несколько проще, чем забота о редакторе Unity и т. д.)

0 голосов
/ 27 декабря 2018

у вас могут быть все эти "другие объекты". Конструкторы принимают объект Character, который вы предоставите CurrentPlayer

, предполагая, что у вас есть следующий Character класс

class Character
{
    public string Name { get; set; }
}

тогда ваш LocationEngine класс будет:

class LocationEngine
{
    Character _player;
    public LocationEngine(Character player)
    {
        _player = player;
    }

   public void SomeMethod()
   {
       string playerName = _player.Name;
   }
}

, а в вашем классе MainMenu вы закодируете:

public class MainMenu
{
    Character CurrentPlayer = new Character();

    LocationEngine location = new LocationEngine(CurrentPlayer);

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