尝试在c#中匹配模式后替换两个空格

时间:2015-11-06 00:06:09

标签: c# regex replace ascii

我目前正在制作基于文字的游戏。我正在使用ASCII绘制地图。我想在玩家所在的房间放置一个“@”标志。四个方框是房间。这是代码:

    string map = @"
                                    +--------+
                                    |        |
                                   ||        ||
                                    |        |
                                    +---||---+
                                        ||                                        
                                      +-||-+
                                     ||    ||
                                      +-||-+
                                        ||                                        
                                      +-||-+
                                     ||    ||
                                      +-||-+
                                        ||                                        
                                      +-||-+
                                     ||    ||
                                      +-  -+";
    //this doesn't work lol
    map = map.Replace("||","@");

这是一项任务。

1 个答案:

答案 0 :(得分:1)

要回答您的直接问题,假设您的地图字符串的一部分在两个竖线后面有两个空格,并且您想要用@符号替换第二个空格,则可以执行以下操作:< / p>

map.Replace("||  ", "|| @");

当然会替换搜索字符串的每个实例,在地图中散布@符号,我强烈怀疑你是否希望这种情况发生。

事实上,我认为根本不更改map字符串是个好主意。相反,通过将地图数据与玩家位置数据分开并以不同方式处理输出,您可以获得更好的服务。

例如,如果允许您使用Console对象的定位命令,则可以执行以下操作:

int playerX;
int playerY;
string map;

public void Draw()
{
    Console.Clear();
    Console.Write(map);
    // save cursor position
    int l = Console.CursorLeft;
    int t = Console.CursorTop;
    // display player marker
    Console.SetCursorPosition(playerX, playerY);
    Console.Write("@");
    // restore cursor position
    Console.SetCursorPosition(l, t);
}

你可以使用光标定位来做各种有趣的事情,就像我们过去在ANSI艺术中过去所做的那样。啊,怀旧。

如果您无法使用 - 或由于某种原因无法依赖 - 光标定位,您将需要更具创意。一种方法是将地图分成几行,并确定在输出之前需要添加玩家标记的地图:

public void Draw()
{
    string[] lines = map.Replace("\r", "").Split('\n');
    for(int y = 0; y < lines.Length; y++)
    {
        string curr = lines[y];
        if (y == playerY)
            curr = curr.Substring(0, playerX) + "@" + curr.Substring(playerX + 1);
        Console.WriteLine(curr);
    }
}

当玩家移动超出地图字符串所覆盖的区域时,这会爆炸,或者击中该行的最右边角色。

另一个选择是创建一个地图单元格数组,每个单元格中包含有关内容的信息。映射字符串用作生成映射数组的输入,该映射数组在此之后用于所有操作。然后,绘制循环将针对玩家位置进行测试,以确定它是否将绘制玩家的标记或地图单元格所代表的任何字符。您还可以使用此数组来测试移动是否有效(空地图单元格),添加单元格内容(宝藏!)等内容。

其代码完全超出了本答案的范围。