Лабиринт
Создадим двумерный массив 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;
}
}

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