繁体   English   中英

C#可变范围问题和基于文本的RPG尝试

[英]C# Variable Scope Question, and Text-based RPG Attempt

我正在尝试用C#编写基于文本的RPG。 我在理解如何使字符数据有效地访问许多其他对象方面遇到问题。

我对编程很陌生,当然也缺少信息。 我一直在网上阅读指南和问题,但到目前为止,我感到很高兴,但是我觉得我在想这是错误的方式,还是完全错过了一些东西。

我正在尝试编写尽可能灵活的所有内容,因为如果可以超出这个阶段,我计划在此项目中添加很多内容。 但是对于我来说,让所有这些对象彼此主动通信似乎很困难。 使用Unity可以帮助吗? 我主要是为了学习这种语言,所以以后可以在Unity中使用它,但是我想直接学习该语言,所以我选择退出Unity。 如果有任何建议的资源来学习该语言,我真的可以使用建议。

很抱歉,这个问题太开放了,但是我真的找不到关于应该如何构建这样的系统背后的思想观念的信息。 我学到的最后一件事是裁判,但我觉得那不是最好的答案。

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

...并感谢您的帮助。 请对您认为我应该做的不同事情或继续阅读的其他事情发表评论。

我会退后一步,确保您了解所编写的每个类的目的。 (这听起来似乎很让人光顾,但实际上并没有这样做。这是设计中的困难部分。)

每个类的目的应该明确并受约束:任何功能是否属于某个特定类都应该相当明显,并且任何类都不应该承担太多责任。 我鼓励您在每个类上写文档注释以解释其目的-这将使您更轻松地回来问自己,状态和功能的某些方面对于该类是否真的有意义。

接下来,考虑可以向类提供数据的三种方式:

  • 通过静态变量。 这是有效的全局状态,最好限制为自然常数。 全局状态通常应该是不可变的(除非它类似于缓存),否则它将使测试和代码推理变得相当困难。
  • 通过实例变量。 这是类实例(对象)的状态。 应该是一种状态,感觉它在整个生命周期中自然属于一个实例。
  • 通过方法参数。 这是仅在单个方法调用期间有用的信息。 例如,我不认为LocationEngine应该真正了解Character作为全局或实例状态的一部分,但是将Character引用传递给方法可能是有意义的。 (将Location引用传递到方法中可能更有意义,该引用可能是从Character获得的-如果不有效地尝试为您做大部分设计,很难说。)

尽管您仍然应该期望会犯错误,但绝对值得在早期就对这些决定进行深入思考。 如果您发现自己不得不编写很多时候很难看的代码,就其访问信息的方式而言,请考虑一下该信息当前是否“存在”正确的位置。

(哦,在我看来,明智的做法是将“学习C#”与“学习Unity”分开。很多Unity使用惯用语/技术/惯例在其他C#代码库中引起人们的注意。只有在移动时才了解它们进入Unity意味着您不太可能将它们带到其他地方编写C#代码。此外,调试“常规” C#代码(尤其是控制台应用程序)要比担心Unity编辑器等简单一些。)

您可以让所有这些“其他对象”构造函数接受您将向其提供CurrentPlayerCharacter对象

假设您具有以下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);

    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM