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

如何使用C#在Panel数组的前n行上绘制国际跳棋棋子?

代码修改方案

1. 先修复现有代码的两处语法错误

  • Checkerpiece类中定义的半径字段是radii,但绘制方法里调用的是radius,统一字段命名即可
  • 类名定义为Checkerpiece,实例化时写的是CheckerPiece,大小写保持一致避免编译报错

2. 调整棋子绘制逻辑

你代码里的m变量对应棋盘的行索引(0基,取值范围0~7,共8行),直接在绘制棋子的判断分支加行号限制即可,满足需求的逻辑如下:

  • 行索引m < 3(前3行):白色背景格绘制红色棋子
  • 行索引m == 3:空出不绘制
  • 行索引m >= 5(最后3行,索引为5、6、7):白色背景格绘制黑色棋子

修改后的完整代码

Checkerpiece类代码

/*
该类定义跳棋棋子的绘制逻辑
*/
public class Checkerpiece
{
    // 棋子颜色
    Color color;
    // 棋子所在的棋盘格子
    Panel target_square;
    // 圆心坐标
    float center_x;
    float center_y;
    // 棋子半径
    float radius;
    // 构造函数
    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.radius = mypanel.Width / 2;
    }
    // 绘制棋子方法
    public void draw()
    {
        this.target_square.Paint += Target_square_Paint;
    }
    // 重绘事件
    private void Target_square_Paint(object sender, PaintEventArgs e)
    {
        SolidBrush mybrush = new SolidBrush(color);
        fillCircle(e.Graphics, mybrush, this.center_x, this.center_y, this.radius);
    } 
    // 填充圆形方法
    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);
    }
}

Form1类代码

using System;
using System.Drawing;
using System.Windows.Forms;

namespace Checkers
{
    public partial class Form1 : Form
    {
        private Panel[,] _chessBoardPanels;
        public Form1()
        {
            InitializeComponent();
        }
        
        private void Form1_Load(object sender, EventArgs e)
        {
            const int tileSize = 100;
            const int gridSize = 8;
            var clr1 = Color.DarkGray;
            var clr2 = Color.White;

            _chessBoardPanels = new Panel[gridSize, gridSize];

            // n是列索引,m是行索引
            for (var n = 0; n < gridSize; n++)
            {
                for (var m = 0; m < gridSize; m++)
                {
                    var newPanel = new Panel
                    {
                        Size = new Size(tileSize, tileSize),
                        Location = new Point(tileSize * n, tileSize * m)
                    };

                    Controls.Add(newPanel);
                    _chessBoardPanels[n, m] = newPanel;

                    // 绘制棋盘格背景色
                    if (n % 2 == 0)
                        newPanel.BackColor = m % 2 != 0 ? clr1 : clr2;
                    else
                        newPanel.BackColor = m % 2 != 0 ? clr2 : clr1;

                    // 棋子绘制逻辑
                    if (newPanel.BackColor == Color.White)
                    {
                        if (m < 3)
                        {
                            // 前3行白格画红棋
                            new Checkerpiece(newPanel, Color.Red).draw();
                        }
                        else if (m >=5)
                        {
                            // 最后3行白格画黑棋
                            new Checkerpiece(newPanel, Color.Black).draw();
                        }
                        // 中间行不绘制棋子
                    }
                }
            }
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:45:07