Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
 Аватар для AnonymC
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390

крестик-нолик - функция пoбеды

02.12.2010, 20:32. Показов 3164. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ну кто же!!!
Помогите,функция проверки на победу не работает нормально!
Даже коменты написал что бы не запутаться...помогите.
вот если крестики(или нолики) будут весь первый ряд, то есть первая вертикаль,то как я понял получается бесконечный цикл..то есть ничего не выводится и нельзя что-либо вводить
В чем проблема?
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <iostream>
#include <time.h>
#include <windows.h>
#include <math.h>
#include <D:\\alex\\head-files\\mathem.h>
#include <D:\\alex\\head-files\\kurs.h>
#include <D:\\alex\\head-files\\factorial.h>
using namespace std;
const int n=3;  //матрица
//объявление функций
void inp(int x[][n]);//функция ввода
void out(int x[][n]);//функиця вывода матрицы
bool win(int x[][n]);//проверка на победу/проигрыш/ничью
void comp(int x[][n]);//функция интелекта компьютера
 
void main()
{
    int x[n][n]={0};    //инициализованная матрица
    while(true) //бесконечный цикл
{
    out(x); //вывод матрицы
    inp(x); //ввод крестика в матрицу
    if(win(x)==1)//если конец игры
    {
        out(x);         //вывод
        win(x);         //выводит либо победителя 
        break;          //остановка цикла-игры
    }
        else comp(x);   //если не конец игры,то ход компьютера
    }
}
 
void inp(int x[][n])
{
    int i=0,j=0;
loop: //цикл
    //вводим координаты-где будет Х
    cout<<"i=";
    cin>>i;
    cout<<"j=";
    cin>>j;
    if(x[i][j]==0)//если не занято то присвоить Х
    x[i][j]=1;
    else if(i>2 || j>2 || i<0 || j<0 || x[i][j]!=0)
    {
        cout<<"WRONG,TRY AGAIN"<<endl; //или же повторить ход сначала
        goto loop;
    }
}
void out(int x[][n]) //функция вывода матрицы
{
        system("cls");//заранее экран очищяется
    cout<<endl;
for(int i=0;i<1;i++)
{
        for(int m=0;m<n;m++)
            cout<<"_____";
    cout<<endl;
}
for(int i=0;i<n;i++)
{
    for(int j=0;j<n;j++){
        
            if(x[i][j]==1)
        cout<<"I"<<" X "<<"I";
            else if(x[i][j]==2)
                cout<<"I"<<" 0 "<<"I";
            else if(x[i][j]==0)
                cout<<"I"<<"   "<<"I";      
        }
    cout<<endl;
    for(int m=0;m<n;m++)
            cout<<"_____";
    cout<<endl;
}
cout<<endl; 
}
 
bool win(int x[][n])//функция проверки игры
{
        for(int i = 0; i < n; i++)
        if(x[i][0] == x[i][1] && x[i][0] == x[i][2] && x[i][0]!=0)//Проверка i-ой линии
        {
        if(x[i][0]==1)cout<<"YOU WON!!!!!!"<<endl;
        else if(x[i][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
        return 1;
        }
     for(int i = 0; i < n; i++)
        if(x[0][i] == x[1][i] && x[0][i] == x[i][2]  && x[0][i]!=0)//Проверка столбца
     {
        if(x[0][i]==1)cout<<"YOU WON!!!!!!"<<endl;
        else if(x[0][i]==2)cout<<"YOU LOSE!!!!!!"<<endl;
        return 1;
        }
     if(x[0][0] == x[1][1] && x[1][1] == x[2][2]  && x[0][0]!=0)//Проверка главной диагонали
         {
        if(x[0][0]==1)cout<<"YOU WON!!!!!!"<<endl;
        else if(x[0][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
        return 1;
        }
     if(x[0][2] == x[1][1] && x[1][1] == x[2][0]  && x[0][2]!=0)//Проверка побочной диагонали
        {
        if(x[1][1]==1)cout<<"YOU WON!!!!!!"<<endl;
        else if(x[1][1]==2)cout<<"YOU LOSE!!!!!!"<<endl;
        return 1;
        }        
     if(x[0][0] == x[1][0] && x[0][0] == x[2][0]  && x[0][2]!=0)//проверка первого столбца
        {
        if(x[0][0]==1)cout<<"YOU WON!!!!!!"<<endl;
        else if(x[0][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
        return 1;
        }
      if(x[0][1] == x[1][1] && x[0][1] == x[2][1]  && x[2][1]!=0)//Проверка второго столбца
        {
        if(x[0][1]==1)cout<<"YOU WON!!!!!!"<<endl;
        else if(x[0][1]==2)cout<<"YOU LOSE!!!!!!"<<endl;
        return 1;
        }   
     return 0;
}
 
void comp(int x[][n])//Ход компьютера. Если рядом с крестиком есть крестик,то рядом с другим крестиком написать 0
{
    int a=0,b=0;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
        {           
rrand:      a=rand()%2;
            b=rand()%2;
            if(x[a][b]==0)x[a][b]=2;
            else goto rrand;
            i=n;
                j=n;
        }
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.12.2010, 20:32
Ответы с готовыми решениями:

крестик-нолик - функция победы
пишу игру крестики нолики. функция bool win(int x; порверят на каждом шагу наличие на победу. Как мне писать грамотно условие...

крестик-нолик-условие ничьи
как написать условие ничьи для игры крестики нолики? Если рассмотреть доску как матрицу,то я смог написать условие только для самого...

Интеллект компьютера в игре Крестик-Нолик
вот написал себе игру крестик нолик. Все нормально получилось. Просто вот не могу объяснить компьютеру как правильно думать. У меня есть...

17
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
02.12.2010, 20:48
Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
if(x[0][i] == x[1][i] && x[0][i] == x[i][2] && x[0][i]!=0)//Проверка столбца
Здесь ошибка, должно быть так:
C++
1
if(x[0][i] == x[1][i] && x[0][i] == x[2][i] && x[0][i]!=0)//Проверка столбца
Это лишнее:
Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
if(x[0][0] == x[1][0] && x[0][0] == x[2][0] && x[0][2]!=0)//проверка первого столбца
{
if(x[0][0]==1)cout<<"YOU WON!!!!!!"<<endl;
else if(x[0][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
return 1;
}
if(x[0][1] == x[1][1] && x[0][1] == x[2][1] && x[2][1]!=0)//Проверка второго столбца
{
if(x[0][1]==1)cout<<"YOU WON!!!!!!"<<endl;
else if(x[0][1]==2)cout<<"YOU LOSE!!!!!!"<<endl;
return 1;
0
 Аватар для AnonymC
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
02.12.2010, 21:17  [ТС]
Ход мой,я ввел координаты Х-а,и тут снова то ли бесконечный цикл то ли прога зависает. Скорее всего бесконечный цикл...
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
02.12.2010, 21:46
Цитата Сообщение от ^Tecktonik_KiLLeR Посмотреть сообщение
rrand: a=rand()%2;
b=rand()%2;
Замените на:
C++
1
2
rrand:          a=rand()%3;
                        b=rand()%3;
0
02.12.2010, 21:48

Не по теме:

Это игра с полной информацией?

0
 Аватар для AnonymC
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
03.12.2010, 18:22  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
Это игра с полной информацией?
как понять?О_о
0
Заблокирован
03.12.2010, 18:36
Он хотел спросить: кореллируют ли выигрышные стратегии игрока и его противника друг с другом.
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
03.12.2010, 19:21
Цитата Сообщение от Object Посмотреть сообщение
Он хотел спросить: кореллируют ли выигрышные стратегии игрока и его противника друг с другом.
В слове "кореллируют " две ошибки. А ответ - нет.
0
 Аватар для AnonymC
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
04.12.2010, 15:28  [ТС]
valeriikozlov, ничего не понял

Добавлено через 14 часов 47 минут
valeriikozlov, вот написал отрывок лдя ничьи
C++
1
2
3
4
5
6
7
8
9
10
     //НИЧЬЯ
     int d=0;
     for(int i=0;i<n;i++)
         for(int j=0;j<n;j++)
        if(x[i][j]!=0)d++;//если данная ячейка не свободна то d++
     if(d==9)//если d==9(то есть если нигде не пусто), то ничья
     {
     cout<<"DRAW!!!!!!"<<endl;
     return 1;
     }
если все правильно то осталось написать,то есть дописать функцию компа. Его интелект..Как сделать?
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
04.12.2010, 16:49
Замучился я с Вашей программой играть, что бы была ничья, но все-таки добился. Теперь сами проверяйте-играйте:
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include <iostream>
#include <time.h>
#include <windows.h>
#include <math.h>
//#include <D:\\alex\\head-files\\mathem.h>
//#include <D:\\alex\\head-files\\kurs.h>
//#include <D:\\alex\\head-files\\factorial.h>
using namespace std;
const int n=3;  //матрица
//объявление функций
void inp(int x[][n]);//функция ввода
void out(int x[][n]);//функиця вывода матрицы
bool win(int x[][n]);//проверка на победу/проигрыш/ничью
void comp(int x[][n]);//функция интелекта компьютера
 
void main()
{
        int x[n][n]={0};        //инициализованная матрица
        while(true) //бесконечный цикл
{
        out(x); //вывод матрицы
        inp(x); //ввод крестика в матрицу
        if(win(x)==1)//если конец игры
        {
                out(x);                 //вывод 
                win(x);                 //выводит либо победителя                 
                break;                  //остановка цикла-игры
                
        }
                else comp(x);   //если не конец игры,то ход компьютера
                if(win(x)==1)
                {
                    out(x);                 //вывод
                    win(x);                 //выводит либо победителя    
                    break;                 //выводит либо победителя 
                }
        }
}
 
void inp(int x[][n])
{
        int i=0,j=0;
loop: //цикл
        //вводим координаты-где будет Х
        cout<<"i=";
        cin>>i;
        cout<<"j=";
        cin>>j;
        if(x[i][j]==0)//если не занято то присвоить Х
        x[i][j]=1;
        else if(i>2 || j>2 || i<0 || j<0 || x[i][j]!=0)
        {
                cout<<"WRONG,TRY AGAIN"<<endl; //или же повторить ход сначала
                goto loop;
        }
}
void out(int x[][n]) //функция вывода матрицы
{
                system("cls");//заранее экран очищяется
        cout<<endl;
for(int i=0;i<1;i++)
{
                for(int m=0;m<n;m++)
                        cout<<"_____";
        cout<<endl;
}
for( i=0;i<n;i++)
{
        for(int j=0;j<n;j++){
                
                        if(x[i][j]==1)
                cout<<"I"<<" X "<<"I";
                        else if(x[i][j]==2)
                                cout<<"I"<<" 0 "<<"I";
                        else if(x[i][j]==0)
                                cout<<"I"<<"   "<<"I";          
                }
        cout<<endl;
        for(int m=0;m<n;m++)
                        cout<<"_____";
        cout<<endl;
}
cout<<endl;     
}
 
bool win(int x[][n])//функция проверки игры
{
            for(int i = 0; i < n; i++)
        if(x[i][0] == x[i][1] && x[i][0] == x[i][2] && x[i][0]!=0)//Проверка i-ой линии
                {
                if(x[i][0]==1)cout<<"YOU WON!!!!!!"<<endl;
                else if(x[i][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
                return 1;
                }
     for(int i = 0; i < n; i++)
        if(x[0][i] == x[1][i] && x[0][i] == x[2][i] && x[0][i]!=0)//Проверка столбца
         {
                if(x[0][i]==1)cout<<"YOU WON!!!!!!"<<endl;
                else if(x[0][i]==2)cout<<"YOU LOSE!!!!!!"<<endl;
                return 1;
                }
     if(x[0][0] == x[1][1] && x[1][1] == x[2][2]  && x[0][0]!=0)//Проверка главной диагонали
                 {
                if(x[0][0]==1)cout<<"YOU WON!!!!!!"<<endl;
                else if(x[0][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
                return 1;
                }
     if(x[0][2] == x[1][1] && x[1][1] == x[2][0]  && x[0][2]!=0)//Проверка побочной диагонали
                {
                if(x[1][1]==1)cout<<"YOU WON!!!!!!"<<endl;
                else if(x[1][1]==2)cout<<"YOU LOSE!!!!!!"<<endl;
                return 1;
                } 
     int d=0;
     for(int i=0;i<n;i++)
         for(int j=0;j<n;j++)
             if(x[i][j]!=0)d++;//если данная ячейка не свободна то d++
             if(d==9)//если d==9(то есть если нигде не пусто), то ничья
             {
                 cout<<"DRAW!!!!!!"<<endl;
                 return 1;
             }
    return 0;
}
 
void comp(int x[][n])//Ход компьютера. Если рядом с крестиком есть крестик,то рядом с другим крестиком написать 0
{
        int a=0,b=0;
        for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                {                       
rrand:          a=rand()%3;
                        b=rand()%3;
                if(x[a][b]==0)x[a][b]=2;
                        else goto rrand;
                        i=n;
                                j=n;
                }
}
0
Эксперт С++
5058 / 3118 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
04.12.2010, 17:17
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Замучился я с Вашей программой играть, что бы была ничья
Это говорит о том, что бот написан плохо. Ибо при безупречной игре обоих игроков на поле 3х3 ничья обеспечена в любом случае.
1
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
04.12.2010, 18:46
В этом коде вообще нет правила безупречной игры со стороны противника. Со стороны противника все основано на случайных числах. Даже выигрышная позиция противником пропускается.
0
 Аватар для AnonymC
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
04.12.2010, 19:37  [ТС]
Цитата Сообщение от valeriikozlov Посмотреть сообщение
В этом коде вообще нет правила безупречной игры со стороны противника. Со стороны противника все основано на случайных числах. Даже выигрышная позиция противником пропускается.
Вот в этом и вся проблема..
Вместо случайных чисел там должен быть мозг,но я не могу создать его.

Добавлено через 11 секунд
Вот поэтому и написал сюда.
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
04.12.2010, 19:43
^Tecktonik_KiLLeR, Так в чем проблемма? Я в ввашем коде прочитал комментарии:
//Ход компьютера. Если рядом с крестиком есть крестик,то рядом с другим крестиком написать 0
{
Но реализации этого не увидел. У Вас просто ставится 0 по принципу rand. И Вы об этом тоже не просите. Нужно Вам это реализовать? Если да, то это не очень сложно.
0
 Аватар для AnonymC
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
05.12.2010, 17:58  [ТС]
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Я в ввашем коде прочитал комментарии:
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Но реализации этого не увидел
Т.к. я не бездельничал, я попробовал написать этот код,но не вышло,не вышло написать код если два крестика стоят друг рядом с другом и если та, третья ячейка пуста-написать нолик...Вот и этот неработающий код удалил.А комент забыл.
Цитата Сообщение от valeriikozlov Посмотреть сообщение
Если да, то это не очень сложно.
Для студента первого курса,который только только начинает изучать матрицу-сложно. Еще как.
Ибо не открыл бы тему.
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
06.12.2010, 06:21
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
#include <iostream>
#include <time.h>
#include <windows.h>
#include <math.h>
//#include <D:\\alex\\head-files\\mathem.h>
//#include <D:\\alex\\head-files\\kurs.h>
//#include <D:\\alex\\head-files\\factorial.h>
using namespace std;
const int n=3;  //матрица
//объявление функций
void inp(int x[][n]);//функция ввода
void out(int x[][n]);//функиця вывода матрицы
bool win(int x[][n]);//проверка на победу/проигрыш/ничью
void comp(int x[][n]);//функция интелекта компьютера
 
void main()
{
        int x[n][n]={0};        //инициализованная матрица
        while(true) //бесконечный цикл
{
                out(x); //вывод матрицы
        inp(x); //ввод крестика в матрицу
        if(win(x)==1)//если конец игры
        {
                                out(x);                 //вывод 
                                win(x);                 //выводит либо победителя                 
                break;                  //остановка цикла-игры
                                
        }
                else comp(x);   //если не конец игры,то ход компьютера
                                if(win(x)==1)
                                {
                                        out(x);                 //вывод
                                        win(x);                 //выводит либо победителя    
                                        break;                 //выводит либо победителя 
                                }
        }
}
 
void inp(int x[][n])
{
        int i=0,j=0;
loop: //цикл
        //вводим координаты-где будет Х
        cout<<"i=";
        cin>>i;
        cout<<"j=";
        cin>>j;
        if(x[i][j]==0)//если не занято то присвоить Х
        x[i][j]=1;
        else if(i>2 || j>2 || i<0 || j<0 || x[i][j]!=0)
        {
                cout<<"WRONG,TRY AGAIN"<<endl; //или же повторить ход сначала
                goto loop;
        }
}
void out(int x[][n]) //функция вывода матрицы
{
                system("cls");//заранее экран очищяется
        cout<<endl;
for(int i=0;i<1;i++)
{
                for(int m=0;m<n;m++)
                        cout<<"_____";
        cout<<endl;
}
for(i=0;i<n;i++)//
{
        for(int j=0;j<n;j++){
                
                        if(x[i][j]==1)
                cout<<"I"<<" X "<<"I";
                        else if(x[i][j]==2)
                                cout<<"I"<<" 0 "<<"I";
                        else if(x[i][j]==0)
                                cout<<"I"<<"   "<<"I";          
                }
        cout<<endl;
        for(int m=0;m<n;m++)
                        cout<<"_____";
        cout<<endl;
}
cout<<endl;     
}
 
bool win(int x[][n])//функция проверки игры
{
            for(int i = 0; i < n; i++)
        if(x[i][0] == x[i][1] && x[i][0] == x[i][2] && x[i][0]!=0)//Проверка i-ой линии
                {
                if(x[i][0]==1)cout<<"YOU WON!!!!!!"<<endl;
                else if(x[i][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
                return 1;
                }
     for( i = 0; i < n; i++)//
        if(x[0][i] == x[1][i] && x[0][i] == x[2][i] && x[0][i]!=0)//Проверка столбца
         {
                if(x[0][i]==1)cout<<"YOU WON!!!!!!"<<endl;
                else if(x[0][i]==2)cout<<"YOU LOSE!!!!!!"<<endl;
                return 1;
                }
     if(x[0][0] == x[1][1] && x[1][1] == x[2][2]  && x[0][0]!=0)//Проверка главной диагонали
                 {
                if(x[0][0]==1)cout<<"YOU WON!!!!!!"<<endl;
                else if(x[0][0]==2)cout<<"YOU LOSE!!!!!!"<<endl;
                return 1;
                }
     if(x[0][2] == x[1][1] && x[1][1] == x[2][0]  && x[0][2]!=0)//Проверка побочной диагонали
                {
                if(x[1][1]==1)cout<<"YOU WON!!!!!!"<<endl;
                else if(x[1][1]==2)cout<<"YOU LOSE!!!!!!"<<endl;
                return 1;
                } 
         int d=0;
         for( i=0;i<n;i++)//
                 for(int j=0;j<n;j++)
                         if(x[i][j]!=0)d++;//если данная ячейка не свободна то d++
                         if(d==9)//если d==9(то есть если нигде не пусто), то ничья
                         {
                                 cout<<"DRAW!!!!!!"<<endl;
                                 return 1;
                         }
        return 0;
}
 
void comp(int x[][n])//Ход компьютера. Если рядом с крестиком есть крестик,то рядом с другим крестиком написать 0
{
        int a=0,b=0, X, N;
        bool fl=true;
       for(int i=0; fl && i<n;i++)
       {
           X=0, N=0;
           for(int j=0;fl && j<n;j++)
           {
               if(x[i][j]==2) X++;
               if(x[i][j]==1) N++;
           }
           if(X==2 && N==0)
           {
               fl=false;
               for(int j=0; j<n; j++)
                   if(x[i][j]==0)
                       x[i][j]=2;
           }
       }
       for(i=0; fl && i<n;i++)//
       {
           X=0, N=0;
           for(int j=0;fl && j<n;j++)
           {
               if(x[j][i]==2) X++;
               if(x[j][i]==1) N++;
           }
           if(X==2 && N==0)
           {
               fl=false;
               for(int j=0; j<n; j++)
                   if(x[j][i]==0)
                       x[j][i]=2;
           }
       }
       X=0, N=0;
       for( i=0; fl && i<n;i++)//
       {
               if(x[i][i]==2) X++;
               if(x[i][i]==1) N++;
       }
       if(X==2 && N==0)
       {
           fl=false;
           for(int i=0; i<n; i++)
               if(x[i][i]==0)
                   x[i][i]=2;
       }
       X=0, N=0;
       for( i=0; fl && i<n;i++)//
       {
               if(x[2-i][i]==2) X++;
               if(x[2-i][i]==1) N++;
       }
       if(X==2 && N==0)
       {
           fl=false;
           for(int i=0; i<n; i++)
               if(x[2-i][i]==0)
                   x[2-i][i]=2;
       }
       //
        for( i=0; fl && i<n;i++)//
                for(int j=0;fl && j<n;j++)
                    if(x[i][j]==2)
                    {
                        if(i>0 && x[i-1][j]==0)
                        {
                            fl=false; x[i-1][j]=2;
                        }
                        else
                        if(j>0 && x[i][j-1]==0)
                        {
                            fl=false; x[i][j-1]=2;
                        }
                        else
                        if(i<2 && x[i+1][j]==0)
                        {
                            fl=false; x[i+1][j]=2;
                        }
                        else
                        if(j<2 && x[i][j+1]==0)
                        {
                            fl=false; x[i][j+1]=2;
                        }
                        else
                        if(i>0 && j>0 && x[i-1][j-1]==0)
                        {
                            fl=false; x[i-1][j-1]=2;
                        }
                        else
                        if(i>0 && j<2 && x[i-1][j+1]==0)
                        {
                            fl=false; x[i-1][j+1]=2;
                        }
                        else
                        if(i<2 && j<2 && x[i+1][j+1]==0)
                        {
                            fl=false; x[i+1][j+1]=2;
                        }
                        else
                        if(i<2 && j>0 && x[i+1][j-1]==0)
                        {
                            fl=false; x[i+1][j-1]=2;
                        }
                    }
         if(fl)
         {
             for(int i=0;i<n;i++)
                 for(int j=0;j<n;j++)
                 {                       
 rrand:          a=rand()%3;
                        b=rand()%3;
                                if(x[a][b]==0)x[a][b]=2;
                        else goto rrand;
                        i=n;
                                j=n;
                }
         }
}
Сейчас мозг (как Вы его называете), работает так: - сначало ищет в строках столбцах и диагоналях наличие 2-х ноликов и отсутствие крестиков. Если такие находятся, то ставит там недостающий нолик и получается выигрыш.
- если таких строк, столбцов или диагоналей нет, то ищет любой нолик и ставит рядом с ним на пустое место еще один ноль.
- если и таких не нашлось, то тогда используется rand().
Вроде получилось, то что Вы хотели, но нет пределу совершенства. На мой взгляд недостатки следующие:
- Например в одной строке стоят: самый левый нолик, самый правый крестик (посередине пусто). Эта программа запросто поставит на пустое место нолик (добавляя его уже стоящему) - хотя вариант все равно не выигрышный заранее.
- Также нет учета за действиями противника. Например ход нолика. Если крестикам осталось до выигрыша 1 ход, этот факт ноликом будет игнорироваться. И ставить нолик он будет к уже имеющемуся нолику, а не туда, где можно предотвратить выигрыш крестиков.
Если Вас устроит данный вариант, пожалуйста. Если что-нибудь хотите улучшить, пишите будем работать дальше.
1
 Аватар для AnonymC
1183 / 468 / 87
Регистрация: 23.06.2009
Сообщений: 6,390
06.12.2010, 19:59  [ТС]
valeriikozlov, Большое вам спасибо за "мозг"..!!!! Думаю если уже "искра" есть,то я сам уже напишу...Если смогу конечно.

Добавлено через 1 минуту
ууу....вот взглянул на функцию мозга))кх...если не трудно то к каждой строке пишите коменты...как то не правильно чтобы скопировал и скинул туда...хочу понять я)
0
Эксперт С++
 Аватар для valeriikozlov
4728 / 2549 / 757
Регистрация: 18.08.2009
Сообщений: 4,568
06.12.2010, 20:22
См. комментарии:
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
121
void comp(int x[][n])//Ход компьютера. Если рядом с крестиком есть крестик,то рядом с другим крестиком написать 0
{
        int a=0,b=0, X, N;
                bool fl=true;
       for(int i=0; fl && i<n;i++)// в этом цикле проверка по строкам
           {
                   X=0, N=0;
                   for(int j=0;fl && j<n;j++)
                   {
                           if(x[i][j]==2) X++;// если в строке встретился нолик то переменную X увеличиваем на 1
                           if(x[i][j]==1) N++;//если в строке встретился крестик то переменную N увеличиваем на 1
                   }
                   if(X==2 && N==0)// если в строке два нолика и нет крестиков (т.е. мы рассматриваем не только два рядом стоящих нолика, но и через одну свободную клетку)
                   {
                           fl=false;
                           for(int j=0; j<n; j++)
                                   if(x[i][j]==0)
                                           x[i][j]=2;// то вычисляем, где свободная клетка и ставим туда нолик
                   }
           }
       for(i=0; fl && i<n;i++)//в этом цикле аналогичная проверка по столбцам
           {
                   X=0, N=0;
                   for(int j=0;fl && j<n;j++)
                   {
                           if(x[j][i]==2) X++;
                           if(x[j][i]==1) N++;
                   }
                   if(X==2 && N==0)
                   {
                           fl=false;
                           for(int j=0; j<n; j++)
                                   if(x[j][i]==0)
                                           x[j][i]=2;
                   }
           }
           X=0, N=0;
       for( i=0; fl && i<n;i++)// здесь идет похожая проверка по главной диагонали
           {
                           if(x[i][i]==2) X++;
                           if(x[i][i]==1) N++;
           }
           if(X==2 && N==0)
           {
                   fl=false;
                   for(int i=0; i<n; i++)
                           if(x[i][i]==0)
                                   x[i][i]=2;
           }
           X=0, N=0;
       for( i=0; fl && i<n;i++)// здесь идет похожая проверка по побочной диагонали
           {
                           if(x[2-i][i]==2) X++;
                           if(x[2-i][i]==1) N++;
           }
           if(X==2 && N==0)
           {
                   fl=false;
                   for(int i=0; i<n; i++)
                           if(x[2-i][i]==0)
                                   x[2-i][i]=2;
           }
           //
        for( i=0; fl && i<n;i++)//если вышеперечисленных вариантов нет, то ищем нолик с пустой рядом клеткой и ставим туда нолик
                for(int j=0;fl && j<n;j++)
                                        if(x[i][j]==2)
                                        {
                                                if(i>0 && x[i-1][j]==0)// здесь проверка верхней клетки на то что она свободна и если она свободна то ставим туда нолик
                                                {
                                                        fl=false; x[i-1][j]=2;
                                                }
                                                else
                                                if(j>0 && x[i][j-1]==0)// здесь проверка левой клетки на то что она свободна и если она свободна то ставим туда нолик
                                                {
                                                        fl=false; x[i][j-1]=2;
                                                }
                                                else
                                                if(i<2 && x[i+1][j]==0)// здесь проверка нижней клетки на то что она свободна и если она свободна то ставим туда нолик
                                                {
                                                        fl=false; x[i+1][j]=2;
                                                }
                                                else
                                                if(j<2 && x[i][j+1]==0)// здесь проверка правой клетки на то что она свободна и если она свободна то ставим туда нолик
                                                {
                                                        fl=false; x[i][j+1]=2;
                                                }
                                                else
                                                if(i>0 && j>0 && x[i-1][j-1]==0)// здесь проверка левой верхней клетки на то что она свободна и если она свободна то ставим туда нолик
                                                {
                                                        fl=false; x[i-1][j-1]=2;
                                                }
                                                else
                                                if(i>0 && j<2 && x[i-1][j+1]==0)// здесь проверка правой верхней клетки на то что она свободна и если она свободна то ставим туда нолик
                                                {
                                                        fl=false; x[i-1][j+1]=2;
                                                }
                                                else
                                                if(i<2 && j<2 && x[i+1][j+1]==0)// здесь проверка нижней правой клетки на то что она свободна и если она свободна то ставим туда нолик
                                                {
                                                        fl=false; x[i+1][j+1]=2;
                                                }
                                                else
                                                if(i<2 && j>0 && x[i+1][j-1]==0)// здесь проверка нижней левой клетки на то что она свободна и если она свободна то ставим туда нолик
                                                {
                                                        fl=false; x[i+1][j-1]=2;
                                                }
                                        }
                 if(fl)// если нет и такого варианта, то выбираем место очередному нолику с помощью rand()
                 {
                         for(int i=0;i<n;i++)
                                 for(int j=0;j<n;j++)
                                 {                       
 rrand:          a=rand()%3;
                        b=rand()%3;
                                if(x[a][b]==0)x[a][b]=2;
                        else goto rrand;
                        i=n;
                                j=n;
                }
                 }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.12.2010, 20:22
Помогаю со студенческими работами здесь

Игра крестики-нолик
Пишу игру крестики-нолики с хоть каким-то ИИ. Есть функция bot_attack и функция bot_def bool Game::bot_attack() { ...

Адаптировать нолик в корзине
Вот сайт с которым ковыряюсь: http://htmltestolivegrey.dtraduga.vh55.hosterby.com Справа вверху корзина и с ней кружок в котором...

Как из еденички сделать нолик
здравствуйте. мне надо при происхождении события менять некоторое число. типа есть число х=0, происходит событие и х=1, опять происходит...

Список, выводит лишний нолик
Задание таково: Внести значения, выбрать количество элементов которые должны вывестись на экран с конца списка. Я почти решил но есть...

Холодильник Privileg PNC 925942654-01, ошибка , высвечивает верхний нолик
Холодильник Privileg , PrivNr 4734 , PNC 925942654-01 высвечивает верхний нолик на индикаторе холодильного отделения. Есть подозрения что...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: показать затраченные материалы за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В качестве. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru