0

私は現在、ヘビのゲームに取り組んでおり、尻尾が頭に追従するようにするのに苦労しています。私は現在それを機能させようとしており、約12の異なるアイデアを試しましたが、そのすべてが完全に失速するか(たとえば、ヘビが1か所で凍っているように見えます)、または垂直方向の動きがまったく発生しません。ある動きが別の動きに続くのではなく、一度に尻尾のポイント。また、避けられないように思われる Console.Clear() メソッドにも問題があります。何度もやりすぎて、ヘビの最初のポイント以外のすべてが削除されるか、そうしないと古い位置が消去されません。コードは次のとおりです (コードが機能することを確認する必要があるため、実際のゲームから分割されたテスト コードです)。

class Program
{
    const int size = 10;
    struct Sprite
    {
        public char[] ch;
        public int[,] posXY;
        public int directionX;
        public int directionY;
    }
    static void Main(string[] args)
    {
        int startX = 10;
        int startY;
        Sprite player = new Sprite();
        player.ch = new char[7];
        player.posXY = new int[7,2];
        for (int i = 0; i < player.ch.Length; i++)
        {
            player.ch[i] = '*';
        }
        for (int i = 0; i < 7; i++)
        {
            startY = 10;
            player.posXY[i, 0] = startX;
            player.posXY[i, 1] = startY;
            startX--;
        }
        ConsoleKeyInfo cki = new ConsoleKeyInfo();
        while (true)
        {
            update(cki, ref player);
            draw(player);
            Thread.Sleep(200);
        }//end while
    }//end main
    static void update(ConsoleKeyInfo cki, ref Sprite player)
    {
        if (Console.KeyAvailable)
        {
            cki = Console.ReadKey(true);
            if (cki.Key == ConsoleKey.LeftArrow || cki.Key == ConsoleKey.A)
            {
                player.directionX = -1;
                player.directionY = 0;
            }
            if (cki.Key == ConsoleKey.RightArrow || cki.Key == ConsoleKey.D)
            {
                player.directionX = 1;
                player.directionY = 0;
            }
            if (cki.Key == ConsoleKey.UpArrow || cki.Key == ConsoleKey.W)
            {
                player.directionX = 0;
                player.directionY = -1;
            }
            if (cki.Key == ConsoleKey.DownArrow || cki.Key == ConsoleKey.S)
            {
                player.directionX = 0;
                player.directionY = 1;
            }
        }//endif
        for (int i = 0; i < 7; i++)
        {
            player.posXY[i, 0] = player.posXY[i, 0] + player.directionX;
            player.posXY[i, 1] = player.posXY[i, 1] + player.directionY;
        }
    }//end update
    static void draw(Sprite player)
    {
        Console.Clear();
        for (int i = 0; i < 7; i++)
        {
            Console.SetCursorPosition(player.posXY[i, 0], player.posXY[i, 1]);
            Console.Write(player.ch[i]);
        }
    }//end draw

}

PS私はスネークに構造体を使用する必要があります。クラスを使用することはオプションではありません。

4

1 に答える 1

1

「スネーク」ゲームを説明するのに最適なデータ構造はキューです。テールから1つの「アイテム」をデキュー(「アンドロー」)し、新しい座標をヘッドとして新しいアイテムをエンキュー(「ドロー」)できるようにします。たまたま「リンゴ」にある場合は、1回のデキュー操作をスキップするか、2回エンキューします。

キューのデータ構造に慣れていない場合は、次の拳を見てください: http://en.wikipedia.org/wiki/Queue_(abstract_data_type)

ここで .net フレームワークのデフォルトのキューを見てください: http://msdn.microsoft.com/en-us/library/7977ey2c.aspx

于 2012-11-02T13:08:07.940 に答える