Форум программистов, компьютерный форум CyberForum.ru

Как выйти из оператора if - C++

Восстановить пароль Регистрация
 
 
David_Ok
 Аватар для David_Ok
5 / 5 / 1
Регистрация: 12.01.2015
Сообщений: 87
21.07.2015, 17:32     Как выйти из оператора if #1
Пишу ИИ для крестиков-ноликов и вопрос в том, если исполниться одино условие как сделать так что бы другие не проверялись? break чето в if'ие не пашет, есть какие-то другие варианты?

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
 //первый щаг, заканчивание игры с одного хода
    for(int i=0; i<3; i++)
    {
        if (cells[i*3]==cells[i*3+1] && cells[i*3+1]=='O' && cells[i*3+2]=='-')
            {cells[i*3+2]='O'; break;}
        if (cells[i*3+1]==cells[i*3+2] && cells[i*3+2]=='O' && cells[i*3]=='-')
            {cells[i*3]='O'; break;}
        if (cells[i*3]==cells[i*3+2] && cells[i*3+2]=='O' && cells[i*3+1]=='-')
            {cells[i*3+1]='O'; break;}
        if (cells[i+3]==cells[i+6] && cells[i+6]=='O' && cells[i]=='-')
            {cells[i]='O'; break;}
        if (cells[i]==cells[i+3] && cells[i+3]=='O' && cells[i+6]=='-')
            {cells[i+6]='O'; break;}
        if (cells[i]==cells[i+6] && cells[i+6]=='O' && cells[i+3]=='-')
            {cells[i+3]=='O'; break;}
        if (cells[4]==cells[8] && cells[8]=='O' && cells[0]=='-')
            {cells[0]='O'; break;}
        if (cells[0]==cells[4] && cells[4]=='O' && cells[8]=='-')
            {cells[8]='O'; break;}
        if (cells[0]==cells[8] && cells[8]=='O' && cells[4]=='-')
            {cells[4]='O'; break;}
        if (cells[6]==cells[4] && cells[4]=='O' && cells[2]=='-')
            {cells[2]='O'; break;}
        if (cells[4]==cells[2] && cells[2]=='O' &&  cells[6]=='-')
            {cells[6]='O'; break;}
        if (cells[2]==cells[6] && cells[6]=='O' && cells[4]=='-')
            {cells[4]='O'; break;}
//конец первого шага
   }
//зашита, противнику один ход до конца
    for(int i=0; i<3; i++)
    {
        if (cells[i*3]==cells[i*3+1] && cells[i*3+1]=='X' && cells[i*3+2]=='-')
            {cells[i*3+2]='O';break;}
        if (cells[i*3+1]==cells[i*3+2] && cells[i*3+2]=='X' && cells[i*3]=='-')
            {cells[i*3]='O';break;}
        if (cells[i*3]==cells[i*3+2] && cells[i*3+2]=='X' && cells[i*3+1]=='-')
            {cells[i*3+1]='O';break;}
        if (cells[i+3]==cells[i+6] && cells[i+6]=='X' && cells[i]=='-')
            {cells[i]='O';break;}
        if (cells[i]==cells[i+3] && cells[i+3]=='X' && cells[i+6]=='-')
            {cells[i+6]='O';break;}
        if (cells[i]==cells[i+6] && cells[i+6]=='X' && cells[i+3]=='-')
            {cells[i+3]=='O';break;}
    }
        if (cells[4]==cells[8] && cells[8]=='X' && cells[0]=='-')
            cells[0]='O';
        if (cells[0]==cells[4] && cells[4]=='X' && cells[8]=='-')
            cells[8]='O';
        if (cells[0]==cells[8] && cells[8]=='X' && cells[4]=='-')
            cells[4]='O';
        if (cells[6]==cells[4] && cells[4]=='X' && cells[2]=='-')
            cells[2]='O';
        if (cells[4]==cells[2] && cells[2]=='X' &&  cells[6]=='-')
            cells[6]='O';
        if (cells[2]==cells[6] && cells[6]=='X' && cells[4]=='-')
            cells[4]='O';
//конец второго щага
 
//третий щаг, выставление рандомно
    if (cells[4]=='-')
        cells[4]='O';
    if (cells[0]=='-')
        cells[0]='O';
    if (cells[1]=='-')
        cells[1]='O';
    if (cells[2]=='-')
        cells[2]='O';
    if (cells[5]=='-')
        cells[5]='O';
    if (cells[8]=='-')
        cells[8]='O';
    if (cells[7]=='-')
        cells[7]='O';
    if (cells[6]=='-')
        cells[6]='O';
    if (cells[3]=='-')
        cells[3]='O';
//конец третьего шага
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.07.2015, 17:32     Как выйти из оператора if
Посмотрите здесь:

C++ do while - как выйти из цикла?
Не пойму как из цикла выйти C++
C++ Как выйти из программы
C++ как выйти из циклов
C++ как выйти из программы
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Zazy
 Аватар для Zazy
37 / 37 / 11
Регистрация: 14.04.2013
Сообщений: 167
21.07.2015, 17:44     Как выйти из оператора if #2
C++
1
2
3
if(cells[i*3]==cells[i*3+1] && cells[i*3+1]=='O' && cells[i*3+2]=='-')
else if(cells[i*3+1]==cells[i*3+2] && cells[i*3+2]=='O' && cells[i*3]=='-')
else if()
и так далее...
D_Gon
 Аватар для D_Gon
22 / 11 / 5
Регистрация: 09.07.2015
Сообщений: 47
21.07.2015, 17:45     Как выйти из оператора if #3
C++
1
2
3
4
 if (cells[i*3]==cells[i*3+1] && cells[i*3+1]=='O' && cells[i*3+2]=='-')
            cells[i*3+2]='O';
        else if (cells[i*3+1]==cells[i*3+2] && cells[i*3+2]=='O' && cells[i*3]=='-')
            cells[i*3]='O';
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
21.07.2015, 18:00     Как выйти из оператора if #4
1) Храните двухмерный массив
2) Используйте цикл
3) храните в массиве числа -1, 0, 1. Отсюда победа это если сумма ряда или -3 или 3, где кто выигрывает думаю понятно, так же про диагональ и про вертикаль.
4) Используйте цикл
5) Используйте константную char переменную для хранения символа вывода на экран "фишки игрока"
6) используйте уже наконечно циклы!
David_Ok
 Аватар для David_Ok
5 / 5 / 1
Регистрация: 12.01.2015
Сообщений: 87
21.07.2015, 18:19  [ТС]     Как выйти из оператора if #5
Ребят сейчас сделал как говорите и все равно же не помогает, потому что есть цикл if, что тогда сейчас ?

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
//первый щаг, заканчивание игры с одного хода
    for(int i=0; i<3; i++)
    {
        if (cells[i*3]==cells[i*3+1] && cells[i*3+1]=='O' && cells[i*3+2]=='-')
            {cells[i*3+2]='O'; break;}
       else if (cells[i*3+1]==cells[i*3+2] && cells[i*3+2]=='O' && cells[i*3]=='-')
            {cells[i*3]='O'; break;}
       else if (cells[i*3]==cells[i*3+2] && cells[i*3+2]=='O' && cells[i*3+1]=='-')
            {cells[i*3+1]='O'; break;}
       else if (cells[i+3]==cells[i+6] && cells[i+6]=='O' && cells[i]=='-')
            {cells[i]='O'; break;}
       else if (cells[i]==cells[i+3] && cells[i+3]=='O' && cells[i+6]=='-')
            {cells[i+6]='O'; break;}
       else if (cells[i]==cells[i+6] && cells[i+6]=='O' && cells[i+3]=='-')
            {cells[i+3]=='O'; break;}
       else if (cells[4]==cells[8] && cells[8]=='O' && cells[0]=='-')
            {cells[0]='O'; break;}
       else if (cells[0]==cells[4] && cells[4]=='O' && cells[8]=='-')
            {cells[8]='O'; break;}
       else if (cells[0]==cells[8] && cells[8]=='O' && cells[4]=='-')
            {cells[4]='O'; break;}
       else if (cells[6]==cells[4] && cells[4]=='O' && cells[2]=='-')
            {cells[2]='O'; break;}
       else if (cells[4]==cells[2] && cells[2]=='O' &&  cells[6]=='-')
            {cells[6]='O'; break;}
       else if (cells[2]==cells[6] && cells[6]=='O' && cells[4]=='-')
            {cells[4]='O'; break;}
//конец первого шага
 
//зашита, противнику один ход до конца
       else if (cells[i*3]==cells[i*3+1] && cells[i*3+1]=='X' && cells[i*3+2]=='-')
            {cells[i*3+2]='O';break;}
       else if (cells[i*3+1]==cells[i*3+2] && cells[i*3+2]=='X' && cells[i*3]=='-')
            {cells[i*3]='O';break;}
       else if (cells[i*3]==cells[i*3+2] && cells[i*3+2]=='X' && cells[i*3+1]=='-')
            {cells[i*3+1]='O';break;}
       else if (cells[i+3]==cells[i+6] && cells[i+6]=='X' && cells[i]=='-')
            {cells[i]='O';break;}
       else if (cells[i]==cells[i+3] && cells[i+3]=='X' && cells[i+6]=='-')
            {cells[i+6]='O';break;}
       else if (cells[i]==cells[i+6] && cells[i+6]=='X' && cells[i+3]=='-')
            {cells[i+3]=='O';break;}
       else if (cells[4]==cells[8] && cells[8]=='X' && cells[0]=='-')
            {cells[0]='O';break;}
       else if (cells[0]==cells[4] && cells[4]=='X' && cells[8]=='-')
            {cells[8]='O';break;}
       else if (cells[0]==cells[8] && cells[8]=='X' && cells[4]=='-')
            {cells[4]='O';break;}
       else if (cells[6]==cells[4] && cells[4]=='X' && cells[2]=='-')
            {cells[2]='O';break;}
       else if (cells[4]==cells[2] && cells[2]=='X' &&  cells[6]=='-')
            {cells[6]='O';break;}
       else if (cells[2]==cells[6] && cells[6]=='X' && cells[4]=='-')
            {cells[4]='O';break;}
    }
//конец второго щага
 
//третий щаг, выставление рандомно
    if (cells[4]=='-')
        cells[4]='O';
   else if (cells[0]=='-')
        cells[0]='O';
   else if (cells[1]=='-')
        cells[1]='O';
   else if (cells[2]=='-')
        cells[2]='O';
   else if (cells[5]=='-')
        cells[5]='O';
   else if (cells[8]=='-')
        cells[8]='O';
   else if (cells[7]=='-')
        cells[7]='O';
   else if (cells[6]=='-')
        cells[6]='O';
   else if (cells[3]=='-')
        cells[3]='O';
//конец третьего шага
       }
Последний if всегда будет исполняться

Добавлено через 16 минут
Ребят, кто-то может помочь ?
D_Gon
 Аватар для D_Gon
22 / 11 / 5
Регистрация: 09.07.2015
Сообщений: 47
21.07.2015, 18:21     Как выйти из оператора if #6
нет не всегда
David_Ok
 Аватар для David_Ok
5 / 5 / 1
Регистрация: 12.01.2015
Сообщений: 87
21.07.2015, 18:24  [ТС]     Как выйти из оператора if #7
Цитата Сообщение от D_Gon Посмотреть сообщение
нет не всегда
Ну даже если не всегда это же не играет роли.... Должно же исполняться только раз и все... Пробую разные штуки и пока что глухо
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
21.07.2015, 18:43     Как выйти из оператора if #8
Цитата Сообщение от David_Ok Посмотреть сообщение
Пробую разные штуки и пока что глухо
попробуйте цикл ...................................
Excalibur921
427 / 236 / 37
Регистрация: 12.10.2013
Сообщений: 1,802
21.07.2015, 20:10     Как выйти из оператора if #9
Как много If.Гляньте еще Switch Case.
Avazart
21.07.2015, 20:17
  #10

Не по теме:

C++
1
2
3
4
5
6
7
     if (cells[i*3]==cells[i*3+1] && cells[i*3+1]=='O' && cells[i*3+2]=='-')
            {cells[i*3+2]='O'; break;}
        if (cells[i*3+1]==cells[i*3+2] && cells[i*3+2]=='O' && cells[i*3]=='-')
            {cells[i*3]='O'; break;}
        if (cells[i*3]==cells[i*3+2] && cells[i*3+2]=='O' && cells[i*3+1]=='-')
            {cells[i*3+1]='O'; break;}
        if (cells[i+3]==cells[i+6] && cells[i+6]=='O' && cells[i]=='-')
cut
Используйте функции, классы, перечисления, switch/case ... да и вообще язык С++ наконец ....
cut

Excalibur921
427 / 236 / 37
Регистрация: 12.10.2013
Сообщений: 1,802
21.07.2015, 20:22     Как выйти из оператора if #11
Цитата Сообщение от David_Ok Посмотреть сообщение
Пробую разные штуки и пока что глухо
Как много у вас условий сразу. Никогда не начинайте сразу чистовой сложный код. Нужно писать постепенно усложняя программу с записью версий где нить например в MS Word и номер версии кода. Используйте вывод отладочной инфы чтобы проверять как на самом деле работают ваши условия.
Или например выводить вам типа:
Найдено возможных ходов 4.
Возможная победа на ходов:2
Просчитано ходов вперед:2.
Также можно например рисовать букву или символ или цветную точку на экране где комп предполагает ход игрока. Также есть куча примеров в инете на С++ вы погуглили вопрос?
Хорошие программисты стараются максимально изучить вопрос а затем пробовать самому. Или вам интересно вообще самому с нуля сделать?
Krasiosoft
 Аватар для Krasiosoft
51 / 51 / 15
Регистрация: 01.06.2015
Сообщений: 189
21.07.2015, 21:03     Как выйти из оператора if #12
Цитата Сообщение от David_Ok Посмотреть сообщение
Должно же исполняться только раз и все
Если запутались в if'ах, сделайте это в виде функции и делайте return в нужном Вам месте выхода.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
21.07.2015, 21:28     Как выйти из оператора if #13
Цитата Сообщение от Krasiosoft Посмотреть сообщение
Если запутались в if'ах, сделайте это в виде функции и делайте return в нужном Вам месте выхода.
А как вам моя рекомендация, что множественный return плох в плане отлова ошибки, чтения вашего кода и оптимизации компилятором ?
David_Ok
 Аватар для David_Ok
5 / 5 / 1
Регистрация: 12.01.2015
Сообщений: 87
21.07.2015, 23:02  [ТС]     Как выйти из оператора if #14
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
попробуйте цикл ...................................
какой и как, подскажите по-конкретнее
Krasiosoft
 Аватар для Krasiosoft
51 / 51 / 15
Регистрация: 01.06.2015
Сообщений: 189
21.07.2015, 23:12     Как выйти из оператора if #15
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
множественный return плох
Т.е. правильнее писать так:
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
bool func1(int a){
 
    if(a==1){
        a++;
        if(a==2){
            a++;
            if(a==3){
                a++;
                if(a==4){
                    a++;
                    if(a==5){
                        a++;
                        if(a==6){
                            a++;
                            if(a==7){
                                a++;
                                if(a==8){
                                    a++;
                                    if(a==9){
                                        a++;
                                        if(a==10){
                                            return true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
 
    return false;
}
Чем так:
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
bool func2(int a){
 
    if(a!=1) return false;
    a++;
    if(a!=2) return false;
    a++;
    if(a!=3) return false;
    a++;
    if(a!=4) return false;
    a++;
    if(a!=5) return false;
    a++;
    if(a!=6) return false;
    a++;
    if(a!=7) return false;
    a++;
    if(a!=8) return false;
    a++;
    if(a!=9) return false;
    a++;
    if(a!=10) return false;
 
    return true;
}
Не знаю за какими алгоритмами работает оптимизация компилятора, но как по мне, то читать проще второй вариант. А как большое количество return'ов будет усложнять поиск ошибок?
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
21.07.2015, 23:31     Как выйти из оператора if #16
Что это было?))))
Это даже кодом тяжело назвать)

Добавлено через 1 минуту
C++
1
2
3
4
5
// 2 вариант
bool func2(int a)
{
    return a != 1; 
}
Добавлено через 1 минуту
C++
1
2
3
4
5
// 1 вариант
bool func1(int a)
{
     return a == 1;
}
Добавлено через 1 минуту
Цитата Сообщение от David_Ok Посмотреть сообщение
какой и как, подскажите по-конкретнее
Сделайте все пункты, что здесь написаны / покажите сюда код, а с пунктами 2, 4, 6 - я вам помогу сам на месте же ж!
Krasiosoft
 Аватар для Krasiosoft
51 / 51 / 15
Регистрация: 01.06.2015
Сообщений: 189
22.07.2015, 01:38     Как выйти из оператора if #17
rikimaru2013, очень странно, что Вы не поняли, что это был просто пример, чтоб показать 2 варианта записи.

Да, я его сделал очень простым, но если вместо a++ будут другие преобразования, а вместо таких простых условий, будут более сложные, тогда как правильнее записывать? И самое главное, почему?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
22.07.2015, 07:05     Как выйти из оператора if #18
Цитата Сообщение от Krasiosoft Посмотреть сообщение
Т.е. правильнее писать так:
Лично я считаю что да, так правильнее.
Цитата Сообщение от Krasiosoft Посмотреть сообщение
но как по мне, то читать проще второй вариант. А как большое количество return'ов будет усложнять поиск ошибок?
До поры до времени. Пример слишком прост. Функции могут быть намного больше и запутаннее. Когда знаешь, что выход из функции только один, становится намного проще её изучать.

Добавлено через 12 минут
Дополню ответ.
Встречал и подобную конструкцию:
C++
1
2
3
4
5
6
7
8
9
int foo() {
    int result = 0;
 
    ...
    много кода, который может изменять переменную result в зависимости от появления ошибок и т.п.
    ...
 
    return result;
}
Такой подход мне тоже сильно импонирует.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2139 / 972 / 223
Регистрация: 30.11.2013
Сообщений: 3,241
22.07.2015, 10:35     Как выйти из оператора if #19
Цитата Сообщение от castaway Посмотреть сообщение
Лично я считаю что да, так правильнее.
В том варианте 2 return, что уже неправильно. Как так, castaway, ? У вас есть доводы, что опревергают моё
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
А как вам моя рекомендация, что множественный return плох в плане отлова ошибки, чтения вашего кода и оптимизации компилятором ?
Моя рекомендация один и только один. Бывает и сам пишу 2 return, но противно в душе до ужаса, но в тех случаях более читабельно через два. А так только 1.

Цитата Сообщение от castaway Посмотреть сообщение
Такой подход мне тоже сильно импонирует.
Он и является для меня главным <3
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.07.2015, 10:54     Как выйти из оператора if
Еще ссылки по теме:

C++ Одномерный массив, как выйти?
C++ Как выйти из функции
Как выйти из условия if? C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
22.07.2015, 10:54     Как выйти из оператора if #20
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
В том варианте 2 return, что уже неправильно. Как так, castaway, ? У вас есть доводы, что опревергают моё
"Я извиняюсь за свой английский", немного неправильно выразился. Слово "правильнее" было неправильным с моей стороны, просто отталкивался от вопроса ТС, содержащего его. Мне следовало бы заменить выражение "так правильнее" на "по-хорошему так, я считаю".
Моё мнение - 1 return для "сложных" функций, максимум - два оператора для простых, где оба видны с первого взгляда.
Yandex
Объявления
22.07.2015, 10:54     Как выйти из оператора if
Ответ Создать тему
Опции темы

Текущее время: 00:23. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru