コード例 #1
0
        //Обработка поля типа 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);
        }
コード例 #2
0
        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);
        }
コード例 #3
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)); // Создаем подключение
     }
 }
コード例 #4
0
        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;
                }
            }
        }
コード例 #5
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;                                                                    // Разблокировали поле
        }