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

C#跳棋程序如何管理面板数组点击事件并自动恢复旧面板状态

问题根因

你遇到的clicked_squares.Count永远为1的核心原因是:你将clicked_squares定义为了Checkerpiece类的非静态实例成员。每生成一个棋子实例就会独立持有一份clicked_squares列表,点击不同棋子时元素只会存入当前实例自己的列表中,所有列表数据完全不共享,自然每次打印长度都是1。

解决方案

不需要用List存储,同一时间最多只有1个选中的面板,直接用静态变量存储当前选中的实例即可,逻辑更简单高效,修改方案如下:

第一步:修改Checkerpiece类代码

public class Checkerpiece
{ 
    // 静态字段,所有棋子实例共享,存储当前处于选中状态的棋子
    private static Checkerpiece _currentSelected;
    // 实例字段,存储当前棋子对应面板的原始背景色
    private Color _originalPanelBackColor;
    // 存储棋子原始颜色
    Color color;
    Panel target_square;
    float center_x;
    float center_y;
    float radii;

    public Checkerpiece(Panel mypanel,Color color)
    {
        this.color = color;
        this.target_square = mypanel;
        this.center_x = mypanel.Width / 2;
        this.center_y = mypanel.Height / 2;
        this.radii = mypanel.Width / 2;
        // 初始化时保存面板原始背景色
        _originalPanelBackColor = mypanel.BackColor;
        this.target_square.Click += Target_square_Click;
    }

    private void Target_square_Click(object sender, EventArgs e)
    {
        // 先处理上一个选中的棋子
        if (_currentSelected != null)
        {
            // 恢复上一个选中面板的原始背景色
            _currentSelected.target_square.BackColor = _currentSelected._originalPanelBackColor;
            // 重绘上一个棋子为原始颜色
            _currentSelected.Draw();
            // 如果点击的就是当前已选中的棋子,直接取消选中后返回
            if (_currentSelected == this)
            {
                _currentSelected = null;
                return;
            }
        }
        // 设置当前棋子为选中状态
        this.target_square.BackColor = Color.Blue;
        // 重绘当前棋子为白色(Draw方法新增isSelected参数判断颜色)
        this.Draw(isSelected: true);
        // 更新当前选中的实例
        _currentSelected = this;
    }

    // 调整原有的Draw方法,增加是否选中的参数
    public void Draw(bool isSelected = false)
    {
        using (var g = target_square.CreateGraphics())
        {
            var brush = isSelected ? Brushes.White : new SolidBrush(color);
            fillCircle(g, brush, center_x, center_y, radii);
        }
    }

    public static void fillCircle(Graphics g, Brush b, float centerX, float centerY, float radius)
    {
        g.FillEllipse(b, centerX - radius, centerY - radius,
                 radius + radius, radius + radius);
    }

    public Color getCheckerColor()
    {
        return this.color;
    }
}

逻辑说明

  • 静态变量_currentSelected全局唯一,所有棋子共享同一份选中状态存储
  • 每次点击棋子时,先自动恢复上一个选中面板的样式,再处理当前点击的棋子
  • 如果点击的是已选中的棋子,直接取消选中,实现再次点击还原的效果
运行效果

调整后同一时间只会有一个面板处于选中状态,点击新面板时上一个选中面板会自动恢复原始样式,符合预期。
运行效果截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 00:15:04