// Авто-заполнение поля public void AutoSetShips() { Initinitialization_Field(Unit.Get_Size_Unit(), MyCanvas_MouseLeftButtonUp); // Инициализируем матрицу по новой, чтобы она была "чистой" AutoAction.AutoSetShips(ref matrix_state); SetFieldType(type_field.user_field); Initinitialization_Field(Unit.Get_Size_Unit(), MyCanvas_MouseLeftButtonUp, matrix_state); // Отрисовка новой, заполненной матрицы grid.IsEnabled = false; // Блокируем поле, т.к. все уже выставлено и оно больше не будет изменяться игроком StartFieldEvent(); if (this.mode_game == game_mode.online_game) { online_client = new ConnectManager(Utilits.ParseMatric(matrix_state)); // Создаем подключение } }
// Обрабатывает нажатия на ячейку в зависимости от режима поля (режимы: установка кораблей, поле врага, поле игрока) private void MyCanvas_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) { this.IsEnabled = false; // Блокируем поле Unit unit = (Unit)((Canvas)sender).Tag; //Вытаскиваем ячейку из вызвавшего элемента switch (field_type) { case type_field.set_field: //Если тип поля "установка кораблей." ship_points.Add(new Point(unit.Get_Position_I(), unit.Get_Position_J())); //Добавляем нажатую ячейку в список кораблей для дальнейшей проверки if (unit.Get_Unit_Type() != unit_type.sea) { throw new Exception("Не туда ткнул"); } unit.Set_Unit_Type(unit_type.ship); //Устанавливаем тип ячейки - "корабль" ((Canvas)sender).Background = new ImageBrush(unit.Get_Image()); //Устанавливаем соответствующую картинку в ячейку int type_ship = ships.Next_Stage(); //Получаем состояние кораблей if (type_ship > 0) //Если корабль заполнен { if (Utilits.Check_Ship(ship_points.ToArray(), matrix_state, (byte)type_ship)) //Проверка корректности установки ячеек { Utilits.Save_Matrix(matrix_state, saved_state); //Сохраняем состояние поля } else //Если выставленные ячейки не корректны { ships.Back_Stage(); //Откатываем счетчик установки кораблей назад Utilits.Load_Matrix(matrix_state, saved_state); //Загружаем предидущее состояние Initinitialization_Field(Unit.Get_Size_Unit(), MyCanvas_MouseLeftButtonUp, matrix_state); //Перерисовываем поле } ship_points.Clear(); //Очищаем набор точек (временный набор точек, который заполняется при установке ячеек корабля) } else if (type_ship == -1) //Если установка закончена (нет больше доступных кораблей для установки) { Utilits.Load_Matrix(matrix_state, saved_state); //Загружаем матрицу состояния ship_points.Clear(); //Очищаем набор точек Initinitialization_Field(Unit.Get_Size_Unit(), MyCanvas_MouseLeftButtonUp, matrix_state); //Перерисовываем поле SetFieldType(type_field.user_field); // Меняем тип поля grid.IsEnabled = false; // Блокируем поле, т.к. все уже выставлено и оно больше не будет изменяться игроком StartFieldEvent(); if (this.mode_game == game_mode.online_game) { online_client = new ConnectManager(Utilits.ParseMatric(matrix_state)); // Создаем подключение } } break; case type_field.enemy_field: //Если тип поля "поле врага" try { if (unit.Get_Unit_Type() != unit_type.sea) { throw new Exception("Не туда нажали"); } } catch (Exception) { MessageBox.Show("Не туда ткнул"); } if (mode_game == game_mode.offline_game) //если режим - офлайн { if (message != "+" || message != "*") //если по нашим кораблям не попали { message = unit.Get_Position_I().ToString() + unit.Get_Position_J().ToString() + message; //составляем сообщение об атаке } do { message = comp_ii.GetCoordinat(message); //получаем сообщение от ИИ if (message == "end") // Если конец игры { MessageBox.Show("Вы выиграли!"); } message = Utilits.ProcessingMessage(message, unit); // Обрабатываем сообщение от ИИ if (message == "end") { MessageBox.Show("Вы проиграли!"); } } while (message == "+++" || message == "***"); //Повторяем если ИИ попал в корабль } else // Игра по сети { if (CheckIdFlag) { try { if (CheckIdFlag && online_client.IsMyStep()) // Если наш ход { message = online_client.GetMessageGtd(); if (Utilits.ProcessingOnlineMessage(message) != "end") { online_client.SetUsefulMessage(unit.Get_Position_I().ToString() + unit.Get_Position_J().ToString() + "+", "stm"); if (online_client.GetMessage() == "+") { CheckIdFlag = false; unit.Set_Unit_Type(unit_type.hit_ship); } else { CheckIdFlag = true; unit.Set_Unit_Type(unit_type.hit_sea); online_client.SetMessage("ok1"); } } else { online_client.SetMessage("end"); MessageBox.Show("Ты проиграл"); } } else //добавить окошечко { MessageBox.Show("Не твой ход"); } } catch { MessageBox.Show("Не твой ход"); } } else { online_client.SetUsefulMessage(unit.Get_Position_I().ToString() + unit.Get_Position_J().ToString() + "+", "stm"); if (online_client.GetMessage() == "+") { CheckIdFlag = false; unit.Set_Unit_Type(unit_type.hit_ship); } else { CheckIdFlag = true; unit.Set_Unit_Type(unit_type.hit_sea); online_client.SetMessage("ok1"); } } } break; case type_field.user_field: //Если тип поля "поле игрока" break; } Initinitialization_Field(Unit.Get_Size_Unit(), MyCanvas_MouseLeftButtonUp, matrix_state); // Отрисовка this.IsEnabled = true; // Разблокировали поле }