Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
EnjiRouz
0 / 0 / 0
Регистрация: 06.11.2016
Сообщений: 9
#1

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

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

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

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

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

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

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

Ошибка LNK2019 в многофайловом проекте - C++
Смысл: Мне нужно создать абстрактный класс контейнер, на его основе конкретные классы, далее создать абстрактный класс итератор и для...

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

7
obivan
Падаван С++
404 / 224 / 58
Регистрация: 11.11.2014
Сообщений: 796
Завершенные тесты: 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
Падаван С++
404 / 224 / 58
Регистрация: 11.11.2014
Сообщений: 796
Завершенные тесты: 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
Падаван С++
404 / 224 / 58
Регистрация: 11.11.2014
Сообщений: 796
Завершенные тесты: 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
Падаван С++
404 / 224 / 58
Регистрация: 11.11.2014
Сообщений: 796
Завершенные тесты: 2
21.01.2017, 16:07 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
Привет! Вот еще темы с ответами:

Вывод в файл *.txt в многофайловом проекте - C++
Нужно перенаправить cout в файл. Я выводил в информацию в файл просто с помощью добавления такого вот кусочка кода: #include &lt;fstream&gt; ...

Разделение класса со статической переменной в многофайловом проекте - C++
На ровном месте происходят какие-то непонятные чудеса, как будто бы я шаблонный класс объявляю - если реализация класса находится в...

Ошибка при работе с шаблонами в многофайловом проекте - C++
Цель проста - пишу класс очереди, используя шаблоны. Возниает следующая ошибка: ||=== Build: Debug in Queue (compiler: GNU GCC Compiler)...

Как написать программу, не используя глобальных переменных? - C++
Добрый день! Подскажите пожалуйста, как написать программу, не используя глобальных переменных? К примеру есть две функции: Input и...


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

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

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