Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
EnjiRouz
0 / 0 / 0
Регистрация: 06.11.2016
Сообщений: 9
1

Как избавиться от глобальных переменных в многофайловом проекте на С++?

21.01.2017, 13:16. Просмотров 1015. Ответов 7

Некоторые глобальные переменные можно заменить на глобальные константы. Долго промучилась с проектом, но на попытках избавления от глобальеных переменных отказывали те или иные функции. Проект представляет собой игру крестики-нолики против человека и компьютера.
Проект10.zip
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.01.2017, 13:16
Ответы с готовыми решениями:

Объявление глобальных переменных в проекте Dev C++
Доброй ночи всем! Подскажите, пожалуйста, как правильно объявить глобальные переменные в проекте....

Определение метода вне класса, как inline в многофайловом проекте
Здравствуйте! Помогите разобраться!) В общем имеется: ...

Перегрузка << в многофайловом проекте
Чтобы узнать, как перегружать потоки, зашел на msdn, нашел там это: #include &lt;iostream&gt; using...

Struct в многофайловом проекте
Если в main файле создать структуру, то как её использовать в функциях, которые в других cpp...

Ошибки в многофайловом проекте
Здравствуйте! У меня есть многофайловый проект. Он не закончен (только начатый), но запуск...

7
obivan
Падаван С++
435 / 251 / 86
Регистрация: 11.11.2014
Сообщений: 891
Завершенные тесты: 2
21.01.2017, 13:50 2
EnjiRouz, вообще совет попробуйте передавать те переменные, которые объявлены как глобальные переменные, аргументами функции, допустим поле через указатель и т.д. потому что у вас сейчас в коде очень сильная связность, если просто удалить переменную или поменять ее имя, то половину функций менять, аргументы чуть чуть, но уже избавят от этого

Добавлено через 4 минуты
EnjiRouz, потом к примеру функция бот, которая вызывает функцию bot_checking, тоже завязывает бота на выполнение одной стратегии, сделайте его более гибким, допустим не в тупую вызывайте bot_checking, а передавайте указатель на функцию которая принимает решение на выбор хода, потом про сам выбор, рандом это ну мягко говоря плохо, поэтому давайте гуглите что такое минимакс алгортим

Добавлено через 5 минут
также практика забивать выйгрышные варианты, представьте ситуацию, что у вас поле не 3х3 а 10х10, но побеждает тот кто сделает первые 3 по горизонтали, вертикали или диагонали, будет очень сложно описать все руками, поэтому тоже совет, сделайте это алгоритмом

Добавлено через 2 минуты
EnjiRouz, ну и мелкие ошибки в коде, например
C++
1
2
3
4
5
6
7
8
9
if (s == '+')
    {
        system("cls");
        return true;
    }
    else
    {
        return false;;
    }
в функции рестарт можно вот так записать
C++
1
2
3
4
5
6
    if (s == '+')
    {
        system("cls");
        return true;
    }
    return false;;
Добавлено через 1 минуту
тоже самое в функции no_winner, бесполезный ретерн в get_winner, не подумайте что придераюсь, просто это нагружает код и его тяжелее читать

Добавлено через 51 секунду
вообще во всех функция void не нужно в конце писать return
1
EnjiRouz
0 / 0 / 0
Регистрация: 06.11.2016
Сообщений: 9
21.01.2017, 13:52  [ТС] 3
Спасибо. Буду пробовать исправлять
0
obivan
Падаван С++
435 / 251 / 86
Регистрация: 11.11.2014
Сообщений: 891
Завершенные тесты: 2
21.01.2017, 13:55 4
EnjiRouz, скидывайте потом, еще посмотрим
0
EnjiRouz
0 / 0 / 0
Регистрация: 06.11.2016
Сообщений: 9
21.01.2017, 14:01  [ТС] 5
а можете подсказать, что я могу сделать с переменной choice?
0
obivan
Падаван С++
435 / 251 / 86
Регистрация: 11.11.2014
Сообщений: 891
Завершенные тесты: 2
21.01.2017, 14:07 6
EnjiRouz, ну насколько я понял, она влияет на выбор ячейки, смотрите как можно от нее избавится, допустим у нас будет функция выбора, например
C++
1
2
3
4
5
6
int choiseFunc(void) {
    int value;
    std::cout << "Choose a cell" << endl;
    std::cin >> value;
    return value;
}
вы возвращаем введенное значение из функции, потом у нас допустим будет функция обработки выбора и это будет примерно так выглядить в мейне
C++
1
2
3
4
5
6
7
do {
    drawControlButtons();
    drawBoard();
    int choise = choiseFunc();
    tryToMakeAMove(choise);
    bot();
} while (gameNoEnd());
код я написал абстрактно, таких функций нет, но суть в логике

Добавлено через 42 секунды
т.е вы избавляетесь от глобальной переменной, но передаете ее как аргумент
1
EnjiRouz
0 / 0 / 0
Регистрация: 06.11.2016
Сообщений: 9
21.01.2017, 15:20  [ТС] 7
Прошу прощения, что мучаю с вопросами. Когда пыталась автоматизировать заполнение этих функций - в результате получается пустое поле

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void map()
{
    cout << "\n\n\n"; cout << " Игровое поле: " << "\n\n";
    cout << " " << board[6] << "|" << board[7] << "|" << board[8] << endl;
    cout << " " << "-" << "+" << "-" << "+" << "-" << endl;
    cout << " " << board[3] << "|" << board[4] << "|" << board[5] << endl;
    cout << " " << "-" << "+" << "-" << "+" << "-" << endl;
    cout << " " << board[0] << "|" << board[1] << "|" << board[2] << endl;
    cout << "\n\n";
}
//_________________________________________________________________
void control_buttons()
{
    cout << " " << 7 << " | " << 8 << " | " << 9 << endl;
    cout << "---" << "+" << "---" << "+" << "---" << endl;
    cout << " " << 4 << " | " << 5 << " | " << 6 << endl;
    cout << "---" << "+" << "---" << "+" << "---" << endl;
    cout << " " << 1 << " | " << 2 << " | " << 3 << endl;
    cout << "\n\n";
}
В void control_buttons() пыталась использовать этот цикл. В чем я глуплю?

C++
1
2
3
4
for (int i = 0; i<9; i++)
    {
        board[i] = i+1;
    }
0
obivan
Падаван С++
435 / 251 / 86
Регистрация: 11.11.2014
Сообщений: 891
Завершенные тесты: 2
21.01.2017, 16:07 8
Лучший ответ Сообщение было отмечено EnjiRouz как решение

Решение

EnjiRouz, board же типа char а не инт поэтому нужно сделать вот так
C++
1
2
for(int i = 0; i < 9; ++i)
    board[i] = '1' + i;
1
21.01.2017, 16:07
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2017, 16:07

Вызов функции в многофайловом проекте
Компилятор ругается на указатель на массив &quot;a&quot; , в файле main.cpp Вот файлы проекта: ...

Иерархия классов в многофайловом проекте
Всем привет. Есть проблема с созданием программы. Должна быть небольшая иерархия классов, и все...

Ошибка линковки в многофайловом проекте
что за на??? в проекте 3 модуля: main.cpp, test.cpp, test.h, в main.cpp и test.cpp подключен...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru