Форум программистов, компьютерный форум, киберфорум
Программирование игр
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
 Аватар для 3eJIeHbIu
0 / 3 / 0
Регистрация: 14.11.2015
Сообщений: 258

Консольная змейка

25.10.2018, 14:50. Показов 2287. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите найти ошибку в игре (консольная змейка), при съедании яблока количество прибавляется не на единицу а некоторое количество яблок.
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
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
#include <iostream>  //стандартная библиотека вывода информации на экран
#include <time.h> //библиотека для работы с датой и временем
#include <stdio.h> //для printf
#include <windows.h> // для HANDLE, курсора, цвета
#include <conio.h>  //для kbhit
#include <ctype.h>  //для kbhit
 
using namespace std;
 
HANDLE hConsole;
//HANDLE hStdout, hStdin;
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
 
void GotoXY(int X, int Y)
{
    COORD coord = { X, Y };
    SetConsoleCursorPosition(hStdOut, coord);
}
//Цвет
enum ConsoleColor
{
        Black         = 0,
        Blue          = 1,
        Green         = 2,
        Cyan          = 3,
        Red           = 4,
        Magenta       = 5,
        Brown         = 6,
        LightGray     = 7,
        DarkGray      = 8,
        LightBlue     = 9,
        LightGreen    = 10,
        LightCyan     = 11,
        LightRed      = 12,
        LightMagenta  = 13,
        Yellow        = 14,
        White         = 15
};
 
void SetColor(ConsoleColor text, ConsoleColor background)
{
    SetConsoleTextAttribute(hStdOut, (WORD)((background << 5) | text));
}
 
 
class Zmeja  // класс структуры змейки
{
    public:
        COORD *t; //точки
        int PCount; //количество яблок
};
enum uprawlenie{LEFT,UP,RIGHT,DOWN}; //направление змейки
class Game //даные-точности: змейки, яблок, передвижение по X и Y, задержка, направление
{
    public:
        Zmeja gaduka; //змейка
        COORD jabloko; //яблоко
        int dx,dy; //передвижение
        int pause; //задержка
        int nap; //направление
        int num;//сколько яблок съедим
 
};
 
void PlusJabloko(Game &g) //Функция разброски яблок
{
    int i,x,y;
    int n = g.gaduka.PCount;
    do
    {
        x = rand() % 56+3; //
        y = rand() % 19+3; //кординаты яблока
 
                // проверка чтобы яблоко не бросить на змею
        for(i = 0; i < n; i++)
        {
            if(x == g.gaduka.t[i].X && y == g.gaduka.t[i].Y)
                break;
        }
    }
    while(i < n);
    g.jabloko.X = x; //
    g.jabloko.Y = y; //запоминаем позицию яблока
    SetConsoleCursorPosition(hConsole, g.jabloko); //переносим курсор в эту позицию
    SetConsoleTextAttribute(hConsole,0x0c); //цвет яблока
    printf("%C", 4); //рисуем яблоко любым символом
 
}
 
//Инициализация игры
void InitGame(Game &g)
{
    system("cls");
    g.gaduka.PCount = 3; //сколько точек в змейке
    g.gaduka.t = new COORD [3];//создали точки
    for(int i = 0; i < 3; i++)
    {
        g.gaduka.t[i].X = 20 + i;
        g.gaduka.t[i].Y = 20;
 
    }
    g.dx = 1;
    g.dy = 0;
    g.pause = 500;//скорость передвижение змеи
    PlusJabloko(g);//рисуем яблоко
}
 
void STENA_2() //Вся информация, отображаемая на стене
{
    SetColor(LightBlue , Black);
 
        GotoXY(20,0);cout << "\t\tЗмейка" <<endl;
 
    GotoXY(64,3);cout <<  "Яблок:0" << endl ; //Яблок
    GotoXY(64,4); cout <<  "Длина: 3"<< endl; //Длина
    GotoXY(64,5); cout <<  "Скорость:0" << endl; //Скорость
    GotoXY(64,7); cout << "Управление:" <<  endl; //Управление
    GotoXY(64,8); cout << "Esc:Выход" <<  endl; //Выход
    GotoXY(64,9); cout << "P:Пауза" <<  endl; //Пауза
    GotoXY(64,10);printf("%c",24);cout <<":Вверх"<<endl; //Вверх
    GotoXY(64,11);printf("%c",25);cout<<":Вниз"<<endl;   //Вниз
    GotoXY(64,12);printf("%c",27);cout<<":Влево"<<endl;  //Влево
    GotoXY(64,13);printf("%c",26);cout<<":Вправо"<<endl; //Вправо
                {SetColor(LightMagenta , Black);
 
                GotoXY(2,2); //Рисуем верхнюю горизонтальную линию-стенку
                int m = 0;
                for(m = 0; m < 60; m++)
                {
                    printf("*");
                }
                }
 
                {
                    GotoXY(2,24); //Рисуем нижнюю горизонтальную линию-стенку
                    int m = 0;
                    for(m = 0; m < 60;m++)
                    {
                        printf("*");
                    }
                }
                {   //Рисуем левую вертикальную линию-стенку
                    GotoXY(2,3); cout << "*"<<endl;
                    GotoXY(2,4); cout << "*"<<endl;
                    GotoXY(2,5); cout << "*"<<endl;
                    GotoXY(2,6); cout << "*"<<endl;
                    GotoXY(2,7); cout << "*"<<endl;
                    GotoXY(2,8); cout << "*"<<endl;
                    GotoXY(2,9); cout << "*"<<endl;
                    GotoXY(2,10); cout << "*"<<endl;
                    GotoXY(2,11); cout << "*"<<endl;
                    GotoXY(2,12); cout << "*"<<endl;
                    GotoXY(2,13); cout << "*"<<endl;
                    GotoXY(2,14); cout << "*"<<endl;
                    GotoXY(2,15); cout << "*"<<endl;
                    GotoXY(2,16); cout << "*"<<endl;
                    GotoXY(2,17); cout << "*"<<endl;
                    GotoXY(2,18); cout << "*"<<endl;
                    GotoXY(2,19); cout << "*"<<endl;
                    GotoXY(2,20); cout << "*"<<endl;
                    GotoXY(2,21); cout << "*"<<endl;
                    GotoXY(2,22); cout << "*"<<endl;
                    GotoXY(2,23); cout << "*"<<endl;
                }
                {   //Рисуем правую вертикальную линию-стенку
                    GotoXY(61,3); cout << "*"<<endl;
                    GotoXY(61,4); cout << "*"<<endl;
                    GotoXY(61,5); cout << "*"<<endl;
                    GotoXY(61,6); cout << "*"<<endl;
                    GotoXY(61,7); cout << "*"<<endl;
                    GotoXY(61,8); cout << "*"<<endl;
                    GotoXY(61,9); cout << "*"<<endl;
                    GotoXY(61,10); cout << "*"<<endl;
                    GotoXY(61,11); cout << "*"<<endl;
                    GotoXY(61,12); cout << "*"<<endl;
                    GotoXY(61,13); cout << "*"<<endl;
                    GotoXY(61,14); cout << "*"<<endl;
                    GotoXY(61,15); cout << "*"<<endl;
                    GotoXY(61,16); cout << "*"<<endl;
                    GotoXY(61,17); cout << "*"<<endl;
                    GotoXY(61,18); cout << "*"<<endl;
                    GotoXY(61,19); cout << "*"<<endl;
                    GotoXY(61,20); cout << "*"<<endl;
                    GotoXY(61,21); cout << "*"<<endl;
                    GotoXY(61,22); cout << "*"<<endl;
                    GotoXY(61,23); cout << "*"<<endl;
                }
}
 
 
//Функция которая двигает и рисует
enum {KONEC, STENA,  PLUS, MOVE};
int Move(Game &g)
{
    int & n = g.gaduka.PCount;
    COORD head = g.gaduka.t[n - 1]; //голова
    COORD tail = g.gaduka.t[0]; //хвост
    COORD next;
    next.X = head.X + g.dx;
    next.Y = head.Y + g.dy; //проверка следующей точки по направлению
 
    if(next.X < 3 || next.Y < 3 || next.X > 60 || next.Y > 23)//не уперлась ли в стену?
        return STENA;
 
    if(n > 4)
    {
        for(int i = 0; i < n; i++)
            if(next.X == g.gaduka.t[i].X && next.Y == g.gaduka.t[i].Y) //не уперлась ли в себя?
                return KONEC;
    }
 
    if(next.X == g.jabloko.X && next.Y == g.jabloko.Y)
    {
        COORD*temp = new COORD[ ++n ]; //новый масив больший на 1
        for(int i = 0; i < n; i++)
            temp[i] = g.gaduka.t[i]; //перекопируем
        temp[n - 1] = next; //добавляем одну
        delete [] g.gaduka.t;
        g.gaduka.t = temp;
 
        SetConsoleCursorPosition(hConsole,head);
        SetConsoleTextAttribute(hConsole, 0x0a); //закрашываем яблоко которое сьели
        printf("*");
        SetConsoleCursorPosition(hConsole,next);
        SetConsoleTextAttribute(hConsole,0x0a);
        printf("%c",1);
        PlusJabloko(g);
        return PLUS;
    }
 
    for(int i = 0; i < n - 1; i++)
        g.gaduka.t[i] = g.gaduka.t[i + 1];
    g.gaduka.t[n - 1] = next;
    SetConsoleCursorPosition(hConsole,tail);//закрашиваем хвостик
    printf(" ");
 
    SetConsoleCursorPosition(hConsole,head);
    SetConsoleTextAttribute(hConsole, 0x0a);//красим бывшую голову змеи в зелений цвет
    printf("*");
    SetConsoleCursorPosition(hConsole,next);
    SetConsoleTextAttribute(hConsole,0x0f); //красим курсор в белый цвет (голову змеи)
    printf("%c",1);
 
    return MOVE;
}
 
//int intro()
void intro()
{
    setlocale(LC_ALL, "Russian");
        GotoXY(3,10); //Интруха
    printf("\tЗмейка. Управление стрелочками. Esc - выход из игры.");
    GotoXY(15,11);
    printf("Если соберёте - 1000 яблок вас ждёт сюрприз ;)");
 
    GotoXY(18,12);
    printf("Для продолжения нажмите Enter");
    getch();
}
 
 
//////////////////////
int main()
{
    hConsole = GetStdHandle(STD_OUTPUT_HANDLE); //получаем дескриптор консоли
    intro();
    int key = 0, count = 0;
    bool Pause=false;
    Game g;
    InitGame(g);
//  intro(g);
//  Level(g);
    STENA_2();
//  Level(g);
    srand(time(0));
    bool pause = false;
 
    while(key != 27)
    {
        while(!kbhit()) //ждет пока нажмем
        {
            if(Pause==true)
            {
                Sleep(1);
                continue;
            }
 
            switch (Move(g))//движение
            {
            case KONEC:
            case STENA:
                GotoXY(23,1); printf("Вы проиграли\n\n\t\t\t"); //Вы проиграли, ХА ХА ХА
                getch();
                return(0);
 
            case PLUS:
                ++count;
                g.pause-=1;
                SetColor(LightBlue , Black);
 
                GotoXY(64,3); cout << "Яблок:" <<count << endl;
                GotoXY(64,4); cout << "Длина:" <<g.gaduka.PCount << endl;
                GotoXY(64,5); cout << "Скорость:" <<g.pause<< endl;
                GotoXY(64,7); cout << "Управление:" <<  endl;
                GotoXY(64,8); cout << "Esc:Выход" <<  endl;
                GotoXY(64,9); cout << "P:Пауза" <<  endl;
                GotoXY(64,10);printf("%c",24);cout <<":Вверх"<<endl;
                GotoXY(64,11);printf("%c",25);cout<<":Вниз"<<endl;
                GotoXY(64,12);printf("%c",27);cout<<":Влево"<<endl;
                GotoXY(64,13);printf("%c",26);cout<<":Вправо"<<endl;
 
            case MOVE:
                break;
 
            }//switch
 
            Sleep(g.pause); //Задержка
 
        }//while(!kbhit()) //ждет пока нажмем
 
 
        key = getch();
 
        if(key=='P'||key=='p')
            Pause=!Pause;
        else if(key==0||key==224)
        {
            key=getch();
 
            if(key == 72 && g.nap != DOWN)
            {
                g.nap = UP;
                g.dx = 0;
                g.dy = -1;
            }
            else if(key == 80 && g.nap != UP)
            {
                g.nap = DOWN;
                g.dx = 0;
                g.dy = 1;
            }
            else if(key == 75 && g.nap != RIGHT)
            {
                g.nap = LEFT;
                g.dx = -1;
                g.dy = 0;
            }
            else if(key == 77 && g.nap != LEFT)
            {
                g.nap = RIGHT;
                g.dx = 1;
                g.dy = 0;
            }
        }//else
 
    }//while(key != 27)
 
}
Добавлено через 24 минуты
Если быть точным, значение количества единиц длины змейки увеличивается на 40 пару раз, через пару-тройку раз значение продолжается увеличиваться на 1.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.10.2018, 14:50
Ответы с готовыми решениями:

Создание Автопоиска в игре Змейка (С++)
Здравствуйте. Я недавно сделал игру по видео уроку (ссылка: https://www.youtube.com/watch?v=QwefQ79Lklk ) Меня заинтересовала идея...

Консольная змейка
Сижу дома на летних каникулах, развлекаюсь.. З,Ы, особо забавный 3-й режим игры с клоном)) он проворный и злостный)) using...

Консольная змейка
Я уже устал и отчаялся. Никак не могу понять как нарисовать горизонтальную линию. У меня есть список List в котором есть объекты Типа...

26
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
25.10.2018, 15:19
Цитата Сообщение от 3eJIeHbIu Посмотреть сообщение
#include <conio.h> //для kbhit
#include <ctype.h> //для kbhit
Не используйте такое извращение. Лучше возьмите curses. Тут рядом 1.5 темы, где это рассмотрено подробнее. Собственно, одна из причин видна прямо сейчас: у меня нет простого способа скомпилировать и проверить ваш код.
Цитата Сообщение от 3eJIeHbIu Посмотреть сообщение
Zmeja
enum uprawlenie
Старайтесь не использовать транслит. Лучше потратить пол-минуты и найти перевод. Особенно неприятно смотрится когда часть объектов названа нормально.
Цитата Сообщение от 3eJIeHbIu Посмотреть сообщение
x = rand() % 56+3; //
Не лучшая версия рандома. Возможно, лучше будет написать свою функцию
C
1
2
3
4
float rnd(float min, float max){
  float res = rand() / RAND_MAX;
  return res*(max-min) + min;
}
75 for(i = 0; i < n; i++)
Вы не отличите на последней итерации цикла выход по завершении от выхода по break'у.
Цитата Сообщение от 3eJIeHbIu Посмотреть сообщение
printf("%C", 4); //рисуем яблоко любым символом
man printf
Code
1
2
C      (Not in C99 or C11, but in SUSv2, SUSv3, and SUSv4.)   Synonym  for  lc.   Don't
              use.
Это какой-то устаревший вариант вывода одного символа Юникода. Использовать не рекомендуют. А символ с кодом 4 вообще непечатный, похоже.
Да, и чем вас не устроили putchar(), printf("\04")?
enum {KONEC, STENA, PLUS, MOVE};
int Move(Game &g)
Не стоит приводить перечисление к целому числу. Лучше объявите специальный тип перечисления:
C++
1
2
enum MoveRes{ GAME_END, GAME_WALL, GAME_PLUS, GAME_MOVE };
MoveRes Move(Game &g)
C++
1
2
3
COORD*temp = new COORD[ ++n ]; //новый масив больший на 1
        for(int i = 0; i < n; i++)
            temp[i] = g.gaduka.t[i]; //перекопируем
У вас COORD все равно простая структура, без конструкторов и методов. Так и объявите ее структурой с изменением размера по realloc. И копировать не придется. Ну и изменять на 1 элемент не лучшая идея... хотя пока и сойдет.
printf("Если соберёте - 1000 яблок вас ждёт сюрприз ");
Сюрприз ждать в DLC?
COORD*temp = new COORD[ ++n ]; //новый масив больший на 1
Не очевидно, что уеличение длины змейки происходит именно здесь. Лучше бы сделать более явно.
GotoXY(23,1); printf("Вы проиграли\n\n\t\t\t"); //Вы проиграли, ХА ХА ХА
Зачем столько переводов строки и табуляций перед самым завершением? Ну а если уж ставите, ставьте один перевод строки в конце.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{   //Рисуем левую вертикальную линию-стенку
                    GotoXY(2,3); cout << "*"<<endl;
                    GotoXY(2,4); cout << "*"<<endl;
                    GotoXY(2,5); cout << "*"<<endl;
                    GotoXY(2,6); cout << "*"<<endl;
                    GotoXY(2,7); cout << "*"<<endl;
                    GotoXY(2,8); cout << "*"<<endl;
                    GotoXY(2,9); cout << "*"<<endl;
                    GotoXY(2,10); cout << "*"<<endl;
                    GotoXY(2,11); cout << "*"<<endl;
                    GotoXY(2,12); cout << "*"<<endl;
                    GotoXY(2,13); cout << "*"<<endl;
                    GotoXY(2,14); cout << "*"<<endl;
                    GotoXY(2,15); cout << "*"<<endl;
                    GotoXY(2,16); cout << "*"<<endl;
                    GotoXY(2,17); cout << "*"<<endl;
                    GotoXY(2,18); cout << "*"<<endl;
                    GotoXY(2,19); cout << "*"<<endl;
                    GotoXY(2,20); cout << "*"<<endl;
                    GotoXY(2,21); cout << "*"<<endl;
                    GotoXY(2,22); cout << "*"<<endl;
                    GotoXY(2,23); cout << "*"<<endl;
                }
Сделайте меня развидеть это! Для кого циклы придумали?!
Цитата Сообщение от 3eJIeHbIu Посмотреть сообщение
при съедании яблока количество прибавляется не на единицу а некоторое количество яблок.
Добавьте отладочный вывод: когда змея съедает яблоко, пусть в консоль пишет координаты съеденного. Возможно, что-то будет видно.
Цитата Сообщение от 3eJIeHbIu Посмотреть сообщение
консольная змейка
Несмотря на некоторые косяки (те же стены =8-0 ), код неплохо структурирован и местами даже прокомментирован.
1
 Аватар для 3eJIeHbIu
0 / 3 / 0
Регистрация: 14.11.2015
Сообщений: 258
25.10.2018, 15:26  [ТС]
COKPOWEHEU, спасибо, есть от чего оттолкнуться. Этот код один большой костыль, много аспектов решалось с помощью неактуальной информации, для этого и существуют специалисты на форумах ;-) .
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
25.10.2018, 18:16
Не сказал бы что "один большой костыль". Структура вполне прослеживается, взаимодействие частей вполне логичное (не везде, конечно).
Поскольку запустить вашу программу не представляется возможным из-за завязки на WinAPI, подсказать собственно по вопросу вряд ли смогу, придется вам ковыряться в отладчике, добавлять вывод контрольных точек и тому подобное.
0
 Аватар для 3eJIeHbIu
0 / 3 / 0
Регистрация: 14.11.2015
Сообщений: 258
25.10.2018, 19:01  [ТС]
COKPOWEHEU, всё же вы направили на некоторые исправления, спасибо за помощь.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
26.10.2018, 09:59
Ну так исправляйте. И еще раз рекомендую переписать на curses. Между прочим, неплохой опыт в разделении программы на составные блоки: можно вынести всю работу с (псевдо)графикой и вводом в отдельный класс или модуль, чтобы при желании потом поменять, скажем, на OpenGL, не меняя логику.
0
 Аватар для 3eJIeHbIu
0 / 3 / 0
Регистрация: 14.11.2015
Сообщений: 258
26.10.2018, 15:15  [ТС]
COKPOWEHEU, проблема возникла при подключении библиотеки curses.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
26.10.2018, 17:13
Мне помолиться за вас Богу Машин чтобы ошибка чудесным образом исчезла?
Или все же предоставите хоть какую-то информацию? Минимальный код, на котором воспроизводится ошибка. Лог ругани компилятора. Наличие соответствующих библиотек.
0
 Аватар для 3eJIeHbIu
0 / 3 / 0
Регистрация: 14.11.2015
Сообщений: 258
26.10.2018, 18:42  [ТС]
COKPOWEHEU, нет такого файла или каталога (no such file or directory).
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
26.10.2018, 19:53
То есть информацию предоставлять не хотите. Ладно, тогда помолюсь.
0
Диванный эксперт
Эксперт С++
 Аватар для Max Dark
2550 / 2064 / 971
Регистрация: 09.10.2013
Сообщений: 4,793
Записей в блоге: 4
26.10.2018, 20:47
3eJIeHbIu, Как уже сказали в коде есть над чем работать...

Интересующая вас "ошибка" проста - сравните вывод информации в строках 114-123 и 301-310.
Решение: оформить дублирующийся код в функцию.
0
 Аватар для 3eJIeHbIu
0 / 3 / 0
Регистрация: 14.11.2015
Сообщений: 258
26.10.2018, 21:42  [ТС]
Max Dark, спасибо помогли.

Добавлено через 22 минуты
COKPOWEHEU, вы не поняли, в любом проекте библиотеку curses а так же ncurses использовать невозможно, просто её надо подключить. Подскажите как правильно её подключить?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
27.10.2018, 00:19
Я кидал ссылки на темы.
У того форумчанина получилось. Какие возникают проблемы у вас?
Если "no such file or directory" значит что-то не так делаете. Например, не скопировали саму библиотеку.
0
 Аватар для 3eJIeHbIu
0 / 3 / 0
Регистрация: 14.11.2015
Сообщений: 258
27.10.2018, 08:33  [ТС]
COKPOWEHEU, не получается подключить. У меня эти методы не работают.
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
27.10.2018, 10:34
Скажи, ты хотя бы сам находишь свои ответы достаточной информацией для поиска проблемы?
Пока что диалог проходит так:
- Ничего не работает
- Нужны подробности
- Ничего не работает
Ладно, попробуем еще раз.
Какой компилятор? (точное название, а не в стиле "обычный")
Какой код пытаетесь скомпилировать? (полный код, а не разрозненные куски)
По какой инструкции пытались подключить библиотеку? (ссылка или полный текст, а не "из интернета")
Как именно ругается компилятор? (полный текст со всеми названиями файлов, путей и прочего, а не "не может найти файл")
0
 Аватар для 3eJIeHbIu
0 / 3 / 0
Регистрация: 14.11.2015
Сообщений: 258
27.10.2018, 19:55  [ТС]
COKPOWEHEU, GNU GCC Compiler, код:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
 
using namespace std;
 
int main()
{
cout << "1";
 
return 0;
}
Подключать библиотеку я не пробовал. Я не знаю как правильно подключить внешнюю библиотеку.

Тест таков, ошибка сборки.
||=== Build: Debug in Project2 (compiler: GNU GCC Compiler) ===|
D:\Shit\CodeBlocks\Project2\main.cpp|2|f atal error: curses: No such file or directory|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
27.10.2018, 22:26
Цитата Сообщение от 3eJIeHbIu Посмотреть сообщение
Подключать библиотеку я не пробовал. Я не знаю как правильно подключить внешнюю библиотеку.
С этого надо было начинать. Но я же давал ссылки, где такой же новичок как вы, успешно подключил curses.
0
 Аватар для 3eJIeHbIu
0 / 3 / 0
Регистрация: 14.11.2015
Сообщений: 258
28.10.2018, 09:43  [ТС]
COKPOWEHEU, человек решает свои проблемы с компилятором mingw, не понятно с какой ide. И вообще, это с каждой библиотекой проводятся такие танцы с бубном, нет стандартного способа? Я честно говоря вообще ничего не понял из того что делает парень, что вы ему советуете. Вам всё понятно потому что вы видимо специалист в этой области, а у меня от ваших советов в глазах синий экран. Неужели подключение каждой внешней библиотеки подразумевает собой такие сложности? В интернете прочёл, что библиотека curses предназначена для unix-подобных систем, а что делать тем у кого не unix подобная система?
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,928
28.10.2018, 14:46
Цитата Сообщение от 3eJIeHbIu Посмотреть сообщение
не понятно с какой ide
Скорее всего в DevC++, но я лично обхожусь вообще без IDE.
Цитата Сообщение от 3eJIeHbIu Посмотреть сообщение
Неужели подключение каждой внешней библиотеки подразумевает собой такие сложности?
Стандартное подключение внешней библиотеки:
- скачиваете библиотеку (лучше, конечно, сразу пакетом из репозитория, но в винде это не работает): заголовочные файлы (*.h), статические (*.a / *.lib в gcc и msvs соответственно), динамические библиотеки (*.so / *.dll).
По той ссылке я уже собрал заголовочники в mingw_include/ncursesw, а единственную статическую библиотеку libncursesw.a оставил в корне архива.
В файл исходного кода, в котором хотим использовать библиотеку, подключаем ее заголовочные файлы:
Цитата Сообщение от main.cpp
#include <curses.h>
В данном случае файл исходного кода всего один. Впрочем, даже в многофайловом проекте лучше не делать лишних зависимостей и сконцентрировать взаимодействие с библиотекой в одном месте.
Вот теперь начинается самое интересное: надо указать компилятору где находятся библиотеки и инклюдники. Самое простое - *.h туда же, где находится main.cpp, но из соображений модульности и переносимости я сделал чуть по-другому: указал компилятору путь к библиотекам при помощи ключей в makefile: -I ./mingw_include -I ./mingw_include/ncursesw Это работает для gcc, но для использования в составе IDE или других компиляторах надо посмотреть документацию на них. Скорее всего там тоже есть ключи запуска или где-то в недрах меню вроде libraries/include_path... точно не знаю, смотрите как это делается для вашего компилятора.
Теперь компилятор видит все объявления функций и не будет на них ругаться, но статическая библиотека еще не подключена, то есть фактически кроме названий функций у него ничего нет. Для подключения статической библиотеки к gcc ее можно просто вписать туда же, куда и объектные файлы, даже без флагов: libncursesw.a. Опять же, в IDE это делается по-другому, надо искать в недрах меню.
Вот и все, теперь все компилируется и, если повезет, работает.
Еще раз. Для подключения любой внешней библиотеки надо провести следующие манипуляции:
Code
1
2
3
4
5
6
7
1. Скачать ее
2. Подключить ее *.h файлы в свою программу
  2а. Скопировать их к другим *.h файлам в то место, про которое компилятор знает. (по умолчанию так делается в dev- пакетах линукса)
  2а. Либо прописать компилятору пути к заголовкам (так приходится делать при не-централизованной установке программ)
3. Подключить статические и динамические библиотеки (*.a / *.so)
  3а. Скопировать в известное компилятору место (аналогично заголовочным)
  3б. Прописать компилятору пути
Цитата Сообщение от 3eJIeHbIu Посмотреть сообщение
В интернете прочёл, что библиотека curses предназначена для unix-подобных систем, а что делать тем у кого не unix подобная система?
Она изначально разрабатывалась для unix-подобных систем, но потом была портирована и на другие. Например, у anton3d именно винда стоит и ничего, все работает. Правда, там небольшой баг с консолью, но его надо просто учитывать (там символ перевода строки занимает одно знакоместо, в отличие от других систем, где он только переводит строку).
0
 Аватар для 3eJIeHbIu
0 / 3 / 0
Регистрация: 14.11.2015
Сообщений: 258
28.10.2018, 15:07  [ТС]
COKPOWEHEU, вы представили определённый список действий, а почему на просторах интернета все пишут про регистрацию какого то кода (типа sudo aptitude install libncurses5) в консоли, якобы этого достаточно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.10.2018, 15:07
Помогаю со студенческими работами здесь

Консольная змейка
Добрый день. С недавнего времени я пишу в консоли игру с одноименным названием. Занятие, прошу заметить, довольно увлекательное :) ...

Консольная змейка
Написал консольную змейку, но почему-то не работает управление :) Ну, как не работает, цвет на пробел то меняется, но W, A, S, D чтоб...

C++ Консольная змейка. Код
Доброго времени суток. Недавно я начал учиться программировать. И вот задался я целью написать консольную змейку. Кодил я кодил и пришел...

Консольная змейка. Кто что скажет? )
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;windows.h&gt; #include&lt;time.h&gt; #include&lt;stdlib.h&gt; //#include&lt;iostream&gt; ...

Консольная Змейка: фрукт генерируется за пределами карты
Здравствуйте! Я написал консольную змейку на с++. В ней всё работает нормально, но есть один баг. Через некоторое время фрукт генерируется...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru