Лабиринт

Создадим двумерный массив map размером 16х16 , который будет содержать информацию обо всем нашем игровом поле.

int[,] map = new int[16, 16];

Изначально все значения в массиве map равны 0, давайте примем обозначение что 0 - это пусто, 1 - это кирпич. 

Давайте ограничим нашу карту стеной из кирпича по ее периметру. 

public void InitBorder()
{
    for (int i = 0; i < map.GetLength(1); i++)
    {
        map[0, i] = 1;
        map[map.GetLength(0) - 1, i] = 1;
    }

    for (int i = 0; i < map.GetLength(0); i++)
    {
        map[i, 0] = 1;
        map[i, map.GetLength(1) - 1] = 1;
    }
}

Напишем функцию отрисовки всей карты. Пройдемся двумя циклами по массиву, таким образом посещяя каждую его ячейку. В случае если в текущей ячейки находится кирпич отрисуем его вызовя функцию DrawBrick

public void DrawMap(Graphics gr)
{
    for (int i = 0; i < map.GetLength(0); i++)
    {
        for (int j = 0; j < map.GetLength(1); j++)
        {
            // рисуем базовую оюводку каждого квадрата на карте
            gr.DrawRectangle(Pens.Silver, i * CellSize, j * CellSize, CellSize, CellSize);
            if (map[i, j] == 1) // если в текущей ячейки на карте содержится кирпич (1 это кирпич), то рисуем его
                DrawBrick(gr, i, j);
        }
    }
}

Напишем функцию отрисовки одной ячейки стены (кирпича):

public void DrawBrick(Graphics gr, int x, int y)
{
   // закрашиваем основным цветом
    gr.FillRectangle(Brushes.Firebrick, x * CellSize, y * CellSize, CellSize, CellSize);
// ниже по коду будет происходить отрисовка декораций внутри самого кирпича
    int brickHeight = 5; // высота кирпича
    for (int i = 0; i < CellSize / brickHeight; i++)
    { // рисуем горизонтальные линии кирпичей
        gr.DrawLine(Pens.Silver, x * CellSize, y * CellSize + i * brickHeight, x * CellSize + CellSize, y * CellSize + i * brickHeight);
    }

    int brickLen = 15; // ширина кирпича
    for (int i = 0; i < CellSize / brickHeight; i += 2)
    {// рисуем вертикальные линии кирпича в четных строках
        gr.DrawLine(Pens.Silver, x * CellSize + brickLen, y * CellSize + brickHeight * i, x * CellSize + brickLen, y * CellSize + brickHeight * (i + 1));
    }
    for (int i = 1; i < CellSize / brickHeight; i += 2)
    {// рисуем вертикальные линии кирпича в нечетных строках
        gr.DrawLine(Pens.Silver, x * CellSize + brickLen / 2, y * CellSize + brickHeight * i, x * CellSize + brickLen / 2, y * CellSize + brickHeight * (i + 1));
        gr.DrawLine(Pens.Silver, x * CellSize + 3 * brickLen / 2, y * CellSize + brickHeight * i, x * CellSize + 3 * brickLen / 2, y * CellSize + brickHeight * (i + 1));
    }
}

Запустив код получим такой результат:

Теперь давайте случайный образом заполним нашу карту стенами.

Создадим функцию заполняющую случайным образом кирпичами нашу карту

const int N = 40;
public void RandomWallsInit()
{
    for (int i = 0; i < N; i++)
    {
        var x = Random.Next(map.GetLength(0));
        var y = Random.Next(map.GetLength(1));
        map[x, y] = 1;
    }
}

 

Теперь добавим игрового персонажа в лабиринт и сделаем возможность управления им и перемещения по лабиринту с помощью клавиатуры