Example #1
0
 // Авто-заполнение поля
 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)); // Создаем подключение
     }
 }
Example #2
0
        // Обрабатывает нажатия на ячейку в зависимости от режима поля (режимы: установка кораблей, поле врага, поле игрока)
        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;                                                                    // Разблокировали поле
        }