如何实现玩家踩中钥匙时使其消失?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只在初始化时判断了一次**,不会随玩家移动更新状态,因此无法检测到玩家走到钥匙位置的情况。以下是无需使用方法的简单修改方案:
修改步骤
- 删除初始化阶段的
bool PlayerIsOnKeyPosition = XPositionCursor == KeyCoordinate.X && YPositionCursor == KeyCoordinate.Y; - 将位置判断移到
do-while循环内部,每次循环都检查玩家当前位置是否与钥匙位置重合 - 拿到钥匙后,将钥匙位置移到地图外,确保钥匙不再被绘制
修改后的完整循环逻辑
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
相关产品推荐
相关产品推荐

