我怎样才能打印不存在的东西?
How can I print somethying that isn't there?
我正在为一个学校项目做一个基于文本的游戏,我发现自己遇到了一个非常愚蠢的问题。
这个概念很简单,有一张地图、一个玩家、一些怪物和一些物品。
对于地图数据结构,我决定使用具有 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'声明在class开头,调用构造函数时填充
private int cameraSize;
cameraSize = difficulty.GetCameraSize();
class 'difficulty' 与我的问题无关。
我的问题本身是,当我到达边界墙时,我无法让玩家位于中心,因为阵列中没有任何东西可以获取,因为这些是负位置。
有两种解决此类问题的方法。
1) 在你的循环中,检查一个值是否超出范围并手动输出该值。
2) 将您的数组包装在自定义 class 中,忽略超出范围的值。
像这样:
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# 不能 "retrieve values that aren't there",但你有几个选择
- 检查一下你是否试图获得一个负头寸,或者一个太大的头寸,并且 return space
或者
- 将数组的大小在所有边上增加
cameraSize/2
,这将有效地增加宽度和高度 cameraSize
,然后到达玩家只能四处移动的位置在坐标 (cameraSize/2,cameraSize/2)
和 (mapWidth-cameraSize/2,mapHeight-cameraSize/2)
中。 (<--
由于二维数组的工作方式以及代码的编写方式,坐标可能为 (y,x)。这样,相机周围总是有填充物,所以不应该有负标记
我正在为一个学校项目做一个基于文本的游戏,我发现自己遇到了一个非常愚蠢的问题。 这个概念很简单,有一张地图、一个玩家、一些怪物和一些物品。 对于地图数据结构,我决定使用具有 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'声明在class开头,调用构造函数时填充
private int cameraSize;
cameraSize = difficulty.GetCameraSize();
class 'difficulty' 与我的问题无关。 我的问题本身是,当我到达边界墙时,我无法让玩家位于中心,因为阵列中没有任何东西可以获取,因为这些是负位置。
有两种解决此类问题的方法。
1) 在你的循环中,检查一个值是否超出范围并手动输出该值。
2) 将您的数组包装在自定义 class 中,忽略超出范围的值。
像这样:
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# 不能 "retrieve values that aren't there",但你有几个选择
- 检查一下你是否试图获得一个负头寸,或者一个太大的头寸,并且 return space
或者
- 将数组的大小在所有边上增加
cameraSize/2
,这将有效地增加宽度和高度cameraSize
,然后到达玩家只能四处移动的位置在坐标(cameraSize/2,cameraSize/2)
和(mapWidth-cameraSize/2,mapHeight-cameraSize/2)
中。 (<--
由于二维数组的工作方式以及代码的编写方式,坐标可能为 (y,x)。这样,相机周围总是有填充物,所以不应该有负标记