Загрузка данных
using System;
using Avalonia.Controls;
using Avalonia.Interactivity;
using Avalonia.Media;
namespace MorskoyBoy
{
public partial class MainWindow : Window
{
// 0 = тут пусто и мокро
// 1 = тут сидит кораблик
// 2 = мазила (пустое место с дыркой)
// 3 = попал нафиг (горит)
int[,] pole_patsana_odin = new int[10, 10];
int[,] pole_patsana_dva = new int[10, 10];
// Кнопки лежат тут чтобы тыкать в них
Button[,] knopki_pervogo = new Button[10, 10];
Button[,] knopki_vtorogo = new Button[10, 10];
bool igraem_s_tupym_botom = true;
int kto_shas_babaet = 1; // 1 это первый пацан, 2 это второй
bool igra_vsyo_konchilas = false;
int schetchik_pervogo = 0;
int schetchik_vtorogo = 0;
bool rezhim_yadernogo_udara = false;
Random shaitan_mashina = new Random();
public MainWindow()
{
InitializeComponent();
nakolotit_knopok();
}
// --- ВХОД В ХАТУ ---
private void knopka_vhod_k_zhelezyake(object? sender, RoutedEventArgs e)
{
igraem_s_tupym_botom = true;
NadzorZaVtorym.Text = "ЗАГОН ЖЕЛЕЗЯКИ";
vhod();
}
private void knopka_vhod_s_kentom(object? sender, RoutedEventArgs e)
{
igraem_s_tupym_botom = false;
NadzorZaVtorym.Text = "ЗАГОН ВТОРОГО ПАЦАНА";
vhod();
}
private void vhod()
{
PalkaMenu.IsVisible = false;
BolshayaPolyana.IsVisible = true;
davay_po_novoy();
}
private void nazad_nafig(object? sender, RoutedEventArgs e)
{
BolshayaPolyana.IsVisible = false;
PalkaMenu.IsVisible = true;
}
private void perezapustit_etu_dich(object? sender, RoutedEventArgs e)
{
davay_po_novoy();
}
// --- СОЗДАНИЕ КНОПОК РУКАМИ ---
private void nakolotit_knopok()
{
// Лепим 100 кнопок первому пацану
for (int r = 0; r < 10; r++)
{
for (int c = 0; c < 10; c++)
{
int ryad = r;
int kolonna = c;
Button knopochka = new Button();
knopochka.Margin = new Avalonia.Thickness(1);
knopochka.HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Stretch;
knopochka.VerticalAlignment = Avalonia.Layout.VerticalAlignment.Stretch;
knopochka.Click += (s, e) => tyk_po_pervomu_polu(ryad, kolonna);
knopki_pervogo[r, c] = knopochka;
Zagon1.Children.Add(knopochka);
}
}
// Лепим 100 кнопок второму пацану
for (int r = 0; r < 10; r++)
{
for (int c = 0; c < 10; c++)
{
int ryad = r;
int kolonna = c;
Button knopochka = new Button();
knopochka.Margin = new Avalonia.Thickness(1);
knopochka.HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Stretch;
knopochka.VerticalAlignment = Avalonia.Layout.VerticalAlignment.Stretch;
knopochka.Click += (s, e) => tyk_po_vtoromu_polu(ryad, kolonna);
knopki_vtorogo[r, c] = knopochka;
Zagon2.Children.Add(knopochka);
}
}
}
// --- ТУПОЙ РЕСЕТ И ТУПАЯ РАССТАНОВКА ---
private void davay_po_novoy()
{
kto_shas_babaet = 1;
schetchik_pervogo = 0;
schetchik_vtorogo = 0;
rezhim_yadernogo_udara = false;
igra_vsyo_konchilas = false;
ochistit_pole(pole_patsana_odin);
ochistit_pole(pole_patsana_dva);
// Швыряем корабли тупым способом: просто забиваем клетки!
zasunut_korabli_v_tupuyu(pole_patsana_odin);
zasunut_korabli_v_tupuyu(pole_patsana_dva);
pokrasit_vsyo_nafig();
}
private void ochistit_pole(int[,] pole)
{
for (int r = 0; r < 10; r++)
{
for (int c = 0; c < 10; c++)
{
pole[r, c] = 0;
}
}
}
// Метод дуболома: тыкаем корабли по фиксированным шаблонам со сдвигом
private void zasunut_korabli_v_tupuyu(int[,] pole)
{
int sdvig = shaitan_mashina.Next(0, 3);
// Четырехпалубный (длинная палка)
pole[0, 0 + sdvig] = 1;
pole[0, 1 + sdvig] = 1;
pole[0, 2 + sdvig] = 1;
pole[0, 3 + sdvig] = 1;
// Трехпалубный номер 1
pole[2, 0 + sdvig] = 1;
pole[2, 1 + sdvig] = 1;
pole[2, 2 + sdvig] = 1;
// Трехпалубный номер 2
pole[4, 0 + sdvig] = 1;
pole[4, 1 + sdvig] = 1;
pole[4, 2 + sdvig] = 1;
// Двухпалубный номер 1
pole[6, 0 + sdvig] = 1;
pole[6, 1 + sdvig] = 1;
// Двухпалубный номер 2
pole[6, 5 + sdvig] = 1;
pole[6, 6 + sdvig] = 1;
// Однопалубные шмакодявки
pole[8, 0] = 1;
pole[8, 3] = 1;
pole[8, 6] = 1;
pole[9, 8] = 1;
}
// --- СТРЕЛЬБА ДЛЯ ТУПЫХ ---
private void nazhata_knopka_babaha(object? sender, RoutedEventArgs e)
{
int zaryad = (kto_shas_babaet == 1) ? schetchik_pervogo : schetchik_vtorogo;
if (zaryad >= 5)
{
rezhim_yadernogo_udara = !rezhim_yadernogo_udara;
pokrasit_vsyo_nafig();
}
}
private void tyk_po_pervomu_polu(int r, int c)
{
// Сюда имеет право бить только второй пацан
if (igra_vsyo_konchilas) return;
if (kto_shas_babaet != 2) return;
if (igraem_s_tupym_botom) return; // Человек не может стрелять за бота
strelyat_po_faktu(pole_patsana_odin, r, c);
}
private void tyk_po_vtoromu_polu(int r, int c)
{
// Сюда имеет право бить только первый пацан
if (igra_vsyo_konchilas) return;
if (kto_shas_babaet != 1) return;
strelyat_po_faktu(pole_patsana_dva, r, c);
}
private void strelyat_po_faktu(int[,] chuzhoe_pole, int r, int c)
{
// Если уже туда стреляли обычным пуком — игнорим
if (!rezhim_yadernogo_udara && (chuzhoe_pole[r, c] == 2 || chuzhoe_pole[r, c] == 3))
{
return;
}
if (rezhim_yadernogo_udara)
{
// Самый тупой в мире бабах 3x3: просто 9 строк подряд в лоб!
udarit_odnu_kletku(chuzhoe_pole, r - 1, c - 1);
udarit_odnu_kletku(chuzhoe_pole, r - 1, c);
udarit_odnu_kletku(chuzhoe_pole, r - 1, c + 1);
udarit_odnu_kletku(chuzhoe_pole, r, c - 1);
udarit_odnu_kletku(chuzhoe_pole, r, c);
udarit_odnu_kletku(chuzhoe_pole, r, c + 1);
udarit_odnu_kletku(chuzhoe_pole, r + 1, c - 1);
udarit_odnu_kletku(chuzhoe_pole, r + 1, c);
udarit_odnu_kletku(chuzhoe_pole, r + 1, c + 1);
if (kto_shas_babaet == 1) schetchik_pervogo = 0;
if (kto_shas_babaet == 2) schetchik_vtorogo = 0;
rezhim_yadernogo_udara = false;
}
else
{
// Обычный одиночный тык
udarit_odnu_kletku(chuzhoe_pole, r, c);
if (kto_shas_babaet == 1 && schetchik_pervogo < 5) schetchik_pervogo++;
if (kto_shas_babaet == 2 && schetchik_vtorogo < 5) schetchik_vtorogo++;
}
if (proverka_mordoboya()) return;
// Передача очереди бить
if (kto_shas_babaet == 1)
{
kto_shas_babaet = 2;
}
else
{
kto_shas_babaet = 1;
}
// Если ход бота — бот бьёт тупо и сразу
if (igraem_s_tupym_botom && kto_shas_babaet == 2)
{
tupoy_hod_bota();
if (proverka_mordoboya()) return;
kto_shas_babaet = 1;
}
pokrasit_vsyo_nafig();
}
private void udarit_odnu_kletku(int[,] pole, int r, int c)
{
// Проверка чтоб за экран не улетело
if (r < 0 || r > 9 || c < 0 || c > 9)
{
return;
}
if (pole[r, c] == 0)
{
pole[r, c] = 2; // Вода -> Бульк!
}
if (pole[r, c] == 1)
{
pole[r, c] = 3; // Лодка -> Бабах!
}
}
private void tupoy_hod_bota()
{
// Если бот накопил ядерку — херачит 3x3 наугад
if (schetchik_vtorogo >= 5)
{
int sluchayny_r = shaitan_mashina.Next(1, 9);
int sluchayny_c = shaitan_mashina.Next(1, 9);
udarit_odnu_kletku(pole_patsana_odin, sluchayny_r - 1, sluchayny_c - 1);
udarit_odnu_kletku(pole_patsana_odin, sluchayny_r - 1, sluchayny_c);
udarit_odnu_kletku(pole_patsana_odin, sluchayny_r - 1, sluchayny_c + 1);
udarit_odnu_kletku(pole_patsana_odin, sluchayny_r, sluchayny_c - 1);
udarit_odnu_kletku(pole_patsana_odin, sluchayny_r, sluchayny_c);
udarit_odnu_kletku(pole_patsana_odin, sluchayny_r, sluchayny_c + 1);
udarit_odnu_kletku(pole_patsana_odin, sluchayny_r + 1, sluchayny_c - 1);
udarit_odnu_kletku(pole_patsana_odin, sluchayny_r + 1, sluchayny_c);
udarit_odnu_kletku(pole_patsana_odin, sluchayny_r + 1, sluchayny_c + 1);
schetchik_vtorogo = 0;
return;
}
// Если ядерки нет — долбит вслепую в цикле пока не попадет в живую клетку
while (true)
{
int r = shaitan_mashina.Next(0, 10);
int c = shaitan_mashina.Next(0, 10);
if (pole_patsana_odin[r, c] == 0 || pole_patsana_odin[r, c] == 1)
{
udarit_odnu_kletku(pole_patsana_odin, r, c);
if (schetchik_vtorogo < 5) schetchik_vtorogo++;
break;
}
}
}
// --- ПРОВЕРКА КТО КОГО УШАТАЛ ---
private bool proverka_mordoboya()
{
int zhivyh_u_pervogo = 0;
int zhivyh_u_vtorogo = 0;
for (int r = 0; r < 10; r++)
{
for (int c = 0; c < 10; c++)
{
if (pole_patsana_odin[r, c] == 1) zhivyh_u_pervogo++;
if (pole_patsana_dva[r, c] == 1) zhivyh_u_vtorogo++;
}
}
if (zhivyh_u_vtorogo == 0)
{
igra_vsyo_konchilas = true;
pokrasit_vsyo_nafig();
OrisheSverhu.Text = "ПЕРВЫЙ ПАЦАН ВСЕХ РАЗВАЛИЛ!";
return true;
}
if (zhivyh_u_pervogo == 0)
{
igra_vsyo_konchilas = true;
pokrasit_vsyo_nafig();
if (igraem_s_tupym_botom)
{
OrisheSverhu.Text = "ЖЕЛЕЗЯКА ОКАЗАЛАСЬ СИЛЬНЕЕ!";
}
else
{
OrisheSverhu.Text = "ВТОРОЙ ПАЦАН ВСЕХ РАЗВАЛИЛ!";
}
return true;
}
return false;
}
// --- ТУПАЯ ПОКРАСКА ВСЕХ КНОПОК ---
private void pokrasit_vsyo_nafig()
{
// Красим поле 1
for (int r = 0; r < 10; r++)
{
for (int c = 0; c < 10; c++)
{
int shtuka = pole_patsana_odin[r, c];
Button knopka = knopki_pervogo[r, c];
if (shtuka == 0)
{
knopka.Background = Brushes.Navy;
knopka.Content = "";
}
if (shtuka == 1)
{
// Свои корабли показываем если играем с ботом
if (igraem_s_tupym_botom || igra_vsyo_konchilas)
{
knopka.Background = Brushes.Green;
knopka.Content = "Ш";
}
else
{
knopka.Background = Brushes.Navy;
knopka.Content = "";
}
}
if (shtuka == 2)
{
knopka.Background = Brushes.Gray;
knopka.Content = "•";
}
if (shtuka == 3)
{
knopka.Background = Brushes.Red;
knopka.Content = "X";
}
}
}
// Красим поле 2
for (int r = 0; r < 10; r++)
{
for (int c = 0; c < 10; c++)
{
int shtuka = pole_patsana_dva[r, c];
Button knopka = knopki_vtorogo[r, c];
if (shtuka == 0)
{
knopka.Background = Brushes.Navy;
knopka.Content = "";
}
if (shtuka == 1)
{
if (igra_vsyo_konchilas)
{
knopka.Background = Brushes.Green;
knopka.Content = "Ш";
}
else
{
knopka.Background = Brushes.Navy;
knopka.Content = "";
}
}
if (shtuka == 2)
{
knopka.Background = Brushes.Gray;
knopka.Content = "•";
}
if (shtuka == 3)
{
knopka.Background = Brushes.Red;
knopka.Content = "X";
}
}
}
if (igra_vsyo_konchilas)
{
KnopkaMegaPuk.IsEnabled = false;
return;
}
// Обновляем буковы сверху
if (kto_shas_babaet == 1)
{
OrisheSverhu.Text = "ХОДИТ ПЕРВЫЙ ПАЦАН (лупи вправо)";
}
else
{
OrisheSverhu.Text = "ХОДИТ ВТОРОЙ ПАЦАН (лупи влево)";
}
// Обновляем супер бабах
int tekushiy_zaryad = (kto_shas_babaet == 1) ? schetchik_pervogo : schetchik_vtorogo;
if (tekushiy_zaryad >= 5)
{
KnopkaMegaPuk.IsEnabled = true;
if (rezhim_yadernogo_udara)
{
KnopkaMegaPuk.Background = Brushes.Orange;
KnopkaMegaPuk.Content = "ЖМИ НА КЛЕТКУ И БУДЕТ ВЗРЫВ 3x3!";
}
else
{
KnopkaMegaPuk.Background = Brushes.Red;
KnopkaMegaPuk.Content = "БАБАХ ГОТОВ! НАЖМИ МЕНЯ (5/5)";
}
}
else
{
KnopkaMegaPuk.IsEnabled = false;
KnopkaMegaPuk.Background = Brushes.DarkRed;
KnopkaMegaPuk.Content = "СУПЕР-БАБАХ КОПИТСЯ: " + tekushiy_zaryad + "/5";
}
}
}
}