如何打印不存在的东西?

时间:2016-06-01 17:28:21

标签: c# text mode

我正在为一个学校项目做一个基于文本的游戏,我发现自己陷入了一个非常愚蠢的问题。 概念很简单,有地图,玩家,一些怪物和一些物品。 对于地图数据结构,我决定使用具有内容unicode的二维char数组。 最重要的是,我有一个半径相机。玩家永远不会在屏幕上移动,它有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();

班级“难度”与我的问题无关。 我的问题本身就是当我到达边界墙时我不能让玩家位于中心位置,因为没有任何东西可以从阵列中获取,因为这些是负面位置。

2 个答案:

答案 0 :(得分:4)

这种问题有两种方法。

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

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

答案 1 :(得分:0)

C#无法检索不存在的值#34;但您确实有几个选项

  • 检查您是否试图获得负位置或位置太大,并返回空格



  • 在所有方面按cameraSize/2增加数组的大小,这样可以有效地增加宽度和高度cameraSize,然后将其移至播放器只能移动到的位置坐标(cameraSize/2,cameraSize/2)(mapWidth-cameraSize/2,mapHeight-cameraSize/2)。 (<--坐标可能是(y,x),因为2d数组是如何工作的,取决于代码的编写方式。这样,相机总是有一个衬垫,所以不应该是负面的指示