1
4

2 回答 2

1

我不会通过评论传播我的意见,而是将它们全部转储在这里作为答案:

我也很难找到存储坐标的方法

SortedLists,Dictionaries等将不起作用。在找到更好的解决方案之前,最好只使用一个普通ListTuples,或者你自己的一个类。Points

由于这些房间可能不会空着,您可以编写自己的课程,例如:

class Tile
{
    public int X { get; set; }
    public int Y { get; set; }

    public virtual void Draw(StringBuilder map)
    {
        map.Append("   ");
    }
}

class Room : Tile
{ 
    public int EnemyType { get; set; }
    public int Reward { get; set; }

    public override void Draw(StringBuilder map)
    {
        map.Append("[ ]");
    }
}

// etc.

我不明白为什么并且不确定在 StringBuilder 上调用 .ToString() 是否会使其失去格式,例如换行。

它没有。您的示例中没有任何换行符,因为所有房间都位于Y = 0

如果您一次绘制多条线并将它们串在一起,则当前的尝试将不起作用。相反,您可以使用类似“半步”网格的东西。

在此处输入图像描述

您可以在这里找到一个小的(丑陋的、未优化的、临时的)示例作为小提琴

于 2016-12-15T14:55:44.480 回答
0

除了文本格式和控制台的问题,还有 Manfred 已经提到的选项,这里有一个使用数组而不是列表的示例。房间是true任何给定索引处的 - 值,“没有房间”由 表示false

你的Rooms()方法看起来像这样:

public bool[,] Rooms ()
{
    var roomList = new bool[,]{{true,false},{true,true}};
    return roomList;
}

这使您需要更改IsRoom(int, int)为如下所示:

public bool IsRoom(int x, int y)
{
    var rooms = Rooms();

    if(x<rooms.GetLength(0) && y<rooms.GetLength(1))
    {
        return (rooms[x,y]);
    }
    return false;
}

还缺少一个换行符,这导致在下一个房间的同一条线上有一个垂直连接器。我把它改成了

        if (IsRoom(x, y + 1))
        {
            buildMap.Append("\r\n".PadLeft(4) + DrawVerticalConnector().PadRight(4));
            buildMap.Append("\r\n".PadLeft(4) + DrawVerticalConnector().PadRight(4)+ "\r\n".PadLeft(4));
        }
于 2016-12-15T14:35:39.853 回答