c# - 如何打印不存在的东西?

标签 c# text mode

我正在为一个学校项目做一个基于文本的游戏,我发现自己遇到了一个非常愚蠢的问题。 这个概念很简单,有一张 map 、一个玩家、一些怪物和一些元素。 对于 map 数据结构,我决定使用具有 unicode 内容的二维字符数组。 除此之外,我还有一个有半径的相机。玩家永远不会在屏幕上移动,它有一个 x 和 y,但屏幕上有运动的是相机本身。除了当我到达角落或任何外墙时,这工作得很好。 我让我的相机这样做

int size = cameraSize/2;
int top = player.GetY() - size, bottom = player.GetY() + size;
char[,] camera = new char[cameraSize, cameraSize];
Console.SetCursorPosition(0,0);

for (int i = top; i < bottom; i++)
{
    for (int j = top; j < bottom; j++)
    {
        camera[i, j] = map.ReMapPosition(i, j);
        Console.Write(camera[i,j]);
    }
    Console.Write("\n");
}

Console.SetCursorPosition(cameraSize,cameraSize);
Console.Write(player.GetPlayerChar());

我的“cameraSize”在类的开头声明,并在调用构造函数时填充

private int cameraSize;
cameraSize = difficulty.GetCameraSize();

类(class)“难度”与我的问题无关。 我的问题本身是,当我到达边界墙时,我无法使玩家位于中心,因为无法从数组中获取任何内容,因为这些是负位置。

最佳答案

解决此类问题有两种方法。

1) 在循环中,检查值是否超出范围并手动输出该值。

2) 将数组包装在自定义类中,该类会忽略超出范围的值。
像这样的事情:

class MyWrapper
{
    private readonly char[,] data;
    public MyWrapper(char[,] data)
    {
        this.data=data;
    }
    private bool InRange(int x, int y)
    {
        return x >= 0 && y >= 0 && x < data.GetLength(0) && y < data.GetLength(1);
    }
    public char this[int x, int y]
    {
        get
        { 
            return InRange(x,y) ? data[x,y] : ' ';
        }
        set
        {
            if(InRange(x,y)) data[x,y] = value;
        }
    }
}

我的建议是 set 在调用超出范围的值时抛出异常,但我的示例却吞下了失败。

关于c# - 如何打印不存在的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37575206/

相关文章:

c++ - 如何在 RichEdit 控件中更改选择颜色?

php - PHP 中 Perl 的污点模式

iOS 后台模式

C# picturebox 加载带有偏移量的图像

c# - 如何通过代码启用 URI 类的 IDN/IRI 支持?

unix - CSV - 删除任何列为空的行

r - 平局打破模式,第二列中的值 -R

c# - 具有内联架构的 XDocument。 SchemaInfo 为空

c# - objectlistview 如何更改组标题中的文本?

java - 能够通过套接字发送图像,但不能发送文本文件