예제 #1
0
        public XOObject ПолучитьЯчейкуДляСледующегоХода(XOObject[] value, СостояниеХода nextStep)
        {
            int[] previous_step_arr = new int[9];
            int[] next_step_arr     = null;

            for (int i = 0; i < value.Length; i++)
            {
                previous_step_arr[i] = ПолучитьЧисловоеПредставлениеХода(value[i].Ход);
            }

            Component parent_com = _VictoryComposite.FindChild(previous_step_arr);

            if (parent_com == null)
            #region Временное решение из за неполноты Дерева стратегий
            {
                return(Victory.GetInstance().ПолучитьЯчейкуДляСледующегоХода(value, nextStep));
            }
            #endregion

            System.Collections.ArrayList clilds = parent_com.GetChilds();

            if (clilds == null)
            #region Временное решение из за неполноты Дерева стратегий
            {
                return(Victory.GetInstance().ПолучитьЯчейкуДляСледующегоХода(value, nextStep));
            }
            #endregion

            Random rnd      = new Random();
            int    maxValue = (clilds.Count - 1) < 0 ? 0 : (clilds.Count - 1);
            next_step_arr = ((Component)clilds[rnd.Next(0, maxValue)]).ToIntArray();

            if (next_step_arr == null)
            #region Временное решение из за неполноты Дерева стратегий
            {
                return(Victory.GetInstance().ПолучитьЯчейкуДляСледующегоХода(value, nextStep));
            }
            #endregion

            for (int i = 0; i < value.Length; i++)
            {
                if (ПолучитьЧисловоеПредставлениеХода(value[i].Ход) != next_step_arr[i])
                {
                    return new XOObject()
                           {
                               ID = value[i].ID, Ход = СостояниеХода.NULL, ХодСделан = false
                           }
                }
                ;
            }

            #region Временное решение из за неполноты Дерева стратегий
            return(Victory.GetInstance().ПолучитьЯчейкуДляСледующегоХода(value, nextStep));

            #endregion

            //return null;
        }
예제 #2
0
 /// <summary>
 /// Метод устанавливает значения ролей для игроков Для Пользователя и для ПК
 /// </summary>
 private void УстановитьРолиИгроковНаФорму(СостояниеХода ход)
 {
     if (ход == СостояниеХода.X)
     {
         this._Game.УстановитьРолиИгроков("X", "0");
     }
     else
     {
         this._Game.УстановитьРолиИгроков("0", "X");
     }
 }
예제 #3
0
 /// <summary>
 /// Метод не дает выйграть сопернику
 /// </summary>
 /// <param name="value">Массив обьектов текущего состояния игрового поля</param>
 /// <param name="nextStep">Текущий игрок Х или О</param>
 /// <returns></returns>
 private XOObject НедопуститьВыйгрышСоперника(XOObject[] value, СостояниеХода nextStep)
 {
     if (nextStep == СостояниеХода.O)
     {
         nextStep = СостояниеХода.X;
     }
     else
     {
         nextStep = СостояниеХода.O;
     }
     return(ПроверитьВозможностьСвоегоВыйгрыша(value, nextStep));
 }
예제 #4
0
        private int ПолучитьЧисловоеПредставлениеХода(СостояниеХода СостояниеХода)
        {
            if (СостояниеХода == Code.СостояниеХода.X)
            {
                return(1);
            }

            if (СостояниеХода == Code.СостояниеХода.O)
            {
                return(2);
            }

            return(0);
        }
예제 #5
0
 /// <summary>
 /// Метод срабатывает при первоначальном запуске ПО
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void УстановитьПараметрыПоУмолчанию(object sender, EventArgs e)
 {
     try
     {
         this._Game.УстановитьСостояниеИгровогоПоляПоУмолчанию(new XOObject()
         {
             ХодСделан = false, Ход = СостояниеХода.NULL
         });
         _NextStep     = СостояниеХода.X;
         _PreviousStep = СостояниеХода.O;
         УстановитьРолиИгроковНаФорму(_NextStep);
     }
     catch (Exception ex)
     {
         _Service.ShowError(ex.Message);
     }
 }
예제 #6
0
        /// <summary>
        /// Метод определяет победителя в игре
        /// </summary>
        /// <param name="value">Массив обьектов текущего состояния игрового поля</param>
        /// <returns>СостояниеХода.X - если победил игрок Х, СостояниеХода.O - если победил игрок О, СостояниеХода.NULL - если нечья, null - если игра еще не закончена</returns>
        public СостояниеХода?Победа(XOObject[] value)
        {
            СостояниеХода cell_0 = ((XOObject)value[0]).Ход;
            СостояниеХода cell_1 = ((XOObject)value[1]).Ход;
            СостояниеХода cell_2 = ((XOObject)value[2]).Ход;
            СостояниеХода cell_3 = ((XOObject)value[3]).Ход;
            СостояниеХода cell_4 = ((XOObject)value[4]).Ход;
            СостояниеХода cell_5 = ((XOObject)value[5]).Ход;
            СостояниеХода cell_6 = ((XOObject)value[6]).Ход;
            СостояниеХода cell_7 = ((XOObject)value[7]).Ход;
            СостояниеХода cell_8 = ((XOObject)value[8]).Ход;

            if (((cell_0 == СостояниеХода.X) && (cell_1 == СостояниеХода.X) && (cell_2 == СостояниеХода.X)) ||
                ((cell_3 == СостояниеХода.X) && (cell_4 == СостояниеХода.X) && (cell_5 == СостояниеХода.X)) ||
                ((cell_6 == СостояниеХода.X) && (cell_7 == СостояниеХода.X) && (cell_8 == СостояниеХода.X)) ||
                ((cell_0 == СостояниеХода.X) && (cell_3 == СостояниеХода.X) && (cell_6 == СостояниеХода.X)) ||
                ((cell_1 == СостояниеХода.X) && (cell_4 == СостояниеХода.X) && (cell_7 == СостояниеХода.X)) ||
                ((cell_2 == СостояниеХода.X) && (cell_5 == СостояниеХода.X) && (cell_8 == СостояниеХода.X)) ||
                ((cell_0 == СостояниеХода.X) && (cell_4 == СостояниеХода.X) && (cell_8 == СостояниеХода.X)) ||
                ((cell_2 == СостояниеХода.X) && (cell_4 == СостояниеХода.X) && (cell_6 == СостояниеХода.X)))
            {
                return(СостояниеХода.X);
            }
            else if
            (((cell_0 == СостояниеХода.O) && (cell_1 == СостояниеХода.O) && (cell_2 == СостояниеХода.O)) ||
             ((cell_3 == СостояниеХода.O) && (cell_4 == СостояниеХода.O) && (cell_5 == СостояниеХода.O)) ||
             ((cell_6 == СостояниеХода.O) && (cell_7 == СостояниеХода.O) && (cell_8 == СостояниеХода.O)) ||
             ((cell_0 == СостояниеХода.O) && (cell_3 == СостояниеХода.O) && (cell_6 == СостояниеХода.O)) ||
             ((cell_1 == СостояниеХода.O) && (cell_4 == СостояниеХода.O) && (cell_7 == СостояниеХода.O)) ||
             ((cell_2 == СостояниеХода.O) && (cell_5 == СостояниеХода.O) && (cell_8 == СостояниеХода.O)) ||
             ((cell_0 == СостояниеХода.O) && (cell_4 == СостояниеХода.O) && (cell_8 == СостояниеХода.O)) ||
             ((cell_2 == СостояниеХода.O) && (cell_4 == СостояниеХода.O) && (cell_6 == СостояниеХода.O)))
            {
                return(СостояниеХода.O);
            }
            else if
            ((cell_0 != СостояниеХода.NULL) && (cell_1 != СостояниеХода.NULL) && (cell_2 != СостояниеХода.NULL) &&
             (cell_3 != СостояниеХода.NULL) && (cell_4 != СостояниеХода.NULL) && (cell_5 != СостояниеХода.NULL) &&
             (cell_6 != СостояниеХода.NULL) && (cell_7 != СостояниеХода.NULL) && (cell_8 != СостояниеХода.NULL))
            {
                return(СостояниеХода.NULL);
            }

            return(null);
        }
예제 #7
0
        /// <summary>
        /// Метод определяет следующий ход в игре для ПК
        /// </summary>
        /// <param name="value">Массив обьектов текущего состояния игрового поля</param>
        /// <param name="nextStep">Текущий игрок Х или О</param>
        /// <returns></returns>
        public XOObject ПолучитьЯчейкуДляСледующегоХода(XOObject[] value, СостояниеХода nextStep)
        {
            XOObject result = null;

            result = ПроверитьВозможностьСвоегоВыйгрыша(value, nextStep);
            if (result == null)
            {
                result = НедопуститьВыйгрышСоперника(value, nextStep);
            }

            if (result == null)
            {
                result = ВыбратьОптимальныйХод(value);
            }

            return(result);

            // return ВыбратьОптимальныйХод(value);
        }
예제 #8
0
        /// <summary>
        /// Метод определяет 'результативность' хода пользователя
        /// </summary>
        /// <param name="sender"></param>
        private void СделатьХод(XOObject sender)
        {
            try
            {
                Mode mode = Mode.easy;
                if (!this._Game.ПолучитьРежимСложностиИгры())
                {
                    ;
                }
                mode = Mode.hard;

                _NewGame = true;

                _PreviousStep = _NextStep;

                if (sender.ХодСделан)
                {
                    return;
                }

                if (_NextStep == СостояниеХода.X)
                {
                    sender.Ход = СостояниеХода.X;
                    _NextStep  = СостояниеХода.O;
                }
                else
                {
                    sender.Ход = СостояниеХода.O;
                    _NextStep  = СостояниеХода.X;
                }

                sender.ХодСделан = true;
                _Game.УстановитьСостояниеИгровогоПоля(sender);

                IVictory victory = new VictoryStrategy(mode);

                СостояниеХода?rez = victory.Победа(this._Game.ПолучитьСостояниеИгровогоПоля());

                if (rez == null)
                {
                    return;
                }

                if (rez == СостояниеХода.NULL)
                {
                    DataBaseLogic.GetInstance().SetConnectDB("Requests_Database.sqlite").AddResultInTable(1, 1);
                    _Service.ShowMessage("Draw, Try again!");
                }

                if (rez == СостояниеХода.X)
                {
                    DataBaseLogic.GetInstance().SetConnectDB("Requests_Database.sqlite").AddResultInTable(1, 0);
                    _Service.ShowMessage("The crosses won!");
                }

                if (rez == СостояниеХода.O)
                {
                    DataBaseLogic.GetInstance().SetConnectDB("Requests_Database.sqlite").AddResultInTable(0, 1);
                    _Service.ShowMessage("Zeroes won!");
                }

                УстановитьПараметрыПоУмолчанию(null, EventArgs.Empty);

                _NewGame = false;
            }
            catch (Exception ex)
            {
                _Service.ShowError(ex.Message);
            }
        }
예제 #9
0
        /// <summary>
        /// Метод оределяет возможно ли на данном этапе завершить игру
        /// </summary>
        /// <param name="value">Массив обьектов текущего состояния игрового поля</param>
        /// <param name="nextStep">Текущий игрок Х или О</param>
        /// <returns></returns>
        private XOObject ПроверитьВозможностьСвоегоВыйгрыша(object[] value, СостояниеХода nextStep)
        {
            XOObject cell_0 = value[0] as XOObject;
            XOObject cell_1 = value[1] as XOObject;
            XOObject cell_2 = value[2] as XOObject;
            XOObject cell_3 = value[3] as XOObject;
            XOObject cell_4 = value[4] as XOObject;
            XOObject cell_5 = value[5] as XOObject;
            XOObject cell_6 = value[6] as XOObject;
            XOObject cell_7 = value[7] as XOObject;
            XOObject cell_8 = value[8] as XOObject;

            #region 1
            if ((cell_0.Ход == nextStep) && (cell_2.Ход == nextStep) && (cell_1.Ход == СостояниеХода.NULL))
            {
                return(cell_1);
            }
            if ((cell_3.Ход == nextStep) && (cell_5.Ход == nextStep) && (cell_4.Ход == СостояниеХода.NULL))
            {
                return(cell_4);
            }
            if ((cell_6.Ход == nextStep) && (cell_8.Ход == nextStep) && (cell_7.Ход == СостояниеХода.NULL))
            {
                return(cell_7);
            }
            if ((cell_0.Ход == nextStep) && (cell_6.Ход == nextStep) && (cell_3.Ход == СостояниеХода.NULL))
            {
                return(cell_3);
            }
            if ((cell_1.Ход == nextStep) && (cell_7.Ход == nextStep) && (cell_4.Ход == СостояниеХода.NULL))
            {
                return(cell_4);
            }
            if ((cell_2.Ход == nextStep) && (cell_8.Ход == nextStep) && (cell_5.Ход == СостояниеХода.NULL))
            {
                return(cell_5);
            }
            if ((cell_0.Ход == nextStep) && (cell_8.Ход == nextStep) && (cell_4.Ход == СостояниеХода.NULL))
            {
                return(cell_4);
            }
            if ((cell_2.Ход == nextStep) && (cell_6.Ход == nextStep) && (cell_4.Ход == СостояниеХода.NULL))
            {
                return(cell_4);
            }
            #endregion

            #region 2
            if ((cell_1.Ход == nextStep) && (cell_2.Ход == nextStep) && (cell_0.Ход == СостояниеХода.NULL))
            {
                return(cell_0);
            }
            if ((cell_4.Ход == nextStep) && (cell_5.Ход == nextStep) && (cell_3.Ход == СостояниеХода.NULL))
            {
                return(cell_3);
            }
            if ((cell_7.Ход == nextStep) && (cell_8.Ход == nextStep) && (cell_6.Ход == СостояниеХода.NULL))
            {
                return(cell_6);
            }
            if ((cell_3.Ход == nextStep) && (cell_6.Ход == nextStep) && (cell_0.Ход == СостояниеХода.NULL))
            {
                return(cell_0);
            }
            if ((cell_4.Ход == nextStep) && (cell_7.Ход == nextStep) && (cell_1.Ход == СостояниеХода.NULL))
            {
                return(cell_1);
            }
            if ((cell_5.Ход == nextStep) && (cell_8.Ход == nextStep) && (cell_2.Ход == СостояниеХода.NULL))
            {
                return(cell_2);
            }
            if ((cell_4.Ход == nextStep) && (cell_8.Ход == nextStep) && (cell_0.Ход == СостояниеХода.NULL))
            {
                return(cell_0);
            }
            if ((cell_4.Ход == nextStep) && (cell_6.Ход == nextStep) && (cell_6.Ход == СостояниеХода.NULL))
            {
                return(cell_2);
            }
            #endregion

            #region 3
            if ((cell_0.Ход == nextStep) && (cell_1.Ход == nextStep) && (cell_2.Ход == СостояниеХода.NULL))
            {
                return(cell_2);
            }
            if ((cell_3.Ход == nextStep) && (cell_4.Ход == nextStep) && (cell_5.Ход == СостояниеХода.NULL))
            {
                return(cell_5);
            }
            if ((cell_6.Ход == nextStep) && (cell_7.Ход == nextStep) && (cell_8.Ход == СостояниеХода.NULL))
            {
                return(cell_8);
            }
            if ((cell_0.Ход == nextStep) && (cell_3.Ход == nextStep) && (cell_6.Ход == СостояниеХода.NULL))
            {
                return(cell_6);
            }
            if ((cell_1.Ход == nextStep) && (cell_4.Ход == nextStep) && (cell_7.Ход == СостояниеХода.NULL))
            {
                return(cell_7);
            }
            if ((cell_2.Ход == nextStep) && (cell_5.Ход == nextStep) && (cell_8.Ход == СостояниеХода.NULL))
            {
                return(cell_8);
            }
            if ((cell_0.Ход == nextStep) && (cell_4.Ход == nextStep) && (cell_8.Ход == СостояниеХода.NULL))
            {
                return(cell_8);
            }
            if ((cell_2.Ход == nextStep) && (cell_4.Ход == nextStep) && (cell_6.Ход == СостояниеХода.NULL))
            {
                return(cell_6);
            }
            #endregion

            return(null);
        }
예제 #10
0
 public XOObject ПолучитьЯчейкуДляСледующегоХода(XOObject[] value, СостояниеХода nextStep)
 {
     return(_VictoryStrategy.ПолучитьЯчейкуДляСледующегоХода(value, nextStep));
 }