1 / 1 / 1
Регистрация: 12.08.2014
Сообщений: 65
1

Постоянно возвращается 0 из функции

25.09.2015, 12:45. Показов 1390. Ответов 21
Метки нет (Все метки)

Из функции-члена worldAnalizer() - возвращается 0, в функции-члены - robotSet() и playerSet();
В конце функции-члена worldAnalizer() - Должно возвращаться значение 1 если ни 1-но условие не выполнено, но оно возвращает 0 и из-за этого игра стоит после первого хода.

Игра крестики-нолики.

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
#include <iostream>
#include <cstdlib>
 
class nWorld{
public:
    char czWorld[9] = {'-','-','-','-','-','-','-','-','-'};
    //Functions
    void dispWorld();
    int playerSet();
    int robotSet();
    int gameStart();
    int arrayCloser();
    int worldAnalizer(char analizer);
};
 
nWorld world;
 
int nWorld::worldAnalizer(char analizer){
    //Horizontal Scan
    if (czWorld[0] == analizer && czWorld[1] == analizer && czWorld[2] == analizer){
        if (analizer == 'X'){
            std::cout << "\tPlayer Win!\n";
            return 0;
        } else {
            std::cout << "\tComputer Win!\n";
            return 0;
        }
    }
    if (czWorld[3] == analizer && czWorld[4] == analizer && czWorld[5] == analizer){
        if (analizer == 'X'){
            std::cout << "\tPlayer Win!\n";
            return 0;
        } else {
            std::cout << "\tComputer Win!\n";
            return 0;
        }
    }
    if (czWorld[6] == analizer && czWorld[7] == analizer && czWorld[8] == analizer){
        if (analizer == 'X'){
            std::cout << "\tPlayer Win!\n";
            return 0;
        } else {
            std::cout << "\tComputer Win!\n";
            return 0;
        }
    }
    //Vertical Scan
    if (czWorld[0] == analizer && czWorld[3] == analizer && czWorld[6] == analizer){
        if (analizer == 'X'){
            std::cout << "\tPlayer Win!\n";
            return 0;
        } else {
            std::cout << "\tComputer Win!\n";
            return 0;
        }
    }
    if (czWorld[1] == analizer && czWorld[4] == analizer && czWorld[7] == analizer){
        if (analizer == 'X'){
            std::cout << "\tPlayer Win!\n";
            return 0;
        } else {
            std::cout << "\tComputer Win!\n";
            return 0;
        }
    }
    if (czWorld[2] == analizer && czWorld[5] == analizer && czWorld[8] == analizer){
        if (analizer == 'X'){
            std::cout << "\tPlayer Win!";
            return 0;
        } else {
            std::cout << "\tComputer Win!";
            return 0;
        }
    }
    //Diagonal
    if (czWorld[0] == analizer && czWorld[4] == analizer && czWorld[8] == analizer){
        if (analizer == 'X'){
            std::cout << "\tPlayer Win!\n";
            return 0;
        } else {
            std::cout << "\tComputer Win!\n";
            return 0;
        }
    }
    if (czWorld[2] == analizer && czWorld[4] == analizer && czWorld[6] == analizer){
        if (analizer == 'X'){
            std::cout << "\tPlayer Win!\n";
            return 0;
        } else {
            std::cout << "\tComputer Win!\n";
            return 0;
        }
    }
    return 1;
}
 
int reBoot(int nVal){
    if (nVal == 1){
        world.robotSet();
    } else {
        world.playerSet();
    }
}
 
int nWorld::arrayCloser(){
    int nCopuWorld = 0;
    for (int index = 0; index < 9; index++){
        if (czWorld[index] == '-'){
            nCopuWorld++;
        }
    }
 
    if (nCopuWorld == 0){
        std::cout << "Нет пустых ячеек!";
        return 1;
    }
    return 0;
}
 
int nWorld::robotSet(){
 
        if (arrayCloser() == 1){
            std::cout << "Game Over!";
            return 0;
        } else {
            int tempVal = rand()%10;
            if (czWorld[tempVal] == '-'){
                czWorld[tempVal] = 'O';
            } else {
                reBoot(1);
            }
        }
        if (worldAnalizer('O') == 0){
            return 0;
        }
}
 
int nWorld::playerSet(){
    //Player - X
        if (arrayCloser() == 1){
            std::cout << "Game Over!";
            return 0;
        } else {
            int tempVal;
            std::cout << "Введите значение: ";
            std::cin >> tempVal;
            while (tempVal > 9 || tempVal < 0){
                std::cout << "Не верное значение, введите верное значение: (0-9): ";
                std::cin >> tempVal;
            }
            if (czWorld[tempVal] == '-'){
                czWorld[tempVal] = 'X';
            } else {
                std::cout << "Эта ячейка занята! Введите другое значение: ";
                reBoot(2);
                }
            if (czWorld[tempVal] == '-'){
                czWorld[tempVal] = 'X';
            }
            }
            if (worldAnalizer('X') == 0){
                return 0;
            }
}
 
void nWorld::dispWorld(){
        std::cout << "\t|-" << czWorld[0] <<"-|-" << czWorld[1] <<  "-|-" << czWorld[2] <<  "-|\n"
                  << "\t|-" << czWorld[3] <<"-|-" << czWorld[4] <<  "-|-" << czWorld[5] <<  "-|\n"
                  << "\t|-" << czWorld[6] <<"-|-" << czWorld[7] <<  "-|-" << czWorld[8] <<  "-|\n" << std::endl;
}
 
int nWorld::gameStart(){
    static int tempStat = 1;
    if (tempStat == 1){
        if (world.playerSet() == 0){
            return 0;
        }
        tempStat++;
    } else {
        if (world.robotSet() == 0){
            return 0;
        }
        tempStat--;
    }
}
 
int main(){
    setlocale(LC_ALL, "Russian");
    std::cout << "0 1 2\n3 4 5\n6 7 8\n";
    for (;;){
        world.dispWorld();
        if (world.gameStart() == 0){
            break;
        }
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.09.2015, 12:45
Ответы с готовыми решениями:

Из функции возвращается не то значение
Вот функция, программа возвращает -1, если все элементы равны. Этот кусок работает(если все...

Не возвращается результат функции, что делать?
#include &lt;iostream&gt; #define N 10 using namespace std; int *SortedArray(int a) { int m;...

Разработать шаблон функции, в которую передается массив и размер и возвращается индекс минимального элемента
Разработать шаблон функции, в которую передается массив и размер и возвращается индекс минимального...

Разработайте шаблон функции, в которую передается массив и возвращается произведение положительных элементов массива
Разработайте шаблон функции, в которую передается массив и возвращается произведение положительных...

21
7167 / 6142 / 2802
Регистрация: 14.04.2014
Сообщений: 26,462
25.09.2015, 14:20 2
Отладчиком посмотри.
0
Эксперт CЭксперт С++
5087 / 2272 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
25.09.2015, 16:35 3
Harterbreed, это жесть...
0
233 / 99 / 27
Регистрация: 20.03.2014
Сообщений: 304
25.09.2015, 18:13 4
Лучший ответ Сообщение было отмечено Harterbreed как решение

Решение

1) Ужасный стиль кода. Без обид. Привыкайте сразу писать код максимально ясно и придерживаясь правил хорошего тона. Например, не увлекайтесь фигурными скобками, они нужны если внутри выполняется более одного действия. Если функция возвращает только 1 или 0 (успех/неуспех) она должна быть не int, а bool (да да, есть такой тип).
Избегайте безымянных числовых констант в коде! Напр.
C++
1
2
3
4
ugol = 3.14 / 2; //Плохо
 
#define PI 3.14
ugol = PI / 2; //Уже лучше
Выносите классы в отдельные модули h и cpp.
2) Если объявляете, что функция умеет возвращать значения, то она должна его возвращать полюбому! (см. robotSet())
3) Почитайте про инкапсуляцию в объектно-ориентированном программировании.

Я немного отрефакторил ваш код. Теперь ошибка тоже ушла.
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <cstdlib>
 
#include "nworld.h"
 
int main()
{
    setlocale(LC_ALL, "Russian");
    std::cout << "0 1 2\n3 4 5\n6 7 8\n"; //TODO: добавить адекватный хелп по использованию программы!
 
    nWorld world;
    for (;;)
    {
        world.dispWorld();
        if (!world.gameStart())
            break;
    }
}
nworld.h
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
#ifndef NWORLD_H
#define NWORLD_H
 
#include <iostream>
#include <cstdlib>
 
#define WORLD_SIZE 9
 
typedef enum enSide
{
    sdRobot,
    sdPlayer
} tSide;
 
class nWorld
{
private:
    char czWorld[WORLD_SIZE];
 
    tSide WhoseTurn;
 
    bool playerSet(void);
    bool robotSet(void);
    bool arrayCloser(void);
    bool checkLine(const char& analizer,
                   const char& field1,
                   const char& field2,
                   const char& field3) const;
    bool worldAnalizer(const char analizer) const;
 
    void reBoot(tSide);
 
public:
    nWorld();
    //Functions
    void dispWorld();
    bool gameStart(void);
};
 
#endif // NWORLD_H
nworld.cpp
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
#include "nworld.h"
 
nWorld::nWorld() :
    WhoseTurn(sdPlayer)
{
    memset(czWorld, '-', WORLD_SIZE);
}
 
bool nWorld::checkLine(const char& analizer,
                       const char& field1,
                       const char& field2,
                       const char& field3) const
{
    if (field1 == analizer &&
        field2 == analizer &&
        field3 == analizer)
    {
        if (analizer == 'X')
        {
            std::cout << "\tPlayer Win!\n";
            return false;
        }
        else
        {
            std::cout << "\tComputer Win!\n";
            return false;
        }
    }
    return true;
}
 
bool nWorld::worldAnalizer(const char analizer) const
{
    bool GameCanContinue = checkLine(analizer, czWorld[0], czWorld[1], czWorld[2]);
    if (GameCanContinue)
    {
        GameCanContinue = checkLine(analizer, czWorld[3], czWorld[4], czWorld[5]);
        if (GameCanContinue)
        {
            GameCanContinue = checkLine(analizer, czWorld[6], czWorld[7], czWorld[8]);
            if (GameCanContinue)
            {
                GameCanContinue = checkLine(analizer, czWorld[0], czWorld[3], czWorld[6]);
                if (GameCanContinue)
                {
                    GameCanContinue = checkLine(analizer, czWorld[1], czWorld[4], czWorld[7]);
                    if (GameCanContinue)
                    {
                        GameCanContinue = checkLine(analizer, czWorld[2], czWorld[5], czWorld[8]);
                        if (GameCanContinue)
                        {
                            GameCanContinue = checkLine(analizer, czWorld[0], czWorld[4], czWorld[8]);
                            if (GameCanContinue)
                            {
                                GameCanContinue = checkLine(analizer, czWorld[2], czWorld[4], czWorld[6]);
                                if (GameCanContinue)
                                {
 
                                }
                            }
                        }
                    }
                }
            }
        }
    }
 
    return GameCanContinue;
}
 
void nWorld::reBoot(tSide side)
{
    if (side == sdRobot)
        robotSet();
    else
        playerSet();
}
 
bool nWorld::arrayCloser(void)
{
    int nCopuWorld = 0;
    for (int index = 0; index < WORLD_SIZE; ++index) //++index выполняется быстрее index++, мелочь а приятно
    {
        if (czWorld[index] == '-')
            ++nCopuWorld;
    }
 
    if (nCopuWorld == 0)
    {
        std::cout << "Нет пустых ячеек!";
        return true;
    }
    return false;
}
 
bool nWorld::robotSet(void)
{
    if (arrayCloser())
    {
        std::cout << "Game Over!";
        return false;
    }
    else
    {
        int tempVal = rand()%10;
        if (czWorld[tempVal] == '-')
            czWorld[tempVal] = 'O';
        else
            reBoot(sdRobot);
    }
    return worldAnalizer('O');
}
 
bool nWorld::playerSet(void)
{
    //Player - X
    if (arrayCloser())
    {
        std::cout << "Game Over!"; //Не стоит мешать английский с русским в одной программе
        return false;
    }
    else
    {
        int tempVal;
        std::cout << "Введите значение: ";
        std::cin >> tempVal;
        while (tempVal > WORLD_SIZE || tempVal < 0)
        {
            std::cout << "Не верное значение, введите верное значение: (0-9): ";
            std::cin >> tempVal;
        }
 
        if (czWorld[tempVal] == '-')
            czWorld[tempVal] = 'X';
        else
        {
            std::cout << "Эта ячейка занята! Введите другое значение: ";
            reBoot(sdPlayer);
        }
 
        if (czWorld[tempVal] == '-')
            czWorld[tempVal] = 'X';
    }
    return worldAnalizer('X');
}
 
void nWorld::dispWorld()
{
    std::cout << "\t|-" << czWorld[0] <<"-|-" << czWorld[1] <<  "-|-" << czWorld[2] <<  "-|\n"
              << "\t|-" << czWorld[3] <<"-|-" << czWorld[4] <<  "-|-" << czWorld[5] <<  "-|\n"
              << "\t|-" << czWorld[6] <<"-|-" << czWorld[7] <<  "-|-" << czWorld[8] <<  "-|\n" << std::endl;
}
 
bool nWorld::gameStart(void)
{
    if (WhoseTurn == sdPlayer)
    {
        if (!playerSet())
            return false;
        WhoseTurn = sdRobot;
    }
    else
    {
        if (!robotSet())
            return false;
        WhoseTurn = sdPlayer;
    }
    return true; //Этого return у вас не было! А он нужен
}
P.S. осталось только добавить расчет правильности следующего хода для компьютера и выбор первого ходящего и будет норм
1
Don't worry, be happy
17769 / 10534 / 2034
Регистрация: 27.09.2012
Сообщений: 26,505
Записей в блоге: 1
25.09.2015, 18:15 5
UltraPenguin,
Цитата Сообщение от UltraPenguin Посмотреть сообщение
C++
1
#define PI 3.14
плохо.
C++
1
const double PI = 3.14159 /*...*/ ; //уже лучше. Еще бы constexpr хотя бы
0
233 / 99 / 27
Регистрация: 20.03.2014
Сообщений: 304
25.09.2015, 18:21 6
Croessmah, согласен, пример не корректен, просто хотел проиллюстрировать мысль
0
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
25.09.2015, 19:02 7
Цитата Сообщение от UltraPenguin Посмотреть сообщение
ugol
Даже это плохо.
C++
1
2
const double PI = 3.14159;
angle = PI / 2;
Транслит это фу-фу-фу.
0
233 / 99 / 27
Регистрация: 20.03.2014
Сообщений: 304
25.09.2015, 19:13 8
Тамика, да да да я уже понял что поторопился с этим примером
0
Тамика
25.09.2015, 19:14
  #9

Не по теме:

UltraPenguin, аккуратненько тут :D

0
Croessmah
25.09.2015, 19:31
  #10

Не по теме:

аккуратненько тут
А что, кошачьи ошибок не прощают?8-):D

0
UltraPenguin
25.09.2015, 19:39
  #11

Не по теме:

Написал транслитом имя переменной. Труп нашли только весной...

0
Croessmah
25.09.2015, 19:43
  #12

Не по теме:

UltraPenguin, нашли? Странно...

0
UltraPenguin
25.09.2015, 19:48
  #13

Не по теме:

Croessmah, наши органы самые лучшие органы в мире! Я не про печень с сердцем и прочим если что;)

0
2548 / 1207 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
25.09.2015, 19:50 14
Цитата Сообщение от UltraPenguin Посмотреть сообщение
фигурными скобками, они нужны если внутри выполняется более одного действия
Можно ссылку на вашу биографию. Не уверен, что ваша "рекомендация" имеет вес.
0
233 / 99 / 27
Регистрация: 20.03.2014
Сообщений: 304
25.09.2015, 19:55 15
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
int main(){[](){}();}
да, вижу вы их любите, скобки

А собственно какие контраргументы? Или чтобы рекомендация имела вес важна лишь биография? Со временем человек сам поймет, где то или иное форматирование повышает читаемость кода, а пока не нужно злоупотреблять.
0
1 / 1 / 1
Регистрация: 12.08.2014
Сообщений: 65
25.09.2015, 20:00  [ТС] 16
Есть ресурс где можно почитать про "правила хорошего тона" ? P.S я только начинаю программировать как видите)
0
233 / 99 / 27
Регистрация: 20.03.2014
Сообщений: 304
25.09.2015, 20:02 17
Harterbreed, например вот
Некоторые тезисы спорны, но для начала хватит, комментарии к статье тоже интересны.
1
2548 / 1207 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
25.09.2015, 20:29 18
Цитата Сообщение от UltraPenguin Посмотреть сообщение
А собственно какие контраргументы
считаю реверс правило - если после условия идёт одно действие не используйте скобки. Если давать такие советы, то теряется смысл здравомыслия.

Думаю если и давать совет, то от проблемы: если не использовать фигурные скобки, то возможны такие баги и снижение читабельности в некоторых случаях. Если одно и другое не грозит можно написать без фигурных скобок.
0
233 / 99 / 27
Регистрация: 20.03.2014
Сообщений: 304
25.09.2015, 20:56 19
rikimaru2013, что-то я в конце рабочего дня медленно соображаю. Не могли бы вы проиллюстрировать вашу мысль примерами?
0
Эксперт CЭксперт С++
5087 / 2272 / 332
Регистрация: 20.02.2013
Сообщений: 5,598
Записей в блоге: 19
26.09.2015, 18:07 20
Цитата Сообщение от Harterbreed Посмотреть сообщение
ресурс где можно почитать про "правила хорошего тона"
Вот, из новенького.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2015, 18:07
Помогаю со студенческими работами здесь

Передача данных DataContract - постоянно возвращается ноль
Добрый день, изучаю WCF, хотел попробовать передать пользовательские типы данных public...

Если возвращается переменная ссылочного типа, то возвращается объект или просто ссылка
Почему-то авторы всегда акцентируют внимание на передачу параметров в функцию, а на возврат не...

Не возвращается значение из функции
вот такая функция: function auth() {...

Не возвращается значение указателя из функции.
Подробное описание задания: В программе описать 3 функции. Функция f1 осуществляет ввод ...


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

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

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