Quantcast
Channel: Форум программистов и сисадминов Киберфорум
Viewing all articles
Browse latest Browse all 517964

Косяк с блокированием поля после проигрыша(Крестики-нолики) - C# для начинающих

$
0
0
Код:

Проблема с каким-то из "LoockPole"
В итоге,когда выигрывает ПК, мои шаги не блокируются и я могу ставить дальше пока не выиграю или не станет ничья. HELP PLS.
     
        }
        void LoockPole()
        {
            //блокируем все поле чтобы игрок не мог на него нажать
            foreach (PictureBox P in GamePole) P.Enabled = false;
        }
        void UnloockPole()
        {
            int Indexx = 0;
            //Разблокируем поля но только те которые не заполнены
            foreach (PictureBox P in GamePole)
            {
                // если поле равно 0 значит есть смысл его открывать
                if (GamePoleMap[Indexx++] == 0) P.Enabled = true;
            }

        }
        //проверяем есть ли ходы
        bool CanStap()
        {
            //перебираем все значения игрового поля
            foreach (int s in GamePoleMap)
                //если нашли 0 значит есть куда ходить
                if (s == 0) return true;

            //проверяем не выиграл ли игрок
            if (Win(Player))
            {
                label3.Text = "Вы выиграли";
                LoockPole();
                //прячем панель игры
                panel4.Visible = true;
                //если не нашли то ходить больше нельзя
                return false;
            }
            //проверяем не выиграл ли игрок
            if (Win(Computer))
            {
               
                panel4.Visible = true;
                label3.Text = "Вы проиграли";
                //прячем панель игры
                LoockPole();
                panel3.Visible = false;
                return false;
            }
            //если ходить больше нельзя и никто не выиграл значит пишем что ничья
            label3.Text = "Ничья";
            //прячем панель игры

            panel4.Visible = true;
            LoockPole();

            return false;

        }
        bool Win(int WHO)
        {
            //список вариантов выигрышных комбинаций
            int[,] WinVariant =
            {      {    //1 вариант
                    1,1,1,  //Х Х Х
                    0,0,0,  //_ _ _
                    0,0,0  //_ _ _
                }, {    //2 вариант
                    0,0,0,  //_ _ _
                    1,1,1,  //Х Х Х
                    0,0,0  //_ _ _
                }, {    //3 вариант
                    0,0,0,  //_ _ _
                    0,0,0,  //_ _ _
                    1,1,1  //Х Х Х
                }, {    //4 вариант
                    1,0,0,  //Х _ _
                    1,0,0,  //Х _ _
                    1,0,0  //Х _ _
                }, {    //5 вариант
                    0,1,0,  //_ Х _
                    0,1,0,  //_ Х _
                    0,1,0  //_ Х _
                }, {    //6 вариант
                    0,0,1,  //_ _ Х
                    0,0,1,  //_ _ Х
                    0,0,1  //_ _ Х
                }, {    //7 вариант
                    1,0,0,  //Х _ _
                    0,1,0,  //_ Х _
                    0,0,1  //_ _ Х
                }, {    //8 вариант
                    0,0,1,  //_ _ Х
                    0,1,0,  //_ Х _
                    1,0,0    //Х _ _
                }
            };
            //получаем  поле
            int[] TestMap = new int[GamePoleMap.Length];
            //просчитываем поле
            for (int I = 0; I < GamePoleMap.Length; I++)
                //если номер в ячейке нам подходит записываем в карту 1
                if (GamePoleMap[I] == WHO) TestMap[I] = 1;
            //выбираем вариант для сравнения
            for (int Variant_Index = 0; Variant_Index < WinVariant.GetLength(0); Variant_Index++)
            {
                //счетчик для подсчета соотвествий
                int WinState = 0;
                for (int TestIndex = 0; TestIndex < TestMap.Length; TestIndex++)
                {
                    //если параметр равен 1 то проверяем его иначе 0 тоже = 0
                    if (WinVariant[Variant_Index, TestIndex] == 1)
                    {
                        //если в параметр  в варианте выигрыша совпал с вариантом на карте считаем это в параметре WinState
                        if (WinVariant[Variant_Index, TestIndex] == TestMap[TestIndex]) WinState++;
                    }
                    //если найдены 3 совпадения значит это и есть выигрышная комбинация
                    if (WinState == 3) return true;
                }
               
          }

            return false;
                }



        void PC_Step()
        {
            //обновление функции генерации случайных чисел
            Random Rand = new Random();
        GENER:

            if (CanStap())
            {
                //получаем число от 0 до 8
                int IndexStep = Rand.Next(0, 8);
                //проверяем на пустоту ячейки и ставим туда символ ПК
                if (GamePoleMap[IndexStep] == 0)
                {
                    //вставляем нужную картинку
                    GamePole[IndexStep].Image = Image.FromFile(ImgName[Computer]);
                    //записываем в поле игры ход ПК
                    GamePoleMap[IndexStep] = Computer;
                }
                else goto GENER;
                if (!Win(Computer))
                {
                    panel4.Visible = true;
                    label3.Text = "Вы проиграли";
                    LoockPole();
                }

            }

        }
        private void Picture_Click(object sender, EventArgs e)
        {
            if (CanStap())
            {
                PictureBox ClickImage = sender as PictureBox;
                string[] ParsName = ClickImage.Name.Split('_');

                int IndexSelectImage = Convert.ToInt32(ParsName[1]);

                GamePole[IndexSelectImage].Image = Image.FromFile(ImgName[Player]);
                GamePoleMap[IndexSelectImage] = Player;

                if(!Win(Player))
                {
                    //блокируем поле чтобы игрок не смог ходить
                    LoockPole();
                    //шаг ПК
                    PC_Step();
                    //пробуем разблокировать поле
                    UnloockPole();
                }
                else
                {
                    panel4.Visible = true;
                    label3.Text = "Вы выиграли";
                    LoockPole();
                }
             
            }
        }

}


Viewing all articles
Browse latest Browse all 517964

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>