//lab1
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();
}
}
}
Ly9sYWIxCnVzaW5nIFN5c3RlbTsKCmNsYXNzIE1pbmVzd2VlcGVyCnsKICAgIHN0YXRpYyB2b2lkIE1haW4oKQogICAgewogICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCI9PT0g0JPQoNCQICfQodCQ0J/QldCgJyA9PT0iKTsKICAgICAgICAKICAgICAgICB0cnkKICAgICAgICB7CiAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoItCo0LjRgNC40L3QsCDQv9C+0LvRjzogIik7CiAgICAgICAgICAgIGludCB3aWR0aCA9IGludC5QYXJzZShDb25zb2xlLlJlYWRMaW5lKCkpOwogICAgICAgICAgICAKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgi0JLQuNGB0L7RgtCwINC/0L7Qu9GPOiAiKTsKICAgICAgICAgICAgaW50IGhlaWdodCA9IGludC5QYXJzZShDb25zb2xlLlJlYWRMaW5lKCkpOwogICAgICAgICAgICAKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgi0JrRltC70YzQutGW0YHRgtGMINC80ZbQvTogIik7CiAgICAgICAgICAgIGludCBtaW5lcyA9IGludC5QYXJzZShDb25zb2xlLlJlYWRMaW5lKCkpOwoKICAgICAgICAgICAgaWYgKG1pbmVzID49IHdpZHRoICogaGVpZ2h0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgi0JfQsNCx0LDQs9Cw0YLQviDQvNGW0L0hIik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNoYXJbLF0gYm9hcmQgPSBuZXcgY2hhcltoZWlnaHQsIHdpZHRoXTsKICAgICAgICAgICAgY2hhclssXSB2aXNpYmxlID0gbmV3IGNoYXJbaGVpZ2h0LCB3aWR0aF07CiAgICAgICAgICAgIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CgogICAgICAgICAgICAvLyDQhtC90ZbRhtGW0LDQu9GW0LfQsNGG0ZbRjwogICAgICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGhlaWdodDsgeSsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgYm9hcmRbeSwgeF0gPSAnICc7CiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZVt5LCB4XSA9ICcuJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8g0KDQvtC30YHRgtCw0LLQu9C10L3QvdGPINC80ZbQvQogICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pbmVzOyBpKyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGludCB4LCB5OwogICAgICAgICAgICAgICAgZG8KICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICB4ID0gcmFuZG9tLk5leHQod2lkdGgpOwogICAgICAgICAgICAgICAgICAgIHkgPSByYW5kb20uTmV4dChoZWlnaHQpOwogICAgICAgICAgICAgICAgfSB3aGlsZSAoYm9hcmRbeSwgeF0gPT0gJ1gnKTsKICAgICAgICAgICAgICAgIGJvYXJkW3ksIHhdID0gJ1gnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyDQl9Cw0L/QvtCy0L3QtdC90L3RjyDRh9C40YHQtdC7CiAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYm9hcmRbeSwgeF0gIT0gJ1gnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvdW50ID0gQ291bnRNaW5lcyhib2FyZCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJvYXJkW3ksIHhdID0gY291bnQgPiAwID8gKGNoYXIpKGNvdW50ICsgJzAnKSA6ICcgJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vINCT0LXQudC80L/Qu9C10LkKICAgICAgICAgICAgYm9vbCBnYW1lT3ZlciA9IGZhbHNlOwogICAgICAgICAgICB3aGlsZSAoIWdhbWVPdmVyKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBQcmludEJvYXJkKHZpc2libGUsIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJcbtCa0L7QvtGA0LTQuNC90LDRgtC4ICh4IHkpOiAiKTsKICAgICAgICAgICAgICAgIHN0cmluZyBpbnB1dCA9IENvbnNvbGUuUmVhZExpbmUoKTsKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKGlucHV0ID09ICJxIikgYnJlYWs7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHN0cmluZ1tdIGNvb3JkcyA9IGlucHV0LlNwbGl0KCk7CiAgICAgICAgICAgICAgICBpZiAoY29vcmRzLkxlbmd0aCAhPSAyKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCLQndC10LLRltGA0L3QuNC5INGE0L7RgNC80LDRgiEg0JLQstC10LTRltGC0YwgeCB5Iik7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFpbnQuVHJ5UGFyc2UoY29vcmRzWzBdLCBvdXQgaW50IHgpIHx8ICFpbnQuVHJ5UGFyc2UoY29vcmRzWzFdLCBvdXQgaW50IHkpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCLQndC10LLRltGA0L3RliDQutC+0L7RgNC00LjQvdCw0YLQuCEiKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoeCA8IDAgfHwgeCA+PSB3aWR0aCB8fCB5IDwgMCB8fCB5ID49IGhlaWdodCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkItCa0L7QvtGA0LTQuNC90LDRgtC4INC/0L7Qt9CwINC80LXQttCw0LzQuCDQv9C+0LvRjyEgKDAte3dpZHRoLTF9LCAwLXtoZWlnaHQtMX0pIik7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKGJvYXJkW3ksIHhdID09ICdYJykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiQk9PTSEg0JLQuCDQv9GA0L7Qs9GA0LDQu9C4ISIpOwogICAgICAgICAgICAgICAgICAgIGdhbWVPdmVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZpc2libGVbeSwgeF0gPT0gJy4nKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIFJldmVhbChib2FyZCwgdmlzaWJsZSwgeCwgeSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKENoZWNrV2luKHZpc2libGUsIGJvYXJkLCB3aWR0aCwgaGVpZ2h0KSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCLQn9C10YDQtdC80L7Qs9CwISIpOwogICAgICAgICAgICAgICAgICAgICAgICBnYW1lT3ZlciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCLQptGPINC60LvRltGC0LjQvdC60LAg0LLQttC1INCy0ZbQtNC60YDQuNGC0LAhIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vINCf0L7QutCw0LfQsNGC0Lgg0LLRgdGWINC80ZbQvdC4INC/0ZbRgdC70Y8g0LPRgNC4CiAgICAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYm9hcmRbeSwgeF0gPT0gJ1gnKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZVt5LCB4XSA9ICdYJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIFByaW50Qm9hcmQodmlzaWJsZSwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpCiAgICAgICAgewogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgkItCf0L7QvNC40LvQutCwOiB7ZXguTWVzc2FnZX0iKTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIGludCBDb3VudE1pbmVzKGNoYXJbLF0gYm9hcmQsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQogICAgewogICAgICAgIGludCBjb3VudCA9IDA7CiAgICAgICAgZm9yIChpbnQgZHkgPSAtMTsgZHkgPD0gMTsgZHkrKykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoaW50IGR4ID0gLTE7IGR4IDw9IDE7IGR4KyspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChkeCA9PSAwICYmIGR5ID09IDApIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBpbnQgbnggPSB4ICsgZHgsIG55ID0geSArIGR5OwogICAgICAgICAgICAgICAgaWYgKG54ID49IDAgJiYgbnggPCB3ICYmIG55ID49IDAgJiYgbnkgPCBoICYmIGJvYXJkW255LCBueF0gPT0gJ1gnKQogICAgICAgICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvdW50OwogICAgfQoKICAgIHN0YXRpYyB2b2lkIFJldmVhbChjaGFyWyxdIGJvYXJkLCBjaGFyWyxdIHZpc2libGUsIGludCB4LCBpbnQgeSwgaW50IHcsIGludCBoKQogICAgewogICAgICAgIGlmICh4IDwgMCB8fCB4ID49IHcgfHwgeSA8IDAgfHwgeSA+PSBoIHx8IHZpc2libGVbeSwgeF0gIT0gJy4nKSAKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIAogICAgICAgIHZpc2libGVbeSwgeF0gPSBib2FyZFt5LCB4XTsKICAgICAgICAKICAgICAgICBpZiAoYm9hcmRbeSwgeF0gPT0gJyAnKQogICAgICAgIHsKICAgICAgICAgICAgZm9yIChpbnQgZHkgPSAtMTsgZHkgPD0gMTsgZHkrKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yIChpbnQgZHggPSAtMTsgZHggPD0gMTsgZHgrKykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZHggPT0gMCAmJiBkeSA9PSAwKSBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICBSZXZlYWwoYm9hcmQsIHZpc2libGUsIHggKyBkeCwgeSArIGR5LCB3LCBoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBzdGF0aWMgYm9vbCBDaGVja1dpbihjaGFyWyxdIHZpc2libGUsIGNoYXJbLF0gYm9hcmQsIGludCB3LCBpbnQgaCkKICAgIHsKICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGg7IHkrKykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoYm9hcmRbeSwgeF0gIT0gJ1gnICYmIHZpc2libGVbeSwgeF0gPT0gJy4nKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBzdGF0aWMgdm9pZCBQcmludEJvYXJkKGNoYXJbLF0gYm9hcmQsIGludCB3LCBpbnQgaCkKICAgIHsKICAgICAgICBDb25zb2xlLldyaXRlKCJcbiAgICIpOwogICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKQogICAgICAgICAgICBDb25zb2xlLldyaXRlKHguVG9TdHJpbmcoKS5QYWRSaWdodCgyKSk7CiAgICAgICAgCiAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlxuICAiICsgbmV3IHN0cmluZygnLScsIHcgKiAyICsgMSkpOwogICAgICAgIAogICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKQogICAgICAgIHsKICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSh5LlRvU3RyaW5nKCkuUGFkUmlnaHQoMikgKyAifCIpOwogICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHc7IHgrKykKICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoYm9hcmRbeSwgeF0gKyAiICIpOwogICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgpOwogICAgICAgIH0KICAgIH0KfQ==