C# 控制台在数组中移动

C# console move in array

我正在创建一个小型主机游戏,玩家可以在其中移动一系列对象,并且他必须到达公主那里。我希望数组的元素是地方,所以我有 类 例如沙漠、森林、洞穴和湖泊,所以数组必须由这些对象组成。每个地方都会随机伤害或治疗玩家。任何想法如何让玩家从数组的起始位置移动到公主

我希望数组看起来像这样:

PLAYER  lake      forest  lake
desert  forest    lake    desert
cave    PRINCESS  lake    forest

我正在处理带有控制台键的键。钥匙和我正在为此使用开关盒

while ((keyInfo = Console.ReadKey(true)).Key != ConsoleKey.X)
{
    switch (keyinfo.Key)
    {
        case Console.Key.W
        break;
        case Console.Key.A
        break;
        case Console.Key.S
        break;
        case Console.Key.D
        break;
    }
}

这是我的界面:

interface IPlace
{
    string PlaceName { get; }
    int randomPdamage();
    int randomPgiveHp();
}

我有四个地方:湖泊、森林、洞穴、沙漠,每个地方都实现了IPlace接口:

class Forest : IPlace
{
    public string PlaceName
    {
        get
        {
            return "Forest";
        }
    }

    Random DmgAndHeal = new Random();

    public int randomPdamage()
    {
        int PlaceDamage = DmgAndHeal.Next(5, 20);
        return PlaceDamage;
    }

    public int randomPgiveHp()
    {

        int PlaceHeal = DmgAndHeal.Next(5, 20);
        return PlaceHeal;
    }
}

这是我的主要代码:

static void Main(string[] args)
{
        IPlace desert = new Desert();
        IPlace lake = new Lake();
        IPlace cave = new Cave();
        IPlace forest = new Forest();

        ConsoleKeyInfo keyInfo;

        String[,] values = new string[3, 5] { { "lake", "lake" , "cave" , "forest" , "lake"  },
                                              { "desert" , "forest" , "cave ", "lake" , "desert"  },
                                              { "cave" , "desert", "forest", "lake" , "desert" }}; 

        for (int i = 0; i < values.GetLength(0); i++)
        {
            for (int k = 0; k < values.GetLength(1); k++)
            {
                Console.Write(values[i, k]);
            }

            Console.WriteLine();
        }

        while ((keyInfo = Console.ReadKey(true)).Key != ConsoleKey.X)
        {
            switch (keyInfo.Key)
            {
                case ConsoleKey.W:
                    break;

                case ConsoleKey.D:
                    break;

                case ConsoleKey.S:
                    break;

                case ConsoleKey.A:
                    break;
            }
        }
    }  

我认为让玩家与地图保持在同一个数组中不是个好主意,因为在这种情况下,玩家离开某个单元格后,您不知道该单元格中应该包含什么(湖泊、洞穴、沙漠)等等)

我的建议是:

  1. 在数组中存储不能移动的对象如:

    森林湖森林湖 沙漠森林湖泊沙漠 洞穴湖泊湖泊森林

  2. 存储移动物体的坐标,比如玩家,例如:

    int playerX = 0; int playerY = 0;

或者让它成为玩家对象的属性。

  1. 当您绘制屏幕时,检查玩家是否与当前单元格坐标匹配,以及它是否绘制玩家

        for (int i = 0; i < map.GetLength(0); i++)
        {
            for (int k = 0; k < map.GetLength(1); k++)
            {
                if (playerX == k && playerY == i)
                    DrawPlayer();
                else
                    DrawCell(map[i,k]);
            }
        }
    

通过这种方式移动播放器,您只需更改它的 X 或 Y 位置。

编辑: 将此应用到您的代码后,您应该得到如下内容:

    int playerX = 0; //horizontal coordinate
    int playerY = 0; //vertical coordinate
    ConsoleKey key = ConsoleKey.Separator; //filled with meanless value by default
    do
    {
        switch (key)
        {
            case ConsoleKey.W:
                if (playerY > 0) //check that player will't leave field
                    playerY--;   //change player position
                break;
            case ConsoleKey.D:
                if (playerX < values.GetLength(1) - 1)
                    playerX++;
                break;
            case ConsoleKey.S:
                if (playerY < values.GetLength(0) - 1)
                    playerY++;
                break;
            case ConsoleKey.A:
                if (playerX > 0)
                    playerX--;
                break;
        }

        Console.Clear(); //clear console to redraw field

        for (int i = 0; i < values.GetLength(0); i++)
        {
            for (int k = 0; k < values.GetLength(1); k++)
            {
                if (i == playerY && k == playerX) //check if player in cell [i,k]
                    Console.Write("Player\t"); //draw player
                else
                    Console.Write(values[i, k] + "\t"); //draw place
            }
            Console.WriteLine();
        }
        key = Console.ReadKey(true).Key; //read new key
    }
    while (key != ConsoleKey.X); //exit condition

P。 S. 你可以在这里测试这段代码:tutorialspoint

我猜你问的是如何在控制台中操作已经写入的文本 window。比基本技术如下:

  1. 使用控制台将光标放在您需要的位置 属性:Console.CursorTop 和 Console.CursorLeft 这只是意味着 控制台中放置光标的行和列。
  2. 使用 Console.Write
  3. 写入控制台
  4. 如果您想移动播放器 - 只需使用 Console.MoveBufferArea 即可将控制台中的文本块从指定位置移动到目标位置。
  5. 之后你需要回到之前的玩家位置并恢复现有的位置值(森林、河流等)。