/// <summary> /// Обработчик таймера /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void timer_Tick(object sender, EventArgs e) { // Обновление метки времени в базе Program.db.Register(); // Индикация активности timerLabel.Text = (timerLabel.Text == "*") ? "." : "*"; Data.Cell cell; // Проверка на наличие выстрела if (Program.fire.TryDequeue(out cell)) { // Определение кнопки CellButton b = getButton(cell.X, cell.Y, true); // Определение результата выстрела cell.CellState = game.My.CellState(cell); // Отобразить состояние клетки b.BackColor = cell.CellState == Data.State.None? Color.Blue : Color.IndianRed; // Возврат результата client.Result(cell); } // Проверка на наличие результата if (Program.result.TryDequeue(out cell)) { // Отобразить состояние клетки CellButton b = getButton(cell.X, cell.Y, false); // Отобразить состояние клетки b.BackColor = cell.CellState == Data.State.None ? Color.Blue : Color.IndianRed; } }
/// <summary> /// Нажатие на кнопку вражеского поля /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Fire_Click(object sender, EventArgs e) { // Проверка на существование клиента if (client != null) { // Приведение типа CellButton b = (CellButton)sender; // Создание объекта клетки Data.Cell cell = new Data.Cell(b.X, b.Y); // Выстрел по вражескому полю client.Fire(cell); } }
/// <summary> /// Найти кнопку по координатам /// </summary> /// <param name="x">Абсцисса</param> /// <param name="y">Ордината</param> /// <param name="my">Признак собственного поля</param> /// <returns></returns> private CellButton getButton(int x, int y, bool my) { foreach (Control control in Controls) { // Проверка на соответствие типа if (!(control is CellButton)) { continue; } // Приведение типа в явной форме CellButton button = (CellButton)control; // Проверка на совпадение координат if ((button.X == x) && (button.Y == y) && (button.My == my)) { // Мы нашли нужную кнопку return(button); } } // Кнопка не найдена return(null); }
/// <summary> /// Обработка события загрузки формы /// </summary> /// <param name="sender">Объект события</param> /// <param name="e">Параметры события</param> private void MainForm_Load(object sender, EventArgs e) { // Формирование квадратного поля for (int x = 1; x <= Data.Game.FieldSize; x++) { for (int y = 1; y <= Data.Game.FieldSize; y++) { // Создание новой кнопки своего поля // Использование инициализатора CellButton b1 = new CellButton(x, y, true) { // Размер кнопки Size = new Size(buttonSize, buttonSize), // Положение кнопки Location = new Point(buttonSize * x, buttonSize * y + menu.Height + tool.Height) }; // Добавление обработчика кнопки b1.Click += Button_Click; // Добавление кнопки на форму Controls.Add(b1); // Создание новой кнопки чужого поля // Использование инициализатора CellButton b2 = new CellButton(x, y, false) { // Размер кнопки Size = new Size(buttonSize, buttonSize), // Положение кнопки Location = new Point(buttonSize * (x + 11), buttonSize * y + menu.Height + tool.Height) }; b2.Click += Fire_Click; // Добавление кнопки на форму Controls.Add(b2); } } // Формирование подписей for (int a = 1; a <= Data.Game.FieldSize; a++) { // Буквенная подпись по горизонтали AddLabel(a, 0, Convert.ToChar(a + Convert.ToInt16('А') - 1).ToString()); AddLabel(a + 11, 0, Convert.ToChar(a + Convert.ToInt16('А') - 1).ToString()); // Цифровая подпись по вертикали AddLabel(0, a, (a - 1).ToString()); AddLabel(11, a, (a - 1).ToString()); } // Коррекция высоты формы Height += status.Height; // Интервал таймера из конфигурации timer.Interval = Properties.Settings.Default.Interval; // Включение таймера timer.Enabled = true; // Запуск в отдельном потоке Task.Factory.StartNew(() => { // Создание сервиса svc = new GameService(); // Создание домика для сервиса host = new ServiceHost(svc); // Включение сервиса host.Open(); }); }
/// <summary> /// Обработчик нажатия на кнопку моего поля /// </summary> /// <param name="sender">Кнопка</param> /// <param name="e"></param> private void Button_Click(object sender, EventArgs e) { try { // Приведение типа CellButton b = (CellButton)sender; // Проверка доступности клетки if (!game.My.CheckCellAvail(b.X, b.Y)) { return; } // Определение режима работы switch (ship) { case 1: // Однопалубный корабль // Добавление корабля game.My.AddShip1(b.X, b.Y); // Перекрасить кнопку b.BackColor = Data.Cell.ShipColor; // Отпустить кнопку button1.Checked = false; // Корабль создан ship = 0; break; case 2: // Двухпалубный корабль if (cell == null) { // Покрасить первую кнопку b.BackColor = Color.Orchid; // Запомнить первую клетку cell = new Data.Cell(b.X, b.Y) { CellState = Data.State.Active }; } else if (!cell.CheckCellNear(b.X, b.Y)) { return; } else { // Покрасить первую кнопку getButton(cell.X, cell.Y, true).BackColor = Data.Cell.ShipColor; // Покрасить вторую кнопку b.BackColor = Data.Cell.ShipColor; // Добавить корабль game.My.AddShip2(cell, b.X, b.Y); // Кнопка "отлипла" button2.Checked = false; // Забыть клетку, которую мы запомнили cell = null; // Корабль создан ship = 0; } break; } } catch (Exception ex) { MessageBox.Show(ex.Message, "Добавление корабля", MessageBoxButtons.OK, MessageBoxIcon.Warning); } }