@evgemiil

Правильный ли код ходов компьютера?

Подскажите стоит ли улучшить код и правильно ли составлен вообще? Тут код хода компьютера игры крестики-нолики
private void CompProgress()
        {
            
            if (button2.Text == "" && button1.Text == "O" && button3.Text == "O") { button2.Text = "O"; return; }
            if (button4.Text == "" && button1.Text == "O" && button7.Text == "O") { button4.Text = "O"; return; }
            if (button8.Text == "" && button7.Text == "O" && button9.Text == "O") { button8.Text = "O"; return; }
            if (button6.Text == "" && button3.Text == "O" && button9.Text == "O") { button6.Text = "O"; return; }

            if (button5.Text == "" && button4.Text == "X" && button6.Text == "X") { button5.Text = "O"; return; }
            if (button5.Text == "" && button2.Text == "X" && button8.Text == "X") { button5.Text = "O"; return; }

            if (button1.Text == "X" && button5.Text == "X" && button9.Text == "") { button9.Text = "O"; return; }
            if (button5.Text == "X" && button9.Text == "X" && button1.Text == "") { button1.Text = "O"; return; }
            if (button3.Text == "X" && button5.Text == "X" && button7.Text == "") { button7.Text = "O"; return; }
            if (button5.Text == "X" && button7.Text == "X" && button3.Text == "") { button3.Text = "O"; return; }

            if (button1.Text == "X" && button9.Text == "X" && button5.Text == "") { button5.Text = "O"; return; }
            if (button3.Text == "X" && button7.Text == "X" && button5.Text == "") { button5.Text = "O"; return; }

            if (button1.Text == "X" && button4.Text == "X" && button7.Text == "") { button7.Text = "O"; return; }
            if (button2.Text == "X" && button5.Text == "X" && button8.Text == "") { button8.Text = "O"; return; }
            if (button3.Text == "X" && button6.Text == "X" && button9.Text == "") { button9.Text = "O"; return; }
            if (button4.Text == "X" && button7.Text == "X" && button1.Text == "") { button1.Text = "O"; return; }
            if (button5.Text == "X" && button8.Text == "X" && button2.Text == "") { button2.Text = "O"; return; }
            if (button6.Text == "X" && button9.Text == "X" && button3.Text == "") { button3.Text = "O"; return; }

            if (button7.Text == "X" && button8.Text == "X" && button9.Text == "") { button9.Text = "O"; return; }
            if (button4.Text == "X" && button5.Text == "X" && button6.Text == "") { button6.Text = "O"; return; }
            if (button1.Text == "X" && button2.Text == "X" && button3.Text == "") { button3.Text = "O"; return; }
            if (button8.Text == "X" && button9.Text == "X" && button7.Text == "") { button7.Text = "O"; return; }
            if (button5.Text == "X" && button6.Text == "X" && button4.Text == "") { button4.Text = "O"; return; }
            if (button2.Text == "X" && button3.Text == "X" && button1.Text == "") { button1.Text = "O"; return; }

            if (button1.Text == "" && button5.Text == "X") { button1.Text = "O"; return; }
            if (button9.Text == "" && button1.Text == "X") { button9.Text = "O"; return; }
            if (button7.Text == "" && button3.Text == "X") { button7.Text = "O"; return; }
            if (button3.Text == "" && button7.Text == "X") { button3.Text = "O"; return; }
            if (button1.Text == "" && button9.Text == "X") { button1.Text = "O"; return; }
            if (button7.Text == "" && button3.Text == "X") { button7.Text = "O"; return; }

            if (button2.Text == "X") 
            {
                if (button3.Text == "") { button3.Text = "O"; return; }
                if (button1.Text == "") { button1.Text = "O"; return; }
            }
            if (button4.Text == "X")
            {
                if (button1.Text == "") { button1.Text = "O"; return; }
                if (button7.Text == "") { button7.Text = "O"; return; } 
            }
            if (button8.Text == "X")
            {
                if (button7.Text == "") { button7.Text = "O"; return; }
                if (button9.Text == "") { button9.Text = "O"; return; }  
            }
            if (button6.Text == "X")
            {
                if (button3.Text == "") { button3.Text = "O"; return; }
                if (button9.Text == "") { button9.Text = "O"; return; }  
            }        
 
            for (int i = 0; i < buttons.Length; ++i)
            {
                if (buttons[i].Text == "")
                {
                    buttons[i].Text = "O";
                    return;
                }
            }

        }
  • Вопрос задан
  • 270 просмотров
Пригласить эксперта
Ответы на вопрос 2
GavriKos
@GavriKos
Жуть. Первое. Логика вычисления кода не должна работать с button, а уж тем более с button.text. Используйте модель и вьюху. В логику - только модель пихать.

Дальше. Это все можно преобразовать в матрицы и словарь "состояние поля - ход". Что укоротит код.
Ну и третье - это ж тупо все варианты забиты вроде...
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Перед нами крайне противный код на C#, видимо, играющий в крестики-нолики. Что я пока вижу…
1. Код намертво привязан к отображению. Использовать массив из enum ( EMPTY, X, O ).
2. Лучше не устанавливать в массив O, а указывать, куда сходить. То есть, return 0, если ход в 0-ю клетку, и т.д.
3. Поиск мата в один ход и защиты от чужого мата в один ход — один и тот же код. Поэтому можно написать так.
int r = detectImmediate(Cell.O);
if (r >= 0)
  return r;
r = detectImmediate(Cell.X);
if (r >= 0)
  return r;

4. Я не знаю, кем рассчитывает играть наш компьютер — первым или вторым. Стоило бы написать пару правил наподобие «поле пустое — ходи в угол, центр свободен — ходи в центр».
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы