using System;
class Minesweeper
{
static void Main()
{
Console.WriteLine("=== ГРА 'САПЕР' ===");
try
{
Console.Write("Ширина поля: ");
int width = int.Parse(Console.ReadLine());
Console.Write("Висота поля: ");
int height = int.Parse(Console.ReadLine());
Console.Write("Кількість мін: ");
int mines = int.Parse(Console.ReadLine());
if (mines >= width * height)
{
Console.WriteLine("Забагато мін!");
return;
}
char[,] board = new char[height, width];
char[,] visible = new char[height, width];
Random random = new Random();
// Ініціалізація
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
board[y, x] = ' ';
visible[y, x] = '.';
}
}
// Розставлення мін
for (int i = 0; i < mines; i++)
{
int x, y;
do
{
x = random.Next(width);
y = random.Next(height);
} while (board[y, x] == 'X');
board[y, x] = 'X';
}
// Заповнення чисел
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (board[y, x] != 'X')
{
int count = CountMines(board, x, y, width, height);
board[y, x] = count > 0 ? (char)(count + '0') : ' ';
}
}
}
// Геймплей
bool gameOver = false;
while (!gameOver)
{
PrintBoard(visible, width, height);
Console.Write("\nКоординати (x y): ");
string input = Console.ReadLine();
if (input == "q") break;
string[] coords = input.Split();
if (coords.Length != 2)
{
Console.WriteLine("Невірний формат! Введіть x y");
continue;
}
if (!int.TryParse(coords[0], out int x) || !int.TryParse(coords[1], out int y))
{
Console.WriteLine("Невірні координати!");
continue;
}
if (x < 0 || x >= width || y < 0 || y >= height)
{
Console.WriteLine($"Координати поза межами поля! (0-{width-1}, 0-{height-1})");
continue;
}
if (board[y, x] == 'X')
{
Console.WriteLine("BOOM! Ви програли!");
gameOver = true;
}
else if (visible[y, x] == '.')
{
Reveal(board, visible, x, y, width, height);
if (CheckWin(visible, board, width, height))
{
Console.WriteLine("Перемога!");
gameOver = true;
}
}
else
{
Console.WriteLine("Ця клітинка вже відкрита!");
}
}
// Показати всі міни після гри
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (board[y, x] == 'X')
{
visible[y, x] = 'X';
}
}
}
PrintBoard(visible, width, height);
}
catch (Exception ex)
{
Console.WriteLine($"Помилка: {ex.Message}");
}
}
static int CountMines(char[,] board, int x, int y, int w, int h)
{
int count = 0;
for (int dy = -1; dy <= 1; dy++)
{
for (int dx = -1; dx <= 1; dx++)
{
if (dx == 0 && dy == 0) continue;
int nx = x + dx, ny = y + dy;
if (nx >= 0 && nx < w && ny >= 0 && ny < h && board[ny, nx] == 'X')
count++;
}
}
return count;
}
static void Reveal(char[,] board, char[,] visible, int x, int y, int w, int h)
{
if (x < 0 || x >= w || y < 0 || y >= h || visible[y, x] != '.')
return;
visible[y, x] = board[y, x];
if (board[y, x] == ' ')
{
for (int dy = -1; dy <= 1; dy++)
{
for (int dx = -1; dx <= 1; dx++)
{
if (dx == 0 && dy == 0) continue;
Reveal(board, visible, x + dx, y + dy, w, h);
}
}
}
}
static bool CheckWin(char[,] visible, char[,] board, int w, int h)
{
for (int y = 0; y < h; y++)
{
for (int x = 0; x < w; x++)
{
if (board[y, x] != 'X' && visible[y, x] == '.')
return false;
}
}
return true;
}
static void PrintBoard(char[,] board, int w, int h)
{
Console.Write("\n ");
for (int x = 0; x < w; x++)
Console.Write(x.ToString().PadRight(2));
Console.WriteLine("\n " + new string('-', w * 2 + 1));
for (int y = 0; y < h; y++)
{
Console.Write(y.ToString().PadRight(2) + "|");
for (int x = 0; x < w; x++)
Console.Write(board[y, x] + " ");
Console.WriteLine();
}
}
}
dXNpbmcgU3lzdGVtOwoKY2xhc3MgTWluZXN3ZWVwZXIKewogICAgc3RhdGljIHZvaWQgTWFpbigpCiAgICB7CiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIj09PSDQk9Cg0JAgJ9Ch0JDQn9CV0KAnID09PSIpOwogICAgICAgIAogICAgICAgIHRyeQogICAgICAgIHsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgi0KjQuNGA0LjQvdCwINC/0L7Qu9GPOiAiKTsKICAgICAgICAgICAgaW50IHdpZHRoID0gaW50LlBhcnNlKENvbnNvbGUuUmVhZExpbmUoKSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBDb25zb2xlLldyaXRlKCLQktC40YHQvtGC0LAg0L/QvtC70Y86ICIpOwogICAgICAgICAgICBpbnQgaGVpZ2h0ID0gaW50LlBhcnNlKENvbnNvbGUuUmVhZExpbmUoKSk7CiAgICAgICAgICAgIAogICAgICAgICAgICBDb25zb2xlLldyaXRlKCLQmtGW0LvRjNC60ZbRgdGC0Ywg0LzRltC9OiAiKTsKICAgICAgICAgICAgaW50IG1pbmVzID0gaW50LlBhcnNlKENvbnNvbGUuUmVhZExpbmUoKSk7CgogICAgICAgICAgICBpZiAobWluZXMgPj0gd2lkdGggKiBoZWlnaHQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCLQl9Cw0LHQsNCz0LDRgtC+INC80ZbQvSEiKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2hhclssXSBib2FyZCA9IG5ldyBjaGFyW2hlaWdodCwgd2lkdGhdOwogICAgICAgICAgICBjaGFyWyxdIHZpc2libGUgPSBuZXcgY2hhcltoZWlnaHQsIHdpZHRoXTsKICAgICAgICAgICAgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKCiAgICAgICAgICAgIC8vINCG0L3RltGG0ZbQsNC70ZbQt9Cw0YbRltGPCiAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBib2FyZFt5LCB4XSA9ICcgJzsKICAgICAgICAgICAgICAgICAgICB2aXNpYmxlW3ksIHhdID0gJy4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyDQoNC+0LfRgdGC0LDQstC70LXQvdC90Y8g0LzRltC9CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWluZXM7IGkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaW50IHgsIHk7CiAgICAgICAgICAgICAgICBkbwogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHggPSByYW5kb20uTmV4dCh3aWR0aCk7CiAgICAgICAgICAgICAgICAgICAgeSA9IHJhbmRvbS5OZXh0KGhlaWdodCk7CiAgICAgICAgICAgICAgICB9IHdoaWxlIChib2FyZFt5LCB4XSA9PSAnWCcpOwogICAgICAgICAgICAgICAgYm9hcmRbeSwgeF0gPSAnWCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vINCX0LDQv9C+0LLQvdC10L3QvdGPINGH0LjRgdC10LsKICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChib2FyZFt5LCB4XSAhPSAnWCcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBDb3VudE1pbmVzKGJvYXJkLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgYm9hcmRbeSwgeF0gPSBjb3VudCA+IDAgPyAoY2hhcikoY291bnQgKyAnMCcpIDogJyAnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8g0JPQtdC50LzQv9C70LXQuQogICAgICAgICAgICBib29sIGdhbWVPdmVyID0gZmFsc2U7CiAgICAgICAgICAgIHdoaWxlICghZ2FtZU92ZXIpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIFByaW50Qm9hcmQodmlzaWJsZSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIlxu0JrQvtC+0YDQtNC40L3QsNGC0LggKHggeSk6ICIpOwogICAgICAgICAgICAgICAgc3RyaW5nIGlucHV0ID0gQ29uc29sZS5SZWFkTGluZSgpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gInEiKSBicmVhazsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgc3RyaW5nW10gY29vcmRzID0gaW5wdXQuU3BsaXQoKTsKICAgICAgICAgICAgICAgIGlmIChjb29yZHMuTGVuZ3RoICE9IDIpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoItCd0LXQstGW0YDQvdC40Lkg0YTQvtGA0LzQsNGCISDQktCy0LXQtNGW0YLRjCB4IHkiKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIWludC5UcnlQYXJzZShjb29yZHNbMF0sIG91dCBpbnQgeCkgfHwgIWludC5UcnlQYXJzZShjb29yZHNbMV0sIG91dCBpbnQgeSkpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoItCd0LXQstGW0YDQvdGWINC60L7QvtGA0LTQuNC90LDRgtC4ISIpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh4IDwgMCB8fCB4ID49IHdpZHRoIHx8IHkgPCAwIHx8IHkgPj0gaGVpZ2h0KQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQi0JrQvtC+0YDQtNC40L3QsNGC0Lgg0L/QvtC30LAg0LzQtdC20LDQvNC4INC/0L7Qu9GPISAoMC17d2lkdGgtMX0sIDAte2hlaWdodC0xfSkiKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoYm9hcmRbeSwgeF0gPT0gJ1gnKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJCT09NISDQktC4INC/0YDQvtCz0YDQsNC70LghIik7CiAgICAgICAgICAgICAgICAgICAgZ2FtZU92ZXIgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmlzaWJsZVt5LCB4XSA9PSAnLicpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgUmV2ZWFsKGJvYXJkLCB2aXNpYmxlLCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoQ2hlY2tXaW4odmlzaWJsZSwgYm9hcmQsIHdpZHRoLCBoZWlnaHQpKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoItCf0LXRgNC10LzQvtCz0LAhIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGdhbWVPdmVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoItCm0Y8g0LrQu9GW0YLQuNC90LrQsCDQstC20LUg0LLRltC00LrRgNC40YLQsCEiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8g0J/QvtC60LDQt9Cw0YLQuCDQstGB0ZYg0LzRltC90Lgg0L/RltGB0LvRjyDQs9GA0LgKICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChib2FyZFt5LCB4XSA9PSAnWCcpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlW3ksIHhdID0gJ1gnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgUHJpbnRCb2FyZCh2aXNpYmxlLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleCkKICAgICAgICB7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCQi0J/QvtC80LjQu9C60LA6IHtleC5NZXNzYWdlfSIpOwogICAgICAgIH0KICAgIH0KCiAgICBzdGF0aWMgaW50IENvdW50TWluZXMoY2hhclssXSBib2FyZCwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCiAgICB7CiAgICAgICAgaW50IGNvdW50ID0gMDsKICAgICAgICBmb3IgKGludCBkeSA9IC0xOyBkeSA8PSAxOyBkeSsrKQogICAgICAgIHsKICAgICAgICAgICAgZm9yIChpbnQgZHggPSAtMTsgZHggPD0gMTsgZHgrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGR4ID09IDAgJiYgZHkgPT0gMCkgY29udGludWU7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGludCBueCA9IHggKyBkeCwgbnkgPSB5ICsgZHk7CiAgICAgICAgICAgICAgICBpZiAobnggPj0gMCAmJiBueCA8IHcgJiYgbnkgPj0gMCAmJiBueSA8IGggJiYgYm9hcmRbbnksIG54XSA9PSAnWCcpCiAgICAgICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY291bnQ7CiAgICB9CgogICAgc3RhdGljIHZvaWQgUmV2ZWFsKGNoYXJbLF0gYm9hcmQsIGNoYXJbLF0gdmlzaWJsZSwgaW50IHgsIGludCB5LCBpbnQgdywgaW50IGgpCiAgICB7CiAgICAgICAgaWYgKHggPCAwIHx8IHggPj0gdyB8fCB5IDwgMCB8fCB5ID49IGggfHwgdmlzaWJsZVt5LCB4XSAhPSAnLicpIAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgCiAgICAgICAgdmlzaWJsZVt5LCB4XSA9IGJvYXJkW3ksIHhdOwogICAgICAgIAogICAgICAgIGlmIChib2FyZFt5LCB4XSA9PSAnICcpCiAgICAgICAgewogICAgICAgICAgICBmb3IgKGludCBkeSA9IC0xOyBkeSA8PSAxOyBkeSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKGludCBkeCA9IC0xOyBkeCA8PSAxOyBkeCsrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChkeCA9PSAwICYmIGR5ID09IDApIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIFJldmVhbChib2FyZCwgdmlzaWJsZSwgeCArIGR4LCB5ICsgZHksIHcsIGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHN0YXRpYyBib29sIENoZWNrV2luKGNoYXJbLF0gdmlzaWJsZSwgY2hhclssXSBib2FyZCwgaW50IHcsIGludCBoKQogICAgewogICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKQogICAgICAgIHsKICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChib2FyZFt5LCB4XSAhPSAnWCcgJiYgdmlzaWJsZVt5LCB4XSA9PSAnLicpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHN0YXRpYyB2b2lkIFByaW50Qm9hcmQoY2hhclssXSBib2FyZCwgaW50IHcsIGludCBoKQogICAgewogICAgICAgIENvbnNvbGUuV3JpdGUoIlxuICAgIik7CiAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspCiAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoeC5Ub1N0cmluZygpLlBhZFJpZ2h0KDIpKTsKICAgICAgICAKICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiXG4gICIgKyBuZXcgc3RyaW5nKCctJywgdyAqIDIgKyAxKSk7CiAgICAgICAgCiAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspCiAgICAgICAgewogICAgICAgICAgICBDb25zb2xlLldyaXRlKHkuVG9TdHJpbmcoKS5QYWRSaWdodCgyKSArICJ8Iik7CiAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKQogICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZShib2FyZFt5LCB4XSArICIgIik7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7CiAgICAgICAgfQogICAgfQp9