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

C#扫雷游戏中区分鼠标左右点击的实现问题

扫雷游戏左右点击区分问题的解决方案

你的代码核心逻辑错误:控件初始化循环里根本不会触发鼠标点击事件,所以里面判断MouseEventArgs的代码在创建格子时完全不会执行,自然区分不了左右键。

修正思路

  1. 放弃Click事件,改用MouseDown事件——这个事件能直接获取鼠标按键类型,适合区分左右键操作。
  2. 每个格子控件初始化时,一次性绑定MouseDown事件,不用在循环里判断点击状态。
  3. 在事件处理方法里,通过sender获取点击的格子,再区分按键执行对应逻辑。

修正后的完整代码

控件初始化部分

for (int a = 0; a < BoardSize; a++)
{
    for (int d = 0; d < BoardSize; d++)
    {
        cov[a, d] = new PictureBox();
        cov[a, d].Height = 30;                              // 和隐藏层PictureBox尺寸一致
        cov[a, d].Width = 30;
        cov[a, d].Left = (a * 40) + 25;
        cov[a, d].Top = (d * 40) + 25;
        cov[a, d].BackColor = Color.Plum;                   // 格子覆盖层颜色
        cov[a, d].BringToFront();
        // 把格子坐标存到Tag里,方便事件中获取当前点击的是哪个格子
        cov[a, d].Tag = new Point(a, d);
        this.Controls.Add(cov[a, d]);
        // 绑定MouseDown事件,统一处理左右点击
        cov[a, d].MouseDown += Grid_MouseDown;
    }
}

鼠标事件处理方法

private void Grid_MouseDown(object sender, MouseEventArgs e)
{
    PictureBox clickedGrid = sender as PictureBox;
    if (clickedGrid == null) return;

    // 从Tag取出当前格子的坐标
    Point gridPos = (Point)clickedGrid.Tag;
    int a = gridPos.X;
    int d = gridPos.Y;

    if (e.Button == MouseButtons.Left)
    {
        // 执行左键清格逻辑,直接调用你已有的leftClick方法
        leftClick(sender, e);
    }
    else if (e.Button == MouseButtons.Right)
    {
        // 执行右键插旗逻辑,这里替换成你的插旗代码即可
        MessageBox.Show($"右键点击了格子 ({a}, {d})");
        // 示例:切换旗帜图片
        // clickedGrid.Image = clickedGrid.Image == null ? Properties.Resources.Flag : null;
    }
}

关键修改点说明

  • 事件选择:Click事件不区分左右键,且无法获取按键信息;MouseDown是更适合的选择,能通过e.Button精准判断左键/右键。
  • 坐标存储:用Tag属性绑定格子坐标,避免在事件中通过控件位置反向计算,逻辑更清晰。
  • 事件绑定时机:每个格子只需要在初始化时绑定一次事件,原代码把事件绑定放在点击判断里,完全搞反了逻辑顺序。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 17:35:13