0

Visual Studio で迷路ゲームを作成し、C# でコーディングしています。私は順調に進んでいますが、迷路の壁をしっかりさせる方法を考え出すことに行き詰まっています. 現在、迷路内の壁に到達すると、場所マーカーが壁を通り抜け、青色の壁が削除されます。どうやって通り抜けられない壁を作ろうか考え中です。私はさまざまなステートメントを試し、ユニコードをいじってみましたが、どこにも行けないようです。誰かにヒントがあれば、それは素晴らしいことです!ありがとう。

これが私のコードです:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;

namespace Project4
{
class Program
{
    static void Main(string[] args)
    {
        Console.SetWindowSize(10, 10);
        Console.BackgroundColor = ConsoleColor.White;
        Console.ForegroundColor = ConsoleColor.DarkBlue;

        //Make maze
        Console.WriteLine("");
        Console.WriteLine(" \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 ");
        Console.WriteLine(" \u2588\u0020\u0020\u0020\u0020\u0020\u0020\u2588 ");
        Console.WriteLine(" \u2588\u0020\u2588\u2588\u2588\u2588\u0020\u2588 ");
        Console.WriteLine(" \u2588\u0020\u2588\u0020\u0020\u0020\u0020\u2588 ");
        Console.WriteLine(" \u2588\u0020\u2588\u0020\u2588\u2588\u2588\u2588 ");
        Console.WriteLine(" \u2588\u0020\u2588\u0020\u0020\u0020\u0020\u2588 ");
        Console.WriteLine(" \u2588\u0020\u2588\u2588\u2588\u2588\u0020\u2588 ");
        Console.WriteLine(" \u2588\u0020\u0020\u0020\u0020\u0020\u0020\u2588 ");
        Console.WriteLine(" \u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588 ");
        Console.Write("");

        int col = 7;
        int row = 6;
        Console.SetCursorPosition(col, row);
        Console.Write("*");
        Console.SetCursorPosition(col, row);
        while (true)
        {
            ConsoleKeyInfo info = Console.ReadKey(true);
            if (info.Key == ConsoleKey.W)
            {
                Console.Write(" ");
                Debug.Print("W");
                row--;
            }
            if (info.Key == ConsoleKey.Z)
            {
                Console.Write(" ");
                Debug.Print("Z");
                row++;
            }

            if (info.Key == ConsoleKey.A)
            {
                Console.Write(" ");
                Debug.Print("A");
                col--;
            }

            if (info.Key == ConsoleKey.S)
            {
                Console.Write(" ");
                Debug.Print("S");
                col++;
            }

            Console.SetCursorPosition(col, row);
            Console.Write("*");
            Console.SetCursorPosition(col, row);

            }
        }
    }
}
4

2 に答える 2

0

壁を「堅固」にするということは、基本的に、カーソル位置が壁と重なるような動きを禁止することを意味します。次の解決策を検討してください。

class Program
{
    private const char wallchar = '\u2588';
    private const char mazechar = '\u0020';

    static private bool[][] mazeLayout = 
    {
        new[] {true, true, true, true, true, true, true, true},
        new[] {true, true, true, true, true, true, true, true},
        new[] {true, false, false, false, false, false, false, true},
        new[] {true, false, true, true, true, true, false, true},
        new[] {true, false, true, false, false, false, false, true},
        new[] {true, false, true, false, true, true, true, true},
        new[] {true, false, true, false, false, false, false, true},
        new[] {true, false, true, true, true, true, false, true},
        new[] {true, false, false, false, false, false, false, true},
        new[] {true, true, true, true, true, true, true, true}
    };

    static void Main(string[] args)
    {
        Console.SetWindowSize(10, 10);
        Console.BackgroundColor = ConsoleColor.White;
        Console.ForegroundColor = ConsoleColor.DarkBlue;

        Console.WriteLine("");

        //Make maze
        for (int i = 0; i < mazeLayout.Length; i++)
        {
            for (int j = 0; j < mazeLayout[i].Length; j++)
            {
                Console.Write(mazeLayout[i][j] ? wallchar : mazechar);
            }
            Console.Write("\n");
        }

        Console.WriteLine("");
        int col = 3;
        int row = 6;

        Console.SetCursorPosition(col, row);
        Console.Write("*");
        Console.SetCursorPosition(col, row);
        while (true)
        {
            ConsoleKeyInfo info = Console.ReadKey(true);
            if (info.Key == ConsoleKey.W && !mazeLayout[row - 2][col])
            {
                Console.Write(" ");
                Debug.Print("W");
                row--;
            }
            if (info.Key == ConsoleKey.Z && !mazeLayout[row][col])
            {
                Console.Write(" ");
                Debug.Print("Z");
                row++;
            }

            if (info.Key == ConsoleKey.A && !mazeLayout[row-1][col-1])
            {
                Console.Write(" ");
                Debug.Print("A");
                col--;
            }

            if (info.Key == ConsoleKey.S && !mazeLayout[row-1][col+1])
            {
                Console.Write(" ");
                Debug.Print("S");
                col++;
            }

            Console.SetCursorPosition(col, row);
            Console.Write("*");
            Console.SetCursorPosition(col, row);
        }
    }
}

この線:

if (info.Key == ConsoleKey.S && !mazeLayout[row-1][col+1])
{ ... }

意味:

if (the user pressed S) AND (the move would not move us onto a wall)
then... 
    { go ahead and do the move. }
于 2013-10-30T02:22:22.043 に答える
0

マップを保持する配列を作成し、ゲームをレンダリングするメソッドを作成することをお勧めします。

void Main()
{
    var map=new[]
    {
        new[]{true, true, true, true, true, true, true, true}, 
        new[]{true, false, false, false, false, false, false, true}, 
        new[]{true, false, true, true, true, true, false, true}, 
        new[]{true, false, true, false, false, false, false, true}, 
        new[]{true, false, true, false, true, true, true, true}, 
        new[]{true, false, true, false, false, false, false, true}, 
        new[]{true, false, true, true, true, true, false, true}, 
        new[]{true, false, false, false, false, false, false, true}, 
        new[]{true, true, true, true, true, true, true, true}
    };
    var playerX = 1;
    var playerY = 1;
    RenderMap(map, playerX, playerY);

}

void RenderMap(bool[][] map, int playerX, int playerY)
{

    for(var y = 0; y < map.Length; y++)
    {
        var row = map[y];
        for(var x = 0; x < row.Length; x++)
        {
            var tile = row[x];
            if(x == playerX && y == playerY)
            {
                Console.Write("X");
            }
            else
            {
                Console.Write(tile? "\u2588": " ");
            }
        }
        Console.WriteLine();
    }
}

次のようなことができるようになりました。

if(map[playerY][playerX-1])
{
    //there is a wall to the left of the player's current position
}

...さらに先に進むと、私はあなたのためにあなたのプログラムを書きましたが、これであなたはうまくいくはずです。

于 2013-10-30T02:06:17.907 に答える