我能在C#程序的开头定义一个(随机)变量吗?它在整个程序中保持不变?

我能在C#程序的开头定义一个(随机)变量吗?它在整个程序中保持不变?,c#,variables,global-variables,C#,Variables,Global Variables,我正在尝试在C#中制作一个基于文本的地下城资源管理器,我的迷宫部分都可以工作。我使用了一些方法,当你选择一个你想去的方向时,它们相互参照 “地图”共分为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,

我正在尝试在
C#
中制作一个基于文本的地下城资源管理器,我的迷宫部分都可以工作。我使用了一些方法,当你选择一个你想去的方向时,它们相互参照

“地图”共分为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;
}
这就是迷宫本身: 只是一个迷宫是有趣的,但我想有一个惊喜的元素。例如,我想在8号房间放一个怪物。怪物不必每场比赛都在场。在游戏开始的时候,我想定义一个变量来决定是否会有怪物(我计划用一个数组和一个随机数来做这件事,所以有50/50的机会)。问题是要保留变量,这样它就不会在每次移动到不同的房间时都发生变化

有人知道我如何在游戏开始时定义一个变量(或者我不知道的其他东西?我对多种方法编程有点陌生)来确定是否有怪物吗?我尝试过使用各种类,但我以前从未这样做过,所以我不知道如何在同一名称空间中的不同类中工作


我还将进一步使用它来确定杀死怪物的剑在哪个房间,逃生门的钥匙在哪个房间等等。

一个解决方案是在游戏开始前让代码运行这些变量,并做出相应的反应(在指定的房间内繁殖怪物,或者根本不繁殖怪物)

您可以按原样将这些变量放入地牢生成器类中,也可以将它们包装在结构中以便于阅读。因为你的地下城生成器类会在整个游戏中持续存在,所以在房间中移动时保持变量不变应该没有问题


如果此解决方案不适合您的情况或不准确,请在您当前的实现中提供更多详细信息,以便我们提供更正确的建议。

我不太确定我是否理解您想要实现的目标,但一个简单的答案可能是拥有一个
房间
类,该类本身决定它是否有怪物。这可以在对象构造函数(初始化对象的新实例时调用的方法)中随机化

正如Olivier所提到的,类本身不可能有实际的随机数生成器,所以我将它放在了一个实用程序类中

大概是这样的:

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
}
但是,这通常不是存储同一对象(类)的多个实例的好方法。您应该考虑将它们存储在某种集合中,可能是字典:

var rooms = new Dictionary<int, Room>();
rooms.Add(8, new Room()); // Adds a room with key '8'
var rooms=newdictionary();
房间。添加(8,新房间());//添加具有键“8”的房间

哪些房间是相邻的逻辑可以存储在地图或
房间
类本身中,通过拥有
相邻房间的列表
。但是现在我们有点脱离了最初的问题,所以我将停止我自己:-)。

嗨,欢迎来到StackOverflow。除非你有很好的理由不这样做(就像一个不会说英语的团队),否则我至少会有英文的变量名,以及一些注释,用于对理解很重要的文本(字符串)。这将使人们更容易提供帮助(无论是现在还是将来)。嗨,欢迎来到奇妙的编程世界!只要在main之外声明变量,就可以了。@Noceo好的!感谢您指出这一点,我将对其进行编辑,以便更好地理解。由于
随机
是从PC时钟初始化的,它的滴答声相当慢,如果在快速循环中创建,则很可能会在每个房间中生成相同的随机数。将Random声明为
Room
类中的static字段,或者更好地声明为全局公共只读静态字段或属性,以便在整个应用程序中使用相同的随机生成器。请看:@OlivierJacot Descombes绝对正确。我已经改变了我的示例,将随机数生成移到了类外。尽管如此,对随机布尔值的请求仍然发生在构造函数中。谢谢你指出这一点。@Noceo谢谢,这似乎是一个可行的解决方案。我必须把我的程序类(游戏其余部分的编写类)作为一个公共静态类还是一个静态类?我还不了解整个公共与静态的情况,即使在网上看了很多教程。@Simon一个类(在大多数情况下)应该有自己的文件,与该类同名(例如Utility.cs)。关于
公共
静态
:它们是两个不同的东西。
public
部分意味着可以从任何其他类(甚至在不同的项目中)访问该方法(或类)。这与
private
相反,后者将使该方法仅对同一类中的其他方法可用。
static
部分意味着您不能初始化类(即
new
),而是直接调用它。
var rooms = new Dictionary<int, Room>();
rooms.Add(8, new Room()); // Adds a room with key '8'