C#迷宫游戏问题:到达终点未弹出“end game”提示
问题分析与解决
核心问题
你把通关碰撞判断放在了Form1_Load方法里,这个方法只会在窗体初始化加载时执行一次。玩家移动过程中,程序完全没有再检查PlayerPictureBox和endPointPictureBox是否相交,自然不会触发通关提示。
次要问题
- 道路判断逻辑错误:当前的
isRoad是判断玩家当前所在格子是否为道路,但实际应该判断移动方向的下一个格子是否可通行。否则玩家会直接走到墙里才触发位置重置,逻辑不符合迷宫游戏的常规设计。 - 拼写错误:
ResetLocaiton应该是ResetLocation(少了字母c),虽然编译器可能不报错,但属于不良编码习惯。
修正方案
- 把通关判断移到玩家移动后的逻辑里,每次移动(或重置位置)后都检查是否到达终点
- 修正道路判断逻辑,提前验证移动目标格子是否可通行
修改后的ProcessCmdKey代码如下:
protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { int targetX = PlayerPictureBox.Left; int targetY = PlayerPictureBox.Top; bool canMove = false; switch (keyData) { case Keys.Left: targetX -= 10; // 验证左侧目标格子是否为道路 canMove = mazeTiles[(targetX - 25) / TILESIZE, (PlayerPictureBox.Top - 10) / TILESIZE].BackColor != Color.Black; break; case Keys.Right: targetX += 10; canMove = mazeTiles[(targetX - 25) / TILESIZE, (PlayerPictureBox.Top - 10) / TILESIZE].BackColor != Color.Black; break; case Keys.Up: targetY -= 10; canMove = mazeTiles[(PlayerPictureBox.Left - 25) / TILESIZE, (targetY - 10) / TILESIZE].BackColor != Color.Black; break; case Keys.Down: targetY += 10; canMove = mazeTiles[(PlayerPictureBox.Left - 25) / TILESIZE, (targetY - 10) / TILESIZE].BackColor != Color.Black; break; default: return base.ProcessCmdKey(ref msg, keyData); } if (canMove) { PlayerPictureBox.Left = targetX; PlayerPictureBox.Top = targetY; } else { ResetLocation(); // 修正拼写错误 } // 每次操作后检查是否到达终点 if (PlayerPictureBox.Bounds.IntersectsWith(endPointPictureBox.Bounds)) { MessageBox.Show("end game"); // 可选:添加游戏结束后的逻辑,比如禁用方向键 // this.Enabled = false; } return true; }
- 删除
Form1_Load方法里的无用碰撞判断,因为窗体加载时玩家不可能在终点位置。
内容的提问来源于stack exchange,提问作者user20220222
相关产品推荐
相关产品推荐

