0

我正在尝试用 C# 制作一个 roguelike,我必须制作一个小地图,以及一个检查是否按下 w/s/a/d 以移动玩家的循环;但我在检测墙壁时遇到问题;假设在移动到那里之前我想知道右边是否有墙,我得到玩家的位置,我检查那个位置的右边是什么,如果是'#',我不让玩家移动,因为它应该是一堵墙。

但问题是,在控制台中,我如何检查坐标(例如“(15,2)”)是否包含“#”字符?

有没有更简单的方法来检查给定坐标是否包含该字符?

如何?因为我试过了,但我无法在控制台的某个坐标中获取字符。

就像是:

static bool wallcheck_x(int xpos) {
        xpos++;
        //Now, it should GET the char allocated in xpos++;
        if (/*char that's in xpos++ */ == '#')
        {
            return true; //it's a wall
        }
        return false; //it's not a wall
    }
4

2 回答 2

3

你不应该那样做。你应该有一些映射到控制台中显示的内容,我假设这就是你开始看到地图的方式。当玩家移动时,您应该根据您的地图进行检查,而不是控制台中显示的内容。

所以例如...

如何检查坐标(例如“(15,2)”)是否包含“#”字符?

不要在 (15,2) 处检查控制台中的内容,而是检查显示控制台中内容的地图#。这样就容易多了。

但是,假设我在多维数组中制作了地图......那么我如何在控制台中打印数组?

使用谷歌,伙计。这是我从这个问题中得出的结论:

int rowLength = arr.GetLength(0);
int colLength = arr.GetLength(1);

for (int i = 0; i < rowLength; i++)
{
    for (int j = 0; j < colLength; j++)
    {
        Console.Write(string.Format("{0} ", arr[i, j]));
    }
    Console.Write(Environment.NewLine + Environment.NewLine);
}

这样做是逐行遍历数组,打印行中的每个字符。当它到达一行的末尾时,它会打印一个新行并开始打印新行。您的数组可能是代表地图的二维字符数组。同样,您可以通过以下方式跟踪玩家的位置:

int playerXPos;
int playerYPos;

您需要在角色移动时更新这些内容。因此,感谢 gleng 的这段代码,您可以检查玩家是否撞墙:

if (arr[playerXPos, playerYPos] == '#')
{
     // player has collided with a wall
}
else
{
     // player has NOT collided with a wall
}

尽管拥有一个实际的 Player 数据结构会更具可扩展性,但这似乎很适合您。

于 2013-11-01T17:51:08.563 回答
1

如果无法访问您的任何代码(您应该真正发布它以获得这样的帮助),我假设您会执行以下操作:

if (map[player.X, player.Y] == '#')
{
     // player has collided with a wall
}
else
{
     // player has NOT collided with a wall
}

此代码假定这map是一个包含您的地图的多维数组。

于 2013-11-01T17:48:33.940 回答