Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 06.11.2016
Сообщений: 48

Как реализовать функции в структуре и вызвать в main()?

11.05.2018, 21:48. Показов 2146. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть код.
Кликните здесь для просмотра всего текста
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
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include "myplayer.h"
#include "board.h"
 
//номера рисунков. отступы перед главами. нумер 1.1,1.2 и т.д. код не весь, а структуры. литературу книги и ссылаться на них.
using namespace std;
char board[9] = {};              //Чтобы отобразить ход(ввод)пользователя на доске. Доска будит состоять из 9-и однобуквенных стрингов char
    int hod = 1;
void clearscreen();
 
 
 
    void clearboard()            //эта функция очищает доску и ни чего не возвращает
    {
        for (int i = 0; i<9; i++) //цикл который проходит по всем 9-и ячейкам на доске. board[i] поставит туда  пустышку = '-‘. Это возвращает доску в своё изначальное состояние.
        {
            board[i] = '-';
        }
    }
 
 
bool has_wonQ(char player)        //функция bool has_wonQ(char player) проверяет когда игра закончилась. возвращает bool
{
    int wins[][3] = { { 0,1,2 },{ 3,4,5 },{ 6,7,8 },{ 0,3,6 },{ 1,4,7 },//двухмерный массив wins[8][3](8 по 3) в котором перечисляются все выигрышные варианты
    { 2,5,8 },{ 0,4,8 },{ 2,4,6 }
    };
    //Этими циклами проверяется если у одного из игроков есть фишки на всех трёх местах из какой-нибудь из тройки. т.к. переменные отсчитываются с 0(ноля) тогда эквивалент клеток 1, 2, 3  в окне консоли в коде {0,1,2}.
    // цикл  for(int i = 0; i<8; i++)проверяет массив[8], а цикл  for(int j = 0; j<3; j++) проверяет массив [3]
    for (int i = 0; i<8; i++)
    {
        int count = 0;
        for (int j = 0; j<3; j++)
        {
            if (board[wins[i][j]] == player)//если(на boardдоске на квадратике который задан в массиве[wins]по элементу[i] и [j] будит ровняться  player (проверяемого X или О (char player))
                count++;//Если на этом месте  в массиве доска стоит X то увеличивается count на единицу ++.
        }
        if (count == 3) //если(счётчик  ровняется 3) т.е. к примеру проходится троечка {0,1,2} и все три ровняются крестику(Х) или нолику(О) то возвращается return
        {
            return true;
        }
    }
    return false;
}
 
void print_board(string indent) //функция void print_board(){ … } которая будит выводить  доску на экран
{
    cout << "Игровая доска\n";        //Выводится на экран заголовок
    cout << indent << "-" << board[6] << "-|-" << board[7] << "-|-" << board[8] << "- \n";
    cout << indent << "-" << board[3] << "-|-" << board[4] << "-|-" << board[5] << "- \n";
    cout << indent << "-" << board[0] << "-|-" << board[1] << "-|-" << board[2] << "- \n";//Заменяется переменная стринг (-) на переменную board[] с номером клетки, т.к.  переменные начинаются с нуля, то  вместо 1 пишется 0, вместо 2 пишется 1 и т.д.
}
 
 
int get_move(const gamer& igrok) // Создаётся функция “get_move()“(Получить ввод пользователя)
{
    cout << "\nНомера клеточек: \n";
    cout << "-7-|-8-|-9-" << endl;
    cout << "-4-|-5-|-6-" << endl;
    cout << "-1-|-2-|-3-" << endl;
    cout << "\n";
    print_board("");
    if (hod % 2 == 1)
    {
        cout << "\n" << igrok.name1 << ", в какую клеточку ставим? : ";
    }
    else
    {
        cout << "\n" << igrok.name2 << ", в какую клеточку ставим? : ";
    }
    hod++;
    int move;// Что бы получить вход пользователя создаётся переменная move
    cin >> move;//Просим что бы пользователь ввёл эту переменную (число)
    while (move > 9 || move < 1 || board[move - 1] != '-') //Цикл  while  проверяет вход  который дал пользователь больше 9  (move > 9) или отрицательное
    {
        cout << "Вы ввели неверный номер клеточки (введите от 1 до 9) или эта клеточка уже занята:\n";
        cin >> move;
    }
    return move;//Возвращаем значение move
}
 char play_and_get_winner(const gamer& igrok) //функция play_and_get_winner() она будит возвращать char(символ) т.е. сыграть в игру и получить выигравшего
{
    int turn = 1;//переменная turn(ход) изначально будeт первой ход и ровняться= 1
 
    while (!has_wonQ('X') && !has_wonQ('0')) //пока не выиграл пользовательhas_wonQ за Х и  не выиграл пользовательhas_wonQ за О
    {
        clearscreen();
        int move = get_move(igrok);//Вызывается функция get_move()и помещается то что она вернет в переменную
 
        clearscreen();
        if (turn % 2 == 1) //проверка на чётный ход,
        {
            board[move - 1] = 'X';//то тогда задаётся значение   ='X'
            if (has_wonQ('X')) //если пользователь играющий за 'X выиграл
            {
                cout << "Победил " << igrok.name1 << " (X)\n";
                return 'X'; // возвращает победу пользователя Х
            }
 
        }
        else     // Все остальные ходы будут нечётные,
        {
            board[move - 1] = '0';
            if (has_wonQ('0'))
            {
                cout << "Победил " << igrok.name2 << " (Y)\n";
                return '0';
            }
        }
        turn++;
        if (turn == 10) //если(turn=10), то ничья. T.е. ставить крестик или нолик некуда
        {
            cout << "Ничья\n";
            return 'D';
        }
    }
}
int main()
{
    setlocale(LC_CTYPE, "Russian");
    gamer igrok;
    cout << "Добро пожаловать в Крестики-нолики\n\n";
    cout << "Как называть игрока 1 (за Х): ";
    getline(cin, igrok.name1);
    cout << "Как называть игрока 2 (за O): ";
    getline(cin, igrok.name2);
    string reply = "y";//декларируется стринг ответа. изначально "y"(ДА)
    igrok.x_wins = 0;
    igrok.o_wins = 0;
        int ties = 0;//перечень переменных типаint  x_wins=0(это количество раз когда пользователь играющий иксами выиграл), o_wins=0(играющий О), ties=0(ничьи)
    while (reply == "y")
    {
        clearboard();
        char winner = play_and_get_winner(igrok);// char winner ровняется= play_and_get_winner()
        print_board("\t  ");
        switch (winner)
        {
        case 'X':
            igrok.x_wins++;
            break;
        case '0':
            igrok.o_wins++;
            break;
        case 'D':
            ties++;
            break;
        }
        cout << "\n\t*Статистика победителей*\nИгрок X (" << igrok.name1 << "): " << igrok.x_wins
            << ", Игрок O (" << igrok.name2 << "): " << igrok.o_wins << " и ничьих: " << ties << "\n\n";
        cout << "\n Желаете ли вы сыграть ещё? (y/n): ";
        cin >> reply;
        while (reply != "y" && reply != "n")
        {
            cout << "Вы ввели не правильный ответ. Введите 'y', если хотите сыграть ещё раз, либо 'n' если желаете выийти из игры:";
            cin >> reply;
        }
    }
    system("pause");
    return 0;
}


Это крестики-нолики. В нём есть функции: void print_board(string indent) и void clearboard() отвечающие за игровую доску.
Надо реализовать структуру (struct board). В ней объявить переменную char board[9] = {}; (сейчас она глобальная). И функции отвечающие за доску clearboard и print_board реализовать в этой структуре. А в main() уже вызывать эти функции из структуры. Как это правильно реализовать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.05.2018, 21:48
Ответы с готовыми решениями:

Как вызвать Main из другой функции?
собственно в этом то и вся проблема(( Не знаю как вызвать Main из другой функции.... Может кто помочь??

Как вызвать в main данные функции?
Вот весь код,приму любые замечания,так как я еще учусь) Ткните меня в мои же ошибки) using namespace std; template &lt;class...

Как вызвать функцию из функции main?
работаю в деве. предположим я создал проект, изначально в нем находится файл main.cpp. предположим я создал в нем еще один файл с именем...

3
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,375
12.05.2018, 01:44
как то все очень громоздко
вот приблизительная логика крестиков ноликов

C++
1
2
3
4
5
6
7
8
9
10
11
12
//main.cpp
while (!game.ended) {
  game.run;
}
game.show_winner;
 
//game.h
Game::run () {
    get_move(plrComputer);
    redraw_board;
    get_move(plrHuman);
}
0
0 / 0 / 0
Регистрация: 06.11.2016
Сообщений: 48
12.05.2018, 09:31  [ТС]
vlisp, почему громоздко?

Вот я создаю структуру
struct board {
..в ней я должен реализовать функцию clearboard() (которая сейчас реализована просто как отдельная функция). А потом в main() вызывать эту функцию через структуру.
};

Вот только всё никак не могу сообразить как
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,375
12.05.2018, 16:18
Цитата Сообщение от Ellusion Посмотреть сообщение
Вот я создаю структуру
struct board {
..в ней я должен реализовать функцию clearboard()
ты вообще представляешь себе, чтоб доска сама себя чистила? или как у тебя доска, которая чистит доску!
Цитата Сообщение от Ellusion Посмотреть сообщение
почему громоздко?
посмотри сколько у тебя кода и сколько я написал. я написал не весь, конечно, но его будет все равно меньше чем у тебя.
очистить доску это значит заполнить ее нулями , можно в цикле for
Вообще непонятно, зачем у тебя доска выродилась в одномерный массив...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.05.2018, 16:18
Помогаю со студенческими работами здесь

Как вызвать функцию в главной функции main?
как вызвать ету функцию в главной функции main? int sum(int n, int arr, int trans, int summa) for(int i=0;i&lt;n;i++) {for (int...

Как вызвать подсчёт площади фигуры Rectangle в функции main?
//////////////////////////Shape.h #ifndef _SHAPE_H_ #define _SHAPE_H_ class Shape { private: public: Shape()

Как вызвать в main() функции getsum() и getsum(int m)
// Program.cpp: определяет точку входа для консольного приложения. // #include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

можно ли в с++ вызвать переменную из одной функции в другую т.е. мы переменну задали в одной функции а использовали в другой... и как это реализовать?
можно ли в с++ вызвать переменную из одной функции в другую т.е. мы переменну задали в одной функции а использовали в другой... и как это...

Из main вызвать две задачи, при этом сразу вернуть управление в main
Не нашел нигде.. гугл не помог (отчасти только). Вопрос такой, есть консольное приложение. Код main static void Main() { ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru