//Обработка поля типа user_field. На вход поступают координаты, куда стрелял враг. На выходе - сообщение для врага private string Processing_Unit(int i, int j) { string result = ""; switch (matrix_state[i, j].Get_Unit_Type()) { //Если попали в море case unit_type.sea: matrix_state[i, j].Set_Unit_Type(unit_type.hit_sea); result = "-"; break; //Если попали в корабль case unit_type.ship: matrix_state[i, j].Set_Unit_Type(unit_type.hit_ship); result = "+"; break; } //Если достигли конца игры if (Utilits.IsEndGame(matrix_state)) { result = "end"; } Initinitialization_Field(Unit.Get_Size_Unit(), MyCanvas_MouseLeftButtonUp, matrix_state); // Отрисовка return(result); }
public string GetCoordinat(string attach) { string answer = ""; int x = 0, y = 0; if (attach == "+++" || attach == "***") { Point tmp = AutoAction.AutoAttack(ref Matrix_Com_Enemy); answer = answer + tmp.X.ToString(); answer = answer + tmp.Y.ToString(); answer = answer + "-"; } else { x = Int32.Parse(attach[0].ToString()); y = Int32.Parse(attach[1].ToString()); if (Matrix_Com_My[x, y].Get_Unit_Type() == unit_type.sea) { Point tmp = AutoAction.AutoAttack(ref Matrix_Com_Enemy); answer = answer + tmp.X.ToString(); answer = answer + tmp.Y.ToString(); answer = answer + "-"; } if (Matrix_Com_My[x, y].Get_Unit_Type() == unit_type.ship) { Matrix_Com_My[x, y].Set_Unit_Type(unit_type.hit_ship); answer = "+++"; } if (Utilits.IsEndGame(Matrix_Com_My)) { answer = "end"; } } return(answer); }
// Авто-заполнение поля 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 static Unit[,] saved_state = new Unit[10, 10]; //Матрица для сохранения промежуточного состояния поля // Изменяет входную матрицу состояния, заполняя ее кораблями (случайным образом) public static void AutoSetShips(ref Unit[,] matrix_state) { ships.Reset(); Utilits.Save_Matrix(matrix_state, saved_state); // Очищаем матрицу сохранения. (грубо говоря мы просто копируем чистую матрицу состояния в матрицу сохранения) ship_points.Clear(); Point random_point = Utilits.GetRandomPoint(); //ставим случайную ячейку while (true) { if (ship_points.Count > 0) //Если нет точки для примера ("отправной точки") { random_point = Utilits.NormalizedPoint(ship_points.ToArray(), random_point); //Получаем псевдо-случайную соседнюю с "отправной точкой" точку } else { random_point = Utilits.NormalizedPoint(new Point[] { random_point }, random_point); } if (matrix_state[(int)random_point.X, (int)random_point.Y].Get_Unit_Type() == unit_type.ship) //Проверяем, не пересекает ли точка какую либо другую { ship_points.Clear(); random_point = Utilits.GetRandomPoint(); continue; } matrix_state[(int)random_point.X, (int)random_point.Y].Set_Unit_Type(unit_type.ship); //Записываем изменения в матрицу состояния ship_points.Add(random_point); // Добавляем точки в список для проверки 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); //Загружаем предидущее состояние } ship_points.Clear(); //Очищаем набор точек (временный набор точек, который заполняется при установке ячеек корабля) random_point = Utilits.GetRandomPoint(); } else if (type_ship == -1) //Если установка закончена (нет больше доступных кораблей для установки) { Utilits.Load_Matrix(matrix_state, saved_state); //Загружаем матрицу состояния' break; } } }
// Обрабатывает нажатия на ячейку в зависимости от режима поля (режимы: установка кораблей, поле врага, поле игрока) 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; // Разблокировали поле }