How to draw checkerpiece on the first n rows of a panel array with C#?

Viewed 35

I have code that loops through a multidimensional array of panels to draw checkers on them. I have a problem implementing a control structure inside the loop to make sure the red checkers are only drawn on the first three rows, and then skip a row and draw black checkers on the remaining three rows. The code should maintain drawing the checkers on the panels with white background. I already have a loop that makes sure each panel with a white background has a checker on it, my problem is controlling the drawing to simulate a real life checkerboard...

Code

/*This code block contains the class for
the Checkerpiece object drawn on the panel
*/

public class Checkerpiece
    {
        //colors of the rounded pieces
        Color color;
        //specify where the checker is drawn
        Panel target_square;
        //specify the center of the circle
        float center_x;
        float center_y;
        //specify the radius of the checker piece
        float radii;
        //fill the details inside the constructor
        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;
        }
        //this method draws the checkerpiece on the target panel
        public void draw()
        {
            this.target_square.Paint += Target_square_Paint;
            
        }
        //this event will redraw the circles as needed
        private void Target_square_Paint(object sender, PaintEventArgs e)
        {
            
            SolidBrush mybrush = new SolidBrush(color);
             fillCircle(e.Graphics, mybrush, this.center_x, this.center_y,(float) radius);
        } 
 //ellipse(checker) filler method
 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);
        }
}


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Checkers
{
    public partial class Form1 : Form
    {
        private Panel[,] _chessBoardPanels;
        public Form1()
        {
            InitializeComponent();
        }
       

    }
/*Form1 class contains the loops that is responsible for drawing checkers on the board*/


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Checkers
{
    public partial class Form1 : Form
    {
    //declare the panel array
        private Panel[,] _chessBoardPanels;
        public Form1()
        {
            InitializeComponent();
        }
        
        private void Form1_Load(object sender, EventArgs e)
        {
           //controls the size of a single square on the checkerboard
            const int tileSize = 100;
           //controls the number of squares on either side of the board
            const int gridSize = 8;
           //this is fr applying different colors to the board so the pattern is realized
            var clr1 = Color.DarkGray;
            var clr2 = Color.White;

            // initialize the "chess board"
            _chessBoardPanels = new Panel[gridSize, gridSize];

            // double for loop to handle all rows and columns
            for (var n = 0; n < gridSize; n++)
            {
                for (var m = 0; m < gridSize; m++)
                {
                    // create new Panel control which will be one 
                    // chess board tile
                    var newPanel = new Panel
                    {
                        Size = new Size(tileSize, tileSize),
                        Location = new Point(tileSize * n, tileSize * m)
                    };
                  

                    // add to Form's Controls so that they show up
                    Controls.Add(newPanel);

                    // add to our 2d array of panels for future use
                    _chessBoardPanels[n, m] = newPanel;

                    // color the backgrounds
                    if (n % 2 == 0)
                        newPanel.BackColor = m % 2 != 0 ? clr1 : clr2;
                    
                    else
                        newPanel.BackColor = m % 2 != 0 ? clr2 : clr1;
                    //draw a new checker piece if this is true
                    if (newPanel.BackColor == Color.White)
                 new CheckerPiece(newPanel,Color.Red).draw();    
                    else
                        ;
/*I need to add a loop to make sure the red checkers are drawn on the first three rows of each panel that has a white background*/
                }
            }
           
        }
    }


}
1 Answers

This is purely accidental but it works, I assumed the m stands for the columns, so I added this code to the draw logic and got what I wanted.

Code

 //draw a new checker piece
          if (newPanel.BackColor==Color.White &&m<=3)
                new Checkerpiece(newPanel, Color.Red).draw(); 
                       ;
          if (newPanel.BackColor == Color.White && m > 4)
                new Checkerpiece(newPanel, Color.Black).draw();
               

Output

enter image description here

Related