Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 10
1

Более правильный алгоритм ходов компьютера в игре крестики-нолики

29.03.2016, 01:21. Показов 3186. Ответов 7
Метки нет (Все метки)

Не так давно я захотел сделать крестики нолики. Вчера наконец-то появилось время и я их сделал. Скорее-всего код ужасен, но я знаю совсем мало команд и опыта тоже мало. Но не в этом дело.
Вот есть код:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
public void ii1() //компьютер
        {
            Random rand = new Random();
 
            int temp;
            temp = rand.Next(1,9); 
            
            switch (temp)
            {
                case 1:
                    if (flag1 == 1)
                    {
                        ii1();
                        break;
                    }
                    pictureBox1.Image = global::WindowsFormsApplication1.Properties.Resources._3;
                    flag1 = 1;
                    pictureBox1.Enabled = false;
                    iiflag1 = 1;
                    
                    break;
                case 2:
                    if (flag2 == 1)
                    {
                        ii1();
                        break;
                    }
                    pictureBox2.Image = global::WindowsFormsApplication1.Properties.Resources._3;
                    flag2 = 1;
                    pictureBox2.Enabled = false;
                    iiflag2 = 1;
                    
                    break;
                case 4:
                    if (flag5 == 1)
                    {
                        ii1();
                        break;
                    }
                    pictureBox5.Image = global::WindowsFormsApplication1.Properties.Resources._3;
                    flag5 = 1;
                    pictureBox5.Enabled = false;
                    iiflag5 = 1;
                    
                    break;
                case 3:
                    if (flag4 == 1)
                    {
                        ii1();
                        break;
                    }
                    pictureBox4.Image = global::WindowsFormsApplication1.Properties.Resources._3;
                    flag4 = 1;
                    pictureBox4.Enabled = false;
                    iiflag4 = 1;
                    
                    break;
                case 5:
                    if (flag10 == 1)
                    {
                        ii1();
                        break;
                    }
                    pictureBox10.Image = global::WindowsFormsApplication1.Properties.Resources._3;
                    flag10 = 1;
                    pictureBox10.Enabled = false;
                    iiflag10 = 1;
                    
                    break;
                case 6:
                    if (flag3 == 1)
                    {
                        ii1();
                        break;
                    }
                    pictureBox3.Image = global::WindowsFormsApplication1.Properties.Resources._3;
                    flag3 = 1;
                    pictureBox3.Enabled = false;
                    iiflag3 = 1;
                    
                    break;
                case 7:
                    if (flag6 == 1)
                    {
                        ii1();
                        break;
                    }
                    pictureBox6.Image = global::WindowsFormsApplication1.Properties.Resources._3;
                    flag6 = 1;
                    pictureBox6.Enabled = false;
                    iiflag6 = 1;
                   
                    break;
                case 8:
                    if (flag7 == 1)
                    {
                        ii1();
                        break;
                    }
                    pictureBox7.Image = global::WindowsFormsApplication1.Properties.Resources._3;
                    flag7 = 1;
                    pictureBox7.Enabled = false;
                    iiflag7 = 1;
                    
                    break;
                case 9:
                    if (flag8 == 1)
                    {
                        ii1();
                        break;
                    }
                    pictureBox8.Image = global::WindowsFormsApplication1.Properties.Resources._3;
                    flag8 = 1;
                    pictureBox8.Enabled = false;
                    iiflag8 = 1;
                    
                    break;
            }
 
        }
Так я реализовал как ходит компьютер свой первый ход и ходы когда нет угрозы или возможности победить.
То есть он действует простым рандомом от 1-9. Дальше возникла проблема в том что он ходил даже на сыгранные pictureBox и менял на них картинку, хоть они и были отключены. Я это исправил так: добавил переменные flag (9 штук) которым присваивалась единица если pictureBox уже был нажат (хоть игроком, хоть компьютером). Так вот, добавив проверку в каждые case, и если выпадало рандомом тот pictureBox который уже был использован с метода запускался этот же метод (рекурсия?) до тех пор пока не попадался нужный, неиспользованный pictureBox. Я бы и не особо волновался, но очень редко игра зависает. Как я понимаю это случается когда не везёт и долго не выпадает нужный pictureBox. Можете сами проверить (я добавлю архив с проектом WindowsFormsApplication1.rar ), старайтесь не выигрывать и не создавать угрозы (2 из крестиков в линии) чтобы использовалась та часть кода которая отвечает за рандомные хода.

Ну и собсвенно прошу совета, как можно получше это переделать.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2016, 01:21
Ответы с готовыми решениями:

Алгоритм хода компьютера в игре "Крестики-Нолики" на неограниченном поле
Крестики нолики на неограниченном поле

Алгоритм умной стратегии компьютера, крестики - нолики
Ребят, подкиньте идей реализации

Алгоритм ходов компьютера в карточной игре "Дурак"
Здравствуйте. Помогите пожалуйста с реализацией алгоритма ходов компьютера. Я понимаю что должно...

Написать алгоритм расчета победы в сетевой игре "Крестики-нолики"
День добрый уважаемые форумчане. В качестве упражнения делаю маленькую игрушку- крестики-нолики по...

7
78 / 101 / 44
Регистрация: 12.05.2015
Сообщений: 476
29.03.2016, 02:07 2
Vasiliy551, возвращаемое значения метода rand.Next(1,9) не включает верхнюю границу, таким образом у вас никогда не выполняется case 9
C#
1
temp = rand.Next(1,10);
Добавлено через 39 секунд
Хотя нет, чушь сказал
0
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 10
29.03.2016, 02:28  [ТС] 3
"3. rand.Next(min , max);

Этот метод говорит о возвращении неотрицательного целого числа в пределе от min до max. Другими словами диапазов от [min до max-1]"

Нет вы правы. Проверил через консоль. Вывел 100 чисел случайных при "temp = rand.Next(1,9);" и ни одной девятки.

Исправил, спасибо за подсказку.

А по вопросу главному можете что-то посоветовать чтобы не было много обращений формы самой к себе, пока не повезёт?
0
78 / 101 / 44
Регистрация: 12.05.2015
Сообщений: 476
29.03.2016, 02:47 4
Лучший ответ Сообщение было отмечено Vasiliy551 как решение

Решение

Цитата Сообщение от Vasiliy551 Посмотреть сообщение
Нет вы правы. Проверил через консоль. Вывел 100 чисел случайных при "temp = rand.Next(1,9);" и ни одной девятки.
С методом рандом, да, проблема в том что от переполнения стека это не защищает.
Объявите Random rand = new Random(); в классе формы:
C#
1
2
3
4
5
public partial class Form1 : Form
{
       Random rand = new Random();
       ...
}
0
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 10
29.03.2016, 02:52  [ТС] 5
Цитата Сообщение от Tessio Посмотреть сообщение
С методом рандом, да, проблема в том что от переполнения стека это не защищает.
Объявите Random rand = new Random(); в классе формы:
C#
Выделить код
1
2
3
4
5
public partial class Form1 : Form
{
Random rand = new Random();
...
}
Извините за нубский вопрос конечно , но что это дает? Более большой стек?
0
78 / 101 / 44
Регистрация: 12.05.2015
Сообщений: 476
29.03.2016, 02:54 6
Цитата Сообщение от Vasiliy551 Посмотреть сообщение
А по вопросу главному можете что-то посоветовать чтобы не было много обращений формы самой к себе, пока не повезёт?
Если честно, крестики-нолики никогда не делал, поэтому даже не думал над алгоритмом игры компьютера. Но мне кажется, что в вашем алгоритме рандом приносит интерес в игре, поскольку если настраивать игру компьютера на стратегию выигрыша, мне кажется, ход игры будет однообразным.
0
0 / 0 / 0
Регистрация: 17.03.2016
Сообщений: 10
29.03.2016, 03:04  [ТС] 7
Цитата Сообщение от Tessio Посмотреть сообщение
Если честно, крестики-нолики никогда не делал, поэтому даже не думал над алгоритмом игры компьютера. Но мне кажется, что в вашем алгоритме рандом приносит интерес в игре, поскольку если настраивать игру компьютера на стратегию выигрыша, мне кажется, ход игры будет однообразным.
Я не хочу убирать рандом. Просто переделать бы его как-то. Можно конечно теоретически сделать if-else для всего количества возможных комбинаций, но их очень много.
0
78 / 101 / 44
Регистрация: 12.05.2015
Сообщений: 476
29.03.2016, 06:06 8
Лучший ответ Сообщение было отмечено Vasiliy551 как решение

Решение

Цитата Сообщение от Vasiliy551 Посмотреть сообщение
Извините за нубский вопрос конечно , но что это дает? Более большой стек?
Когда вы объявляете переменную в методе, она будет создаваться каждый раз когда вызываете метод, в вашем случае еще и рекурсия, а так переменная создана только один раз и вы ей пользуетесь.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.03.2016, 06:06

Ошибка в игре крестики-нолики
есть код программы крестики нолики. иногда сразу при запуске пишет "Ошибка: 3 - выход за границы...

Ошибка в игре крестики нолики на JavaScript
Добрый вечер, Написал игру крестики нолики с использованием Jquery, и после переписал на чистый...

Минимаксный перебор в игре крестики нолики
Здравствуйте! подскажите, пожалуйста, кто Профи. чего не хватает в этом коде? а именно в...

Реализовать ничью в игре Крестики-Нолики
Помогите сделать, чтоб в форме выводились не только победы крестиков и ноликов, но еще и ничья ...

Выбор знака в игре Крестики-нолики
Здравствуйте. У меня вопрос. Как в программе сделать чтобы Игрок1 мог выбрать крестиком ему играть...

Написать регистрацию игроков к игре крестики-нолики
Здраствуйте!!! У меня возникла проблема при написании игры "Хрестики нулики" как мне в коде...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru