@IvanTwice

Как реализовать потенцальный выйгрыш в игре Крестики нолики Unity c#?

Здравствуйте, столкнулся с проблемой в игре Крестики нолики, при игре с компютером. Сейчас ходы комьютера производятся с помощью рандома, мне надо сделать так, чтобы он предотвращал потенциальный выигрыш икрока, тоесть когда стоит 2 в ряд, ии ставил свой символ в 3ий пустой слот.
private IEnumerator BotStep() {
        yield return new WaitForSeconds(0.5f);
        List<int> numbers = new List<int>();
        for (int i = 0; i < values.Length; i++) {
            if (values[i] == 0) {
                Debug.Log(i + " in list");
                numbers.Add(i);
            }
        }
        var potentialWin = CheckPreWin(2) != -1 ? CheckPreWin(2) : CheckPreWin(1) != -1 ? CheckPreWin(1) : -1;
        var maxLength = numbers.Count;
        var random = UnityEngine.Random.Range(0, maxLength);
        var index = numbers[random];
        numbers[random] = potentialWin;
        
        Debug.Log("BOT CAN CHOOSE THIS");
        buttons[index].interactable = false;
        buttons[index].GetComponent<Image>().sprite = o;
        values[index] = 2;
        Debug.Log("123");
        CheckWin(2);
        isXStep = true;

    }
    private void CheckWin(int number) {
             var compareCount = 0;
             var isDraw = 0;
             var isWin = false;
             for (int i = 0; i < 8; i++) {
                 for (int j = 0; j < 3; j++) {
                     var winNumber = WinCombinations[i, j];
                     if (values[winNumber] == number) {
                         compareCount += 1;
                     } else {
                         compareCount = 0;
                         break;
                     }
                 }
     
                 if (compareCount == 3) {
                     isWin = true;
                     Debug.Log(number + "  WIN");
                     GameOver.SetActive(true);
                     WhoWin.transform.GetComponent<Image>().sprite = number == 1 ? x :o;
                     Wintext.transform.GetComponent<Text>().text = "WIN";
                     break;   
                 }
             }
       
             foreach (var num in values) {
             if (num == 0) isDraw += 1;
                 //if (compareCount == 3) isDraw -= 1;
                 //if (compareCount == 0 ) isDraw += 1;
             }
        if (isDraw == 0 && !isWin) {    
                 Debug.Log("MATCH IS DRAW");
                 GameOver.SetActive(true);
                 WhoWin.transform.GetComponent<Image>().sprite = draw;
                 Wintext.transform.GetComponent<Text>().text = " ";
             }
         }

    
    private int CheckPreWin(int number) {
        var potentialWin = 0;    
        var compareCount = 0;
        var neededNumber = -1;
        var isDraw = 0;
        for (int i = 0; i < 8; i++) {
            for (int j = 0; j < 3; j++) {
                var winNumber = WinCombinations[i, j];
                if (values[winNumber] == number) {
                    compareCount += 1;
                } if (values[winNumber] != number) {
                    neededNumber = values[winNumber];
                }     
            }
                if (compareCount == 2) break;
                else if (compareCount < 2) {
                    compareCount = 0;
                    neededNumber = -1;
                }
        }

        return neededNumber;
    }
  • Вопрос задан
  • 52 просмотра
Пригласить эксперта
Ответы на вопрос 1
@namee
RLY? Задача для 10 класса средней школы.
Эх помню времена, бейсик, корвет и написанные в 10 классе крестики-нолики, которые невозможно было выиграть.

Пораскинь мозгами! Или бросай это дело.
Ответ написан
Ваш ответ на вопрос

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

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