如何使用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
相关产品推荐
相关产品推荐

