using System.Collections.Generic;
using System.Diagnostics;
public static void Main(string[] args)
var result = mapGenerator(4, 4, 4);
foreach (var item in result)
static readonly Random random = new Random();
static void valueSet(int x, int y, char value, string[] field)
var row = field[y - 1].ToCharArray();
field[y - 1] = new string(row);
static char valueGet(int x, int y, string[] field)
return field[y - 1][x - 1];
static string[] mapGenerator(int width, int height, int bombsCount)
if (width <= 0) throw new ArgumentException("Ширина поля должна быть более нуля");
if (height <= 0) throw new ArgumentException("Высота поля должна быть более нуля");
if (bombsCount <= 0) throw new ArgumentException("Количество «Бомб» должно быть больше нуля");
if (bombsCount > width * height) throw new ArgumentException("Количество «Бомб» превысило площадь поля");
var field = Enumerable.Repeat(new string(_empty, width), height).ToArray();
var bombs = new List<Point>();
var x = random.Next(1, width + 1);
var y = random.Next(1, height + 1);
if (valueGet(x, y, field) != _bomb)
bombs.Add(new Point(x, y));
valueSet(x, y, _bomb, field);
foreach (var item in field)
foreach (var bomb in bombs.AsEnumerable().OrderBy(x => x.Y).ThenBy(x => x.X))
for (int x = -1; x <= 1; x++)
for (int y = -1; y <= 1; y++)
calcBombs(bomb.X + x, bomb.Y + y, width, height, field);
static void calcBombs(int x, int y, int width, int height, string[] field)
if (x < 1 || x > width) return;
if (y < 1 || y > height) return;
if (valueGet(x, y, field) != _empty) return;
var xStart = Math.Max(1, x - 1);
var xEnd = (x == 1 || x == width) ? 2 : 3;
var yStart = Math.Max(1, y - 1);
var yEnd = (y == 1 || y == height) ? 2 : 3;
var res = string.Join("", field.Skip(yStart - 1).Take(yEnd).Select(row => row.Substring(xStart - 1, xEnd)).ToList()).Where(c => c == _bomb).Count();
valueSet(x, y, res.ToString()[0], field);