尝试替换c#中匹配模式后的两个空格
Trying to replace the two spaces after the matched pattern in c#
我目前正在制作一个基于文本的游戏。我正在使用 ASCII 绘制地图。我想在播放器所在的房间放置一个“@”符号。四个方框是房间。这是代码:
string map = @"
+--------+
| |
|| ||
| |
+---||---+
||
+-||-+
|| ||
+-||-+
||
+-||-+
|| ||
+-||-+
||
+-||-+
|| ||
+- -+";
//this doesn't work lol
map = map.Replace("||","@");
这是为了作业。
为了回答您的直接问题,假设您的地图字符串的一部分在两个竖线之后有两个 space,并且您想将第二个 space 替换为 @
符号,你可以这样做:
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);
}
}
当然,一旦玩家移动到地图字符串覆盖的区域之外,或者碰到该行最右边的字符,这就会爆炸。
另一种选择是创建一个地图单元格数组,每个单元格中包含有关那里的内容的信息。映射字符串用作生成映射数组的输入,该映射数组用于之后的所有操作。然后,绘制循环将针对玩家位置进行测试,以确定它是否会绘制玩家的标记或地图单元格所代表的任何角色。您还可以使用此数组来测试移动是否有效(空地图单元格),添加单元格内容(宝藏!)等内容
其代码完全超出了此答案的范围。
我目前正在制作一个基于文本的游戏。我正在使用 ASCII 绘制地图。我想在播放器所在的房间放置一个“@”符号。四个方框是房间。这是代码:
string map = @"
+--------+
| |
|| ||
| |
+---||---+
||
+-||-+
|| ||
+-||-+
||
+-||-+
|| ||
+-||-+
||
+-||-+
|| ||
+- -+";
//this doesn't work lol
map = map.Replace("||","@");
这是为了作业。
为了回答您的直接问题,假设您的地图字符串的一部分在两个竖线之后有两个 space,并且您想将第二个 space 替换为 @
符号,你可以这样做:
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);
}
}
当然,一旦玩家移动到地图字符串覆盖的区域之外,或者碰到该行最右边的字符,这就会爆炸。
另一种选择是创建一个地图单元格数组,每个单元格中包含有关那里的内容的信息。映射字符串用作生成映射数组的输入,该映射数组用于之后的所有操作。然后,绘制循环将针对玩家位置进行测试,以确定它是否会绘制玩家的标记或地图单元格所代表的任何角色。您还可以使用此数组来测试移动是否有效(空地图单元格),添加单元格内容(宝藏!)等内容
其代码完全超出了此答案的范围。