2015-11-06 70 views
-4

我目前正在制作基于文本的游戏。我正在使用ASCII绘制地图。我想在播放器所在的房间放置一个“@”标志。四个方框是房间。这里是代码:尝试在c中匹配模式后替换两个空格#

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

这是一个任务。

+0

“这不起作用大声笑”不是问题的解释 - 你期望什么,你得到什么。此外,您的示例绝对不是“最小化” - 请查看[MCVE]以获取指导。 –

+0

你会替换“||”的每个实例用“@” –

回答

1

要回答你直接的问题,假设有是有后两条竖线两个空格地图字符串的一部分,你想更换一个@符号的第二空间,你可以这样做:

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); 
    } 
} 

当然,这会尽快炸毁作为球员的跑动去外面地图字符串覆盖的区域,或者击中该行的最右侧字符。

另一种选择是创建一个地图单元格阵列,其中每个单元格中的信息都是关于那里的内容。地图字符串用作生成地图数组的输入,用于之后的所有操作。然后,绘制循环会根据玩家位置进行测试,以确定是否绘制玩家的标记或地图单元所代表的任何字符。您也可以使用此阵列来测试移动是否有效(空地图单元格),添加单元格内容(宝藏!)等。

其代码远远超出此答案的范围。