You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现玩家踩中钥匙时使其消失?C#密室逃脱游戏问题

问题:实现玩家踩到钥匙时钥匙消失的功能

我正在制作一款小型密室逃脱游戏,玩家需要收集钥匙才能逃出房间。请问如何实现玩家踩到钥匙时钥匙消失的功能?以下是我目前的代码。由于我在大学还未学习方法相关知识,希望能得到简单的解决方案或帮助,提前感谢!<3

static void Main(string[] args)
{
    ConsoleKeyInfo consoleKey;

    int XPositionCursor = 5;
    int YPositionCursor = 5;

    int MapWidth = 20;
    int MapHeight = 20;

    char Wall = '█';
    bool GameOver = true;
    char Key = '@';
    char Character = 'H';

    int[,] MapGenerationArray = new int[MapWidth, MapHeight];
    Random RandomKeyCoordinate = new Random();
    Random RandomDoorCoordinate = new Random();

    #region Instructions
    Console.WriteLine("Wähle eine Breite für dein Spielfeld:");
    string MapWidthString = Console.ReadLine();
    MapWidth = int.Parse(MapWidthString);
    Console.Clear();

    Console.WriteLine("Wähle eine Höhe für dein Spielfeld:");
    string MapHeightString = Console.ReadLine();
    MapHeight = int.Parse(MapHeightString);
    Console.Clear();

    Console.WriteLine($"Dein Spielfeld wird {MapWidth} x {MapHeight} groß sein!");
    Console.ReadLine();
    #endregion

    Vector2 KeyCoordinate = new Vector2();
    KeyCoordinate.X = RandomKeyCoordinate.Next(1, MapWidth - 1);
    KeyCoordinate.Y = RandomKeyCoordinate.Next(1, MapHeight - 1);

    Vector2 DoorCoordinate1 = new Vector2();
    DoorCoordinate1.X = RandomDoorCoordinate.Next(0, MapWidth);
    DoorCoordinate1.Y = RandomDoorCoordinate.Next(0, 0);

    bool PlayerIsOnKeyPosition = XPositionCursor == KeyCoordinate.X && YPositionCursor == KeyCoordinate.Y;
    bool PlayerCarryingKey = false;

    do
    {
        #region Map
        Console.Clear();

        for (int i = 0; i < MapWidth; i++)
        {
            Console.SetCursorPosition(i, 0);
            Console.Write(Wall);
        }

        for (int i = 0; i < MapWidth; i++)
        {
            Console.SetCursorPosition(i, MapHeight);
            Console.Write(Wall);
        }

        for (int i = 0; i < MapHeight; i++)
        {
            Console.SetCursorPosition(0, i);
            Console.Write(Wall);
        }

        for (int i = 0; i < MapHeight; i++)
        {
            Console.SetCursorPosition(MapWidth, i);
            Console.Write(Wall);
        }
        #endregion

        Console.SetCursorPosition(XPositionCursor, YPositionCursor);
        Console.CursorVisible = false;
        Console.Beep(200, 100);
        Console.Write(Character);

        if (PlayerIsOnKeyPosition)
        {
            PlayerCarryingKey = true;
        }

        if (PlayerCarryingKey == true)
        {
            Console.SetCursorPosition((int)DoorCoordinate1.X, (int)DoorCoordinate1.Y);
            Console.Write(' ');
        }
        else
        {
            Console.SetCursorPosition((int)KeyCoordinate.X, (int)KeyCoordinate.Y);
            Console.Write(Key);

            Console.SetCursorPosition((int)DoorCoordinate1.X, (int)DoorCoordinate1.Y);
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write(Wall);
            Console.ResetColor();
        }

        #region CharacterMovement
        consoleKey = Console.ReadKey(true);

        Console.Clear();

        switch (consoleKey.Key)
        {
            case ConsoleKey.UpArrow:
                YPositionCursor--;
                break;
            case ConsoleKey.DownArrow:
                YPositionCursor++;
                break;
            case ConsoleKey.LeftArrow:
                XPositionCursor--;
                break;
            case ConsoleKey.RightArrow:
                XPositionCursor++;
                break;
        }

        if (YPositionCursor < 1) { YPositionCursor = 1; }
        if (XPositionCursor < 1) { XPositionCursor = 1; }
        if (YPositionCursor >= MapHeight - 1) { YPositionCursor = MapHeight - 1; };
        if (XPositionCursor >= MapWidth - 1) { XPositionCursor = MapWidth - 1; };
        #endregion

    } while (GameOver == true);
}

解决方案

你的代码核心问题是**PlayerIsOnKeyPosition只在初始化时判断了一次**,不会随玩家移动更新状态,因此无法检测到玩家走到钥匙位置的情况。以下是无需使用方法的简单修改方案:

修改步骤

  1. 删除初始化阶段的bool PlayerIsOnKeyPosition = XPositionCursor == KeyCoordinate.X && YPositionCursor == KeyCoordinate.Y;
  2. 将位置判断移到do-while循环内部,每次循环都检查玩家当前位置是否与钥匙位置重合
  3. 拿到钥匙后,将钥匙位置移到地图外,确保钥匙不再被绘制

修改后的完整循环逻辑

do
{
    #region CharacterMovement
    consoleKey = Console.ReadKey(true);

    switch (consoleKey.Key)
    {
        case ConsoleKey.UpArrow:
            YPositionCursor--;
            break;
        case ConsoleKey.DownArrow:
            YPositionCursor++;
            break;
        case ConsoleKey.LeftArrow:
            XPositionCursor--;
            break;
        case ConsoleKey.RightArrow:
            XPositionCursor++;
            break;
    }

    // 边界检测
    if (YPositionCursor < 1) { YPositionCursor = 1; }
    if (XPositionCursor < 1) { XPositionCursor = 1; }
    if (YPositionCursor >= MapHeight - 1) { YPositionCursor = MapHeight - 1; };
    if (XPositionCursor >= MapWidth - 1) { XPositionCursor = MapWidth - 1; };
    #endregion

    // 每次循环都检查是否踩到钥匙
    bool PlayerIsOnKeyPosition = XPositionCursor == KeyCoordinate.X && YPositionCursor == KeyCoordinate.Y;
    if (PlayerIsOnKeyPosition)
    {
        PlayerCarryingKey = true;
        // 将钥匙移到地图外,避免重复触发和绘制
        KeyCoordinate.X = -1;
        KeyCoordinate.Y = -1;
    }

    #region Map绘制
    Console.Clear();

    // 绘制墙壁(保留原有代码)
    for (int i = 0; i < MapWidth; i++)
    {
        Console.SetCursorPosition(i, 0);
        Console.Write(Wall);
    }
    for (int i = 0; i < MapWidth; i++)
    {
        Console.SetCursorPosition(i, MapHeight);
        Console.Write(Wall);
    }
    for (int i = 0; i < MapHeight; i++)
    {
        Console.SetCursorPosition(0, i);
        Console.Write(Wall);
    }
    for (int i = 0; i < MapHeight; i++)
    {
        Console.SetCursorPosition(MapWidth, i);
        Console.Write(Wall);
    }

    // 绘制玩家
    Console.SetCursorPosition(XPositionCursor, YPositionCursor);
    Console.CursorVisible = false;
    Console.Beep(200, 100);
    Console.Write(Character);

    // 绘制钥匙和门
    if (PlayerCarryingKey)
    {
        Console.SetCursorPosition((int)DoorCoordinate1.X, (int)DoorCoordinate1.Y);
        Console.Write(' ');
    }
    else
    {
        // 仅当钥匙在地图范围内时绘制
        if (KeyCoordinate.X >= 1 && KeyCoordinate.X < MapWidth - 1 && KeyCoordinate.Y >= 1 && KeyCoordinate.Y < MapHeight - 1)
        {
            Console.SetCursorPosition((int)KeyCoordinate.X, (int)KeyCoordinate.Y);
            Console.Write(Key);
        }
        Console.SetCursorPosition((int)DoorCoordinate1.X, (int)DoorCoordinate1.Y);
        Console.ForegroundColor = ConsoleColor.Red;
        Console.Write(Wall);
        Console.ResetColor();
    }
    #endregion

} while (GameOver == true);

修改说明

  • 将移动逻辑放在绘制之前,确保每次绘制的都是玩家移动后的最新位置
  • 每次循环重新判断玩家是否踩在钥匙上,保证状态实时更新
  • 拿到钥匙后将钥匙坐标设为-1,彻底避免钥匙再次被绘制或触发拾取逻辑

内容的提问来源于stack exchange,提问作者adtreclove

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 01:31:01