0

这个问题可能会有点令人困惑,因为我刚刚开始 c# 和一般的面向对象编码,但我会尽力解释清楚!对于上下文,我正在尝试为游戏项目制作一个随机地牢生成器。

我有一个锯齿状数组“Dungeon”,我已经这样声明了它:

public Level[][,] Dungeon;

澄清一下,地牢是一维“关卡”数组。关卡是它自己的对象,它有一些我在其构造函数中定义的独特属性。

每个级别都是“mazePieces”的二维数组,它们也是对象。

我已经想出了如何引用整个 Dungeon 数组来执行诸如查看地牢中有多少级别之类的事情:

Dungeon[x].Length

我还可以参考给定级别中的单个 mazePieces:

Dungeon[i][x,y].mobAmount

但是,我不知道如何引用整个关卡的属性。如果我输入

Dungeon[i].numberOfRooms

“numberOfRooms”不被识别为关卡的属性。但是,我发现如果我输入它会被识别

Dungeon[i][,].numberOfRooms

我遇到的问题是第二组括号标有语法错误,表示需要一个值。

我可以在第二组括号中添加什么,以便我可以参考整个关卡,而不仅仅是关卡的特定部分?

希望这至少可以理解,请告诉我,我会尽力澄清!谢谢!

4

3 回答 3

3

你可以在你的设计中使用更多的构图。也许是这样的:

class Dungeon {
    public Level[] Levels { get; private set; }

class Level {
    public int NumberOfRooms
        { get { return Maze.GetUpperBound(0) * Maze.GetUpperBound(1); }
    public MazePiece[,] Maze { get; private set; }
}

class MazePiece {
    private List<Mob> _mobs = new List<Mob>();
    public IEnumerable<Mob> Mobs { get { return _mobs; } }
    public int MobCount { get { return _mobs.Count; } }
}

class Mob {
    public string Name { get; private set; }
}

那么你就可以更自然地引用事物了:

var mobsAtTenTenOfLevelThree = dungeon.Levels[2].Maze[9, 9].Mobs;
于 2013-02-28T17:56:20.473 回答
0

我会说迷宫的碎片应该是Level课堂的一部分,

所以你会有

public Levels[] Dungeon.

你的Level班级也有索引器:

public SomeReturnType this[int x, int y]
{
   get
   {
      // return maze piece
   }
}

在这种情况下,您将能够通过 访问任何级别的属性Dungeon[i].numberOfRooms。你仍然可以访问你想要的迷宫碎片Dungeon[i][x,y].mobAmount

于 2013-02-28T17:55:58.190 回答
0

假设numberOfRooms是 的一个属性MazePiece,如果您想找到地牢的总数,您可以使用SelectMany

int totalRooms = dungeon.SelectMany(p=>p.numberOfRooms).Sum();
于 2013-02-28T17:57:38.717 回答