更新:下部の編集3を参照してください。
私はC#とプログラミング全般の初心者です(だから優しくしてください!)。私はたくさんのチュートリアルに従い、本を読み、クラスを理解したと思いました。今まで。
2D文字列配列を使用して文字E(空の場合)とF(完全の場合)の10x10グリッドを設定する非常に単純なシングルクラスプロジェクトがあります。intxとintyを使用して配列の座標を参照し、switchを使用して入力を検出し、xとyに加算または減算して、配列セルが空か満杯かを判断します。
class MainGame
{
public MainGame()
{
string[,] mapTerr = new string[10, 10]
{
{ "F", "F", "F", "F", "F", "F", "F", "F", "F", "F" },
{ "F", "E", "E", "E", "E", "E", "E", "E", "E", "F" },
{ "F", "E", "E", "E", "E", "E", "E", "E", "E", "F" },
{ "F", "E", "E", "E", "E", "E", "E", "E", "E", "F" },
{ "F", "E", "E", "E", "E", "E", "E", "E", "E", "F" },
{ "F", "E", "E", "E", "E", "E", "E", "E", "E", "F" },
{ "F", "E", "E", "E", "E", "E", "E", "E", "E", "F" },
{ "F", "E", "E", "E", "E", "E", "E", "E", "E", "F" },
{ "F", "E", "E", "E", "E", "E", "E", "E", "E", "F" },
{ "F", "F", "F", "F", "F", "F", "F", "F", "F", "F" },
}; // long-winded I know, but helps visualise the array
int x, y;
string navDir;
Console.WriteLine("Enter a command:");
navDir = Console.ReadLine();
switch (navDir)
{
case "N":
case "n":
x -= 1;
if (mapTerr[x, y] == "F")
{
Console.WriteLine("You cannot move North, it is blocked!");
x += 1;
}
else
{
Console.WriteLine("You move North.");
}
break;
case "E":
case "e":
y += 1;
if (mapTerr[x, y] == "F")
{
Console.WriteLine("You cannot move East, it is blocked!");
y -= 1;
}
else
{
Console.WriteLine("You move East.");
}
break;
// etc...
これは正常に機能します。ただし、私はそれを別々のクラスに分割しようとしました。1つは配列を作成するためのもので、もう1つは入力と出力を制御するためのものです。これは私の試みです:
class Program
{
public static void Main(string[] args)
{
Map map = new Map();
UserControl usercontrol = new UserControl();
}
}
class Map
{
string[,] mapTerr = new string[10, 10] {
{ // array contents here
};
}
class UserControl
{
int x, y;
string navDir;
public UserControl()
{
Console.WriteLine("Enter a command:");
navDir = Console.ReadLine();
switch (navDir)
{
case "N":
case "n":
x -= 1;
if (mapTerr[x, y] == "F") // ERROR: The name 'mapTerr' does not exit in the current context"
{
Console.WriteLine("You cannot move North, it is blocked!");
x += 1;
}
else
{
Console.WriteLine("You move North.");
}
break;
// etc...
私はそれを機能させる方法を一生理解することができません。エラーは主に、スイッチ内からアレイが呼び出された場合に発生します。
これは、配列がUserControlクラスではなくMapクラスに関連付けられているためだと思います。それでは、配列を表示/使用可能にするにはどうすればよいですか?
ここやオンラインの他の場所で配列/スコープ/クラスのセクションをトロールしているにもかかわらず、単純な言葉で物事を完全に説明するものは何もありません。私はそれが範囲の問題だと思います、そして私は不可能な方法で物事への参照を呼び出そうとしています。誰かが私が間違っていることを説明し、おそらく私が物事について正しい道を進むことができる方法を示唆することができれば、私はそれを本当に感謝します!(長い説明/質問をお詫びします)
編集1:行の横にコメントとして特定のエラーメッセージを追加しました。これは、mapTerrがスイッチ内で参照されるすべての行で発生します。
編集2:インスタンス化とクラス構造を明確にしました。
編集3:さて、文字列配列はMapクラスに公開されており、Programクラスでmapクラスをインスタンス化しますが、 ...public string[,] elsaNav = new string[10, 10] {{/*contents*/};
を使用しているにもかかわらず、UserControlクラス内からmapTerr配列を呼び出すことはできません。map.mapTerr