Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 尝试替换c中匹配模式后的两个空格#_C#_Regex_Replace_Ascii - Fatal编程技术网

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

C# 尝试替换c中匹配模式后的两个空格#,c#,regex,replace,ascii,C#,Regex,Replace,Ascii,我目前正在制作一个基于文本的游戏。我正在用ASCII码绘制地图。我想在玩家所在的房间里放置一个“@”标志。四个方形盒子是房间。代码如下: string map = @" +--------+ | | || ||

我目前正在制作一个基于文本的游戏。我正在用ASCII码绘制地图。我想在玩家所在的房间里放置一个“@”标志。四个方形盒子是房间。代码如下:

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

这是一个作业。

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

map.Replace("||  ", "|| @");
这当然会取代搜索字符串的每个实例,在地图上散布
@
符号,我强烈怀疑您是否希望发生这种情况

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

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

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);
    }
}
public void Draw()
{
string[]line=map.Replace(“\r”和“).Split(“\n”);
对于(int y=0;y
当然,一旦玩家移动到地图字符串覆盖的区域之外,或者击中该行最右边的字符,就会发生爆炸

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


代码远远超出了这个答案的范围。

“这不起作用lol”并不是对问题的解释——你期望什么,得到什么。此外,您的示例绝对不是“最小”-请查看指导。您将用“@”替换每个“| |”实例