0

私は C# でローグライクを作成しようとしています。小さなマップと、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) のコンソールにあるものを確認しないでください。代わりに、コンソールにあるものを表示するマップを確認してください。#その方がはるかに簡単です。

しかし、多次元配列でマップを作成したとしましょう...では、コンソールに配列を出力するにはどうすればよいですか?

Google を使用してください。この質問から私が得たものは次のとおりです。

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

これが行うことは、行ごとに配列をトラバースし、行の各文字を出力することです。行の終わりに達すると、新しい行を印刷し、新しい行の印刷を開始します。あなたの配列は、おそらくマップを表す 2 次元の文字配列です。同様に、次のような方法でプレーヤーの位置を追跡できます。

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 に答える