尝试在c中匹配模式后替换两个空格#
问题描述:
我目前正在制作基于文本的游戏。我正在使用ASCII绘制地图。我想在播放器所在的房间放置一个“@”标志。四个方框是房间。这里是代码:尝试在c中匹配模式后替换两个空格#
string map = @"
+--------+
| |
|| ||
| |
+---||---+
||
+-||-+
|| ||
+-||-+
||
+-||-+
|| ||
+-||-+
||
+-||-+
|| ||
+- -+";
//this doesn't work lol
map = map.Replace("||","@");
这是一个任务。
答
要回答你直接的问题,假设有是有后两条竖线两个空格地图字符串的一部分,你想更换一个@
符号的第二空间,你可以这样做:
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);
}
}
当然,这会尽快炸毁作为球员的跑动去外面地图字符串覆盖的区域,或者击中该行的最右侧字符。
另一种选择是创建一个地图单元格阵列,其中每个单元格中的信息都是关于那里的内容。地图字符串用作生成地图数组的输入,用于之后的所有操作。然后,绘制循环会根据玩家位置进行测试,以确定是否绘制玩家的标记或地图单元所代表的任何字符。您也可以使用此阵列来测试移动是否有效(空地图单元格),添加单元格内容(宝藏!)等。
其代码远远超出此答案的范围。
“这不起作用大声笑”不是问题的解释 - 你期望什么,你得到什么。此外,您的示例绝对不是“最小化” - 请查看[MCVE]以获取指导。 –
你会替换“||”的每个实例用“@” –