Шахматное поле

Рассмотрим как с помощью цикла нарисовать шахматное поле. Шахматное поле представляет собой сетку из черных и белых квадратиков 8 на 8.

Создадим шаблон статической отрисовки

Напишем конструктор

public Form1()
{
    InitializeComponent();
    Paint += Form1_Paint;
    ClientSize = new Size(CellSize * 8, CellSize * 8);
}

int CellSize = 50;  // размер ячейки нашего поля (в пикселях)

Для того чтобы нарисовать двухмерное шахматное поле воспользуемся вложенным циклом. Первый цикл будет пробегаться по столбцам, второй по строкам. Каждый цикл будет выполнять по 8 итераций. Цвет текущего квадрата может быть либо черный либо белый, при переходе к каждой следующей клетке в строке он меняется на противоположный. При переходе на новую строку, он также меняется на противоположный. Введем специальную bool переменную , которая будет хранить текущий выводимый цвет ячейки.

private void Form1_Paint(object? sender, PaintEventArgs e)
{
    e.Graphics.Clear(Color.White);

    bool isBlack = false;  // флаг текущего цвета
    for (int i = 0; i < 8; i++)
    {
        for (int j = 0; j < 8; j++)
        {
            isBlack = !isBlack;  // переключаем цвет каждую ячейку
            e.Graphics.FillRectangle(
                isBlack ? Brushes.Black : Brushes.White,  // цвет текущей клетки
                i * CellSize, // X левого края клетки
            j * CellSize,   // Y верхнего края клетки
                CellSize, CellSize  // ширина и высота клетки
            );
        }
        isBlack = !isBlack;  // переключаем цвет при переходе на новую строку
    }
}

Вставив и запустив данный пример мы увидим следующую картинку:

 

Данный пример наглядно показывает что для раборты с 2х мерными сетками удобно использовать два цикла (один вложен в другой). Тем самым индексаторы пробегаются по каждому элементы 2х мерной структуры данных, в данном случае шахматному полю. В дальнейшем эта техника пригодится нам для обработки двухмерных массивов.

Исходный код данного примера вы можете найти здесь


Упражнения

  • Удалить и не использовать переменную isBlack. Переделать вычисление цвета текущей ячейки используя только счетчтчики i и j (вам пригодится оператор остаток от деления)
  • Замените два цикла на один цикл. Подумайте как получать индекс строки и столбца (вам пригодится оператор остаток от деления) исходя из одного общего счетчика нового цикла, который будет пробегаться по числам от 0 до 63.