Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.72/76: Рейтинг темы: голосов - 76, средняя оценка - 4.72
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323

Что изучать для совершенствования знаний по C++

08.11.2018, 09:25. Показов 21519. Ответов 361

Студворк — интернет-сервис помощи студентам
Изучил уже до ООП, вопрос что делать дальше? Могу ли я уже писать программы, с чего начинать?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2018, 09:25
Ответы с готовыми решениями:

Что изучать после получения базовых знаний по c#
В каком направлении дальше двигаться? Или попытаться устроиться стажером для начала? А там дальше скажут в каком направлении двигаться...

Какой язык и технологию изучать после получения средних знаний
Здравствуйте! Я сейчас в 9 классе, буду поступать в техникум...Хорошие знания C#.NET, LINQ, ADO.NET, скоро буду начинать учить ASP.NET, и...

Ссылки для изучения и совершенствования
Ha всякий случай, несколько ссылок, больше на Rutracker. He знаю других трекеров c поиском в этих категориях. Темы c наибольшим спросом...

361
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
22.11.2018, 11:36  [ТС]
Студворк — интернет-сервис помощи студентам
8Observer8, не подскажите издание, или что-то типо того, чтобы понять тему "Односвязные списки".
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
22.11.2018, 11:55
Цитата Сообщение от CyberGame Посмотреть сообщение
8Observer8, не подскажите издание
Мы же на ты.

Цитата Сообщение от CyberGame Посмотреть сообщение
или что-то типо того, чтобы понять тему "Односвязные списки".
std::list в C++ - это двусвязаный список. Нужно искать информацию или книги по структурам данных. Я давно с C++ не имел дела. Я к C++ сейчас имею отношение только потому что на нём много книг по OpenGL. На данный момент я изучаю JavaScript + WebGL, потому у меня под рукой только эта книга Groner L. - Learning JavaScript Data Structures and Algorithms, Second Edition - 2016, в которой есть описания разных структур данных, но она на английском и на JS, а тебе, наверное, нужно искать на C++ или Python. Ищи книгу по структурам данных.
0
 Аватар для Nishen
1359 / 857 / 366
Регистрация: 26.02.2015
Сообщений: 3,831
22.11.2018, 13:59
CyberGame, По алгоритмам и структурам
В общем
Тебе уже кидали вторую ссылку, но, судя по всему, ты даже не удосужился ее изучить.
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
22.11.2018, 18:43  [ТС]
8Observer8, есть ли смысл учить односвязный список?
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
22.11.2018, 19:01
Для общего образования имеет смысл в перспективе изучать все структуры данных. Для змейки достаточно в общих чертах прочитать, что такое двусвязный список и то что я до этого писал - прочитать описания методов std::list, которые используются в программе. Было бы здорово, если бы ты выполнил этот тутор: https://noobtuts.com/python/snake-game
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
23.11.2018, 02:11
CyberGame, Есть, потому что все остальные списки вытекают из него.
Двусвязные - это тот же односвязный, но узлы которого знают о соседях.
Кольцевой - односвязный/двусвязный, хвост и голова которого знают друг о друге

Если понять, что есть список - то проблем понять про остальные не возникнет.
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
23.11.2018, 10:31  [ТС]
8Observer8,
Было бы здорово, если бы ты выполнил этот тутор: https://noobtuts.com/python/snake-game
Он на python.
Очень сложно мне понять эти списки, давай обойдемся на массивах? Сейчас буду переписывать под ООП

Добавлено через 20 минут
8Observer8,
Vector2i() : x(0), y(0)
Что это?
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
23.11.2018, 10:43
Цитата Сообщение от CyberGame Посмотреть сообщение
Он на python.
У тебя больше всего постов по Python:


Тот тутор ты легко поймёшь, потому что я просто переписал оттуда код один в один с Python на С++. Английский там очень простой.

Цитата Сообщение от CyberGame Посмотреть сообщение
Очень сложно мне понять эти списки, давай обойдемся на массивах?
Список идеально подходит для змейки. Не понимаю, что сложно в списках. Там же не нужно список реализовывать самому. Есть готовый std::list. Читаешь документацию, смотришь примеры использования. Я почти все описания из документации перевёл в этом сообщении

Что конкретно тебе не понятно в текущем коде? Скопирую строку и мы её разберём. Так можно разобрать все непонятные строки:
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
#include <GL/freeglut.h>
 
#include <iostream>
#include <string>
#include <list>
using namespace std;
 
int lives = 3;
int score = 0;
 
struct Color3f
{
    float r = 0.5f;
    float g = 0.5f;
    float b = 0.5f;
};
 
struct Vector2i
{
    int x, y;
} coordHead{ 5, 1 }, vectorDir{ 1, 0 }, food{ 10, 10 };
 
list<Vector2i> snake;
list<Vector2i> foods;
 
void drawText(float x, float y, string text)
{
    glColor3f(1.0f, 1.0f, 1.0f);
 
    glRasterPos2f(x, y);
    glutBitmapString(GLUT_BITMAP_8_BY_13, (const unsigned char*)text.c_str());
}
 
void drawSquare(int x, int y, int size, Color3f color)
{
    const float padding = 0.1f;
 
    glColor3f(color.r, color.g, color.b);
 
    glBegin(GL_QUADS);
    glVertex2f(x + padding, y + padding);
    glVertex2f(x + size - padding, y + padding);
    glVertex2f(x + size - padding, y + size - padding);
    glVertex2f(x + padding, y + size - padding);
    glEnd();
}
 
void drawFood()
{
    //glColor3f(0.0f, 0.5f, 0.5f);
    Color3f foodColor = { 0.0f, 0.5f, 0.5f };
    for (auto const& food : foods)
    {
        drawSquare(food.x, food.y, 1, foodColor);
    }
}
 
void drawSnake()
{
    //glColor3f(0.0f, 1.0f, 0.0f);
    Color3f snakeColor = { 0.0f, 1.0f, 0.0f };
    for (auto const& cell : snake)
    {
        drawSquare(cell.x, cell.y, 1, snakeColor);
    }
}
 
void drawRectangle(int x, int y, int width, int height)
{
    glBegin(GL_QUADS);
    glVertex2f(x, y);
    glVertex2f(x + width, y);
    glVertex2f(x + width, y + height);
    glVertex2f(x, y + height);
    glEnd();
}
 
void draw()
{
    glClear(GL_COLOR_BUFFER_BIT);
    drawText(0, 19, "Score: " + to_string(score));
    drawText(15, 19, "Lives: " + to_string(lives));
 
    drawFood();
    drawSnake();
 
    glutSwapBuffers();
}
 
void update(int value)
{
    Vector2i newPos;
    newPos.x = snake.front().x + vectorDir.x;
    newPos.y = snake.front().y + vectorDir.y;
    // Добавляем новый элемент в начало списка
    snake.push_front(newPos);
    // Удаляем старый элемент с конца списка
    snake.pop_back();
 
    int x = snake.front().x;
    int y = snake.front().y;
    for (auto it = foods.begin(); it != foods.end(); /* */)
    {
        int foodX = (*it).x;
        int foodY = (*it).y;
 
        if (x == foodX && y == foodY)
        {
            Vector2i cell = { x, y };
            snake.push_back(cell);
            it = foods.erase(it);
        }
        else
        {
            ++it;
        }
    }
 
    glutTimerFunc(250, update, 0);
    glutPostRedisplay();
}
 
void keyboard(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 'w':
            vectorDir.x = 0;
            vectorDir.y = 1;
            break;
        case 'a':
            vectorDir.x = -1;
            vectorDir.y = 0;
            break;
        case 's':
            vectorDir.x = 0;
            vectorDir.y = -1;
            break;
        case 'd':
            vectorDir.x = 1;
            vectorDir.y = 0;
            break;
        default:
            cout << "This key is not used: " << key << endl;
            break;
    }
}
 
void setNewCoordSystem(int width, int height, int internalWidth, int internalHeight)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0f, internalWidth, 0.0f, internalHeight, 0.0f, 1.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 
int main(int argc, char** argv)
{
    int fieldWidth = 512;
    int fieldHeight = 512;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(fieldWidth, fieldHeight);
    glutCreateWindow("Snake");
    glutDisplayFunc(draw);
    glutTimerFunc(250, update, 0);
    glutKeyboardFunc(keyboard);
    setNewCoordSystem(fieldWidth, fieldHeight, 20, 20);
 
    snake.push_back(coordHead);
    Vector2i cell1 = { 4, 1 };
    Vector2i cell2 = { 3, 1 };
    snake.push_back(cell1);
    snake.push_back(cell2);
 
    foods.push_back(food);
    Vector2i food1 = { 4, 8 };
    Vector2i food2 = { 8, 4 };
    foods.push_back(food1);
    foods.push_back(food2);
 
    glutMainLoop();
    return 0;
}
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
23.11.2018, 10:53
Цитата Сообщение от CyberGame Посмотреть сообщение
Сейчас буду переписывать под ООП
Подожди, давай код выше поразбираем. Это же изучение C++. Не нужно упускать такую возможность, что-то изучить, благодаря змейки.
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
23.11.2018, 10:56  [ТС]
8Observer8,
Python
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
#include <GL/freeglut.h>
 
#include <iostream>
#include <string>
using namespace std;
 
int lives = 3;
int score = 0;
 
 
struct foodEat
{
    int x = rand() % 20;
    int y = rand() % 20;
    int FoodEat[2] = { x, y };
};
foodEat Foodmost;
 
struct Vector2i
{
    int x, y;
    Vector2i() : x(0), y(0)
    {
 
    }
};
Vector2i vector;
 
class Snake
{
    Vector2i *body;
    char dir;
    unsigned int len;
public:
    Vector2i head;
    Snake()
    {
 
    }
    ~Snake()
    {
 
    }
    void move() 
    {
    
    }
    void draw() 
    {
 
    }
    void rotate(char new_dir)
    {
 
    }
 
};
Snake snake;
 
void setNewCoordSystem(int width, int height, int internalWidth, int internalHeight)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0f, internalWidth, 0.0f, internalHeight, 0.0f, 1.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 
void keyboard(unsigned char key, int x, int y)
{
    switch (key)
    {
    case 'w':
        vector.y = 1;
        vector.x = 0;
        break;
    case 'a':
        vector.x = -1;
        vector.y = 0;
        break;
    case 's':
        vector.y = -1;
        vector.x = 0;
        break;
    case 'd':
        vector.x = 1;
        vector.y = 0;
        break;
    default:
        cout << "This key is not used: " << key << endl;
        break;
    }
}
 
void food(int x, int y, int size)
{
    if (snake.head.x == Foodmost.FoodEat[0] && snake.head.y == Foodmost.FoodEat[1])
    {
        Foodmost.x = rand() % 20;
        Foodmost.y = rand() % 20;
        Foodmost.FoodEat[0] = Foodmost.x;
        Foodmost.FoodEat[1] = Foodmost.y;
    }
    glColor3f(0.023, 0.031, 0.737);
    glBegin(GL_QUADS);
    glVertex2f(Foodmost.FoodEat[0], Foodmost.FoodEat[1]);
    glVertex2f(Foodmost.FoodEat[0] + size, Foodmost.FoodEat[1]);
    glVertex2f(Foodmost.FoodEat[0] + size, Foodmost.FoodEat[1] + size);
    glVertex2f(Foodmost.FoodEat[0], Foodmost.FoodEat[1] + size);
    glEnd();
    
}
 
void update(int value)
{
    glColor3f(0.878, 0, 0.050);
    snake.head.x += vector.x;
    snake.head.y += vector.y;
    if (snake.head.x < 0)
    {
        snake.head.x = 20;
    }
    else if (snake.head.x > 20)
    {
        snake.head.x = 0;
    }
    if (snake.head.y > 20)
    {
        snake.head.y = 0;
    }
    else if (snake.head.y < 0)
    {
        snake.head.y = 20;
    }
    if (snake.head.x == Foodmost.FoodEat[0] && snake.head.y == Foodmost.FoodEat[1])
    {
        score++;
    }
    glutTimerFunc(250, update, 0);
    glutPostRedisplay();
}
 
void drawText(int x, int y, string text)
{
    glRasterPos2f(x, y);
    glutBitmapString(GLUT_BITMAP_8_BY_13, (const unsigned char*)text.c_str());
}
 
void drawSquare(int x, int y, int size)
{
    glBegin(GL_QUADS);
    glVertex2f(x, y);
    glVertex2f(x + size, y);
    glVertex2f(x + size, y + size);
    glVertex2f(x, y + size);
    glEnd();
}
 
void draw()
{
    drawText(0, 19, "Score: " + to_string(score));
    drawText(15, 19, "Lives: " + to_string(lives));
 
    drawSquare(snake.head.x, snake.head.y, 1);
 
    food(10, 10, 1);
    glutSwapBuffers();
    glClear(GL_COLOR_BUFFER_BIT);
}
 
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(256, 256); // 256x256 пикселей
    glutCreateWindow("Snake");
    glutDisplayFunc(draw);
    glutTimerFunc(250, update, 255);
    glutKeyboardFunc(keyboard);
    setNewCoordSystem(256, 256, 20, 20);
    glutMainLoop();
    return 0;
}
Смотри, я переписал код под ООП. Всё прекрасно работает, так же сделал такую сис-му, если заходишь в одну сторону выходишь из другой. Сейчас нужно реализовать тело змейки, чтобы он собирал объекты. Где этот пост?

У тебя больше всего постов по Python:
Потому что я учусь в школе программирования, где изучаю язык Python, максимум мы дошли до строк, и работы с ними. Я помогаю своим ровестникам из других школ решать Д/З. Так что я думаю я врядли пойму, функции, массивы и тд.
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
23.11.2018, 11:14
Цитата Сообщение от CyberGame Посмотреть сообщение
Что это?
C++
1
Vector2i() : x(0), y(0)
Этого сейчас нет в коде. Если кратко, это инициализация переменных x и y нулями в конструкторе класса. Называется этот запись: список инициализации.

Это просто синтаксический сахар. Можно с ним написать. Можно без него. Ниже два одинаковых примера. В первом используется этот способ инициализации переменных, а во втором не используется:

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
#include <iostream>
#include <string>
using namespace std;
 
class Table
{
public:
    int height;
    string color;
 
    Table() : height(60), color("red")
    {
 
    }
};
 
int main()
{
    Table table;
 
    cout << "Color = " << table.color << endl;
 
    getchar(); // Задержать консоль
    return 1;
}
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
#include <iostream>
#include <string>
using namespace std;
 
class Table
{
public:
    int height;
    string color;
 
    Table()
    {
        height = 60;
        color = "red";
    }
};
 
int main()
{
    Table table;
 
    cout << "Color = " << table.color << endl;
 
    getchar(); // Задержать консоль
    return 1;
}
Добавлено через 2 минуты
Цитата Сообщение от CyberGame Посмотреть сообщение
Смотри, я переписал код под ООП. Всё прекрасно работает, так же сделал такую сис-му, если заходишь в одну сторону выходишь из другой. Сейчас нужно реализовать тело змейки, чтобы он собирал объекты. Где этот пост?
Ты намного в более глубокие дебри пытаешься сейчас занырнуть, что намного сложнее, чем готовый список std::list. Какой пост?

Добавлено через 4 минуты
Если я вот этот код:
C++
1
2
3
4
struct Vector2i
{
    int x, y;
} coordHead{ 5, 1 }, vectorDir{ 1, 0 }, food{ 10, 10 };
Перепишу в его эквивалент, но в более длинном виде, то тебе так понятнее будет?

C++
1
2
3
4
5
6
7
8
struct Vector2i
{
    int x, y;
};
 
Vector2i coordHead{ 5, 1 };
Vector2i vectorDir{ 1, 0 };
Vector2i food{ 10, 10 };
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
23.11.2018, 11:18  [ТС]
8Observer8, да понятно, я что-то не понял. Что мне сейчас делать?
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
23.11.2018, 11:41
Цитата Сообщение от CyberGame Посмотреть сообщение
Что мне сейчас делать?
Откинем то что раньше было. Свой код пока убираешь вниз под комментарии, для этого можно выделить весь код и нажать: Ctrl+K -> Ctrl+C

Ты копируешь себе этот код. Запускаешь. Видишь, что змейка ест еду, растёт. Ставишь везде точки останова. Выполняшь пошагам. Смотришь, как всё работает, каждая строка. Если какая-то строка в этом коде тебе непонятна, ты её копируешь в сообщение, мы её пытаемся разобрать, попробовать примеры с ней, поэкспериментировать.

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
#include <GL/freeglut.h>
 
#include <iostream>
#include <string>
#include <list>
using namespace std;
 
int lives = 3;
int score = 0;
 
struct Color3f
{
    float r = 0.5f;
    float g = 0.5f;
    float b = 0.5f;
};
 
struct Vector2i
{
    int x, y;
};
 
Vector2i snakeDir{ 1, 0 };
 
list<Vector2i> snake;
list<Vector2i> foods;
 
void drawText(float x, float y, string text)
{
    glColor3f(1.0f, 1.0f, 1.0f);
 
    glRasterPos2f(x, y);
    glutBitmapString(GLUT_BITMAP_8_BY_13, (const unsigned char*)text.c_str());
}
 
void drawSquare(int x, int y, int size, Color3f color)
{
    const float padding = 0.1f;
 
    glColor3f(color.r, color.g, color.b);
 
    glBegin(GL_QUADS);
    glVertex2f(x + padding, y + padding);
    glVertex2f(x + size - padding, y + padding);
    glVertex2f(x + size - padding, y + size - padding);
    glVertex2f(x + padding, y + size - padding);
    glEnd();
}
 
void drawFood()
{
    Color3f foodColor;
    foodColor.r = 0.0f;
    foodColor.g = 0.5f;
    foodColor.b = 0.5f;
    for (auto const& food : foods)
    {
        drawSquare(food.x, food.y, 1, foodColor);
    }
}
 
void drawSnake()
{
    Color3f snakeColor;
    snakeColor.r = 0.0f;
    snakeColor.g = 1.0f;
    snakeColor.b = 0.0f;
    for (auto const& cell : snake)
    {
        drawSquare(cell.x, cell.y, 1, snakeColor);
    }
}
 
void drawRectangle(float x, float y, float width, float height)
{
    glBegin(GL_QUADS);
    glVertex2f(x, y);
    glVertex2f(x + width, y);
    glVertex2f(x + width, y + height);
    glVertex2f(x, y + height);
    glEnd();
}
 
void draw()
{
    glClear(GL_COLOR_BUFFER_BIT);
    drawText(0, 19, "Score: " + to_string(score));
    drawText(15, 19, "Lives: " + to_string(lives));
 
    drawFood();
    drawSnake();
 
    glutSwapBuffers();
}
 
void update(int value)
{
    Vector2i newPos;
    newPos.x = snake.front().x + snakeDir.x;
    newPos.y = snake.front().y + snakeDir.y;
    // Добавляем новый элемент в начало списка
    snake.push_front(newPos);
    // Удаляем старый элемент с конца списка
    snake.pop_back();
 
    int x = snake.front().x;
    int y = snake.front().y;
    for (auto it = foods.begin(); it != foods.end(); /* */)
    {
        int foodX = (*it).x;
        int foodY = (*it).y;
 
        if (x == foodX && y == foodY)
        {
            Vector2i cell = { x, y };
            snake.push_back(cell);
            it = foods.erase(it);
        }
        else
        {
            ++it;
        }
    }
 
    glutTimerFunc(250, update, 0);
    glutPostRedisplay();
}
 
void keyboard(unsigned char key, int x, int y)
{
    switch (key)
    {
        case 'w':
            snakeDir.x = 0;
            snakeDir.y = 1;
            break;
        case 'a':
            snakeDir.x = -1;
            snakeDir.y = 0;
            break;
        case 's':
            snakeDir.x = 0;
            snakeDir.y = -1;
            break;
        case 'd':
            snakeDir.x = 1;
            snakeDir.y = 0;
            break;
        default:
            cout << "This key is not used: " << key << endl;
            break;
    }
}
 
void setNewCoordSystem(int width, int height, int internalWidth, int internalHeight)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0f, internalWidth, 0.0f, internalHeight, 0.0f, 1.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 
int main(int argc, char** argv)
{
    int fieldWidth = 512;
    int fieldHeight = 512;
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(fieldWidth, fieldHeight);
    glutCreateWindow("Snake");
    glutDisplayFunc(draw);
    glutTimerFunc(250, update, 0);
    glutKeyboardFunc(keyboard);
    setNewCoordSystem(fieldWidth, fieldHeight, 20, 20);
 
    Vector2i head = { 4, 1 };
    snake.push_back(head);
 
    Vector2i food1 = { 4, 8 };
    Vector2i food2 = { 8, 4 };
    foods.push_back(food1);
    foods.push_back(food2);
 
    glutMainLoop();
    return 0;
}
Добавлено через 4 минуты
Для закомментирования кода нужно нажать Ctrl+K -> Ctrl+C и чтобы раскомментировать выделенный код, тоже Ctrl+K -> Ctrl+C
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
24.11.2018, 05:06
CyberGame, я больше чем уверен, что непонимание, как движется змейка с хвостом:
C++
1
2
3
4
5
6
7
8
9
10
11
void update(int value)
{
    Vector2i newPos;
    newPos.x = snake.front().x + snakeDir.x;
    newPos.y = snake.front().y + snakeDir.y;
    snake.push_front(newPos);
    snake.pop_back();
    //...
    //...
    //...
}
связана, главным образом, не в незнании, как работать с struct и std::list, а в непонимании математики, а именно, в непонимании, как складываются вектора.

В программе три вектора:
  • Вектор положения головы змейки
  • Вектор направления движения. Этот вектор может принимать значения направления: вверх (0, 1), вниз (0, -1), влево (-1, 0), вправо (1,0). Сейчас когда ты читал (0, 1), (0, -1) и т.д. ты должен был представить эти 4 значения вектора направления на плоскости
  • Вектор нового положения головы змейки, который является суммой вектора старого положения змейки и вектора текущего направления

Очень жаль, что вы в школе ещё не изучали вектора, то есть элемент линейной алгебры. Тебе нужно посвятить некоторое время для упражнений в голове и на листочке в клеточку по теме сложения векторов. Что такое координата вектора? Как складываются вектора? Что такое параллельный перенос вектора? Погугли эти вопросы. Почитай статьи. Посмотри записи учителей на youtube, которые пишут на доске и объясняют, как это происходит в школе. Лучше всего понимаются вектора, когда решаются разные несложные задачки по векторам из учебников математики. Для игр и приложений с интерактивной графикой очень важны хорошие знания и практика работы с векторами.

Забегая далеко вперёд, следующий этап после хорошего изучения векторов - это матрицы. Такие операции как: умножение матрицы на вектор, умножение матриц на матрицу, умножения чисел на марицу и т.д. Применение матриц нужно прежде всего, чтобы совершать операции над группами векторов, которые задают объект. Например, группа из 4-х векторов задаёт квадрат в пространстве. Эти вектора направлены из начала координат в вершины квадрата. Умножая специальную матрицу (матрицу переноса, либо матрицу поворота, либо матрицу масштабирования) на каждый вектор получаем новые вектора, которые задают координаты нового преобразованного объекта. После воздействия матрицы на все вершины объекта (то есть на вектора вершин), объект притерпит изменения он: либо переместится, либо повернётся, либо изменит размер. Из тех книг, которые мне попадались по компьютерной графике и OpenGL понятнее всего объяснили эти основы авторы этой книги: WebGL. Программирование трехмерной графики.
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
24.11.2018, 18:49  [ТС]
8Observer8,
C++ (Qt)
1
2
3
4
for (auto const& food : foods)
    {
        drawSquare(food.x, food.y, 1, foodColor);
    }
C++ (Qt)
1
2
3
4
for (auto const& cell : snake)
    {
        drawSquare(cell.x, cell.y, 1, snakeColor);
    }
C++ (Qt)
1
snake.front().x
Что за метод front(), в коде его же нету.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
or (auto it = foods.begin(); it != foods.end(); /* */)
    {
        int foodX = (*it).x;
        int foodY = (*it).y;
 
        if (x == foodX && y == foodY)
        {
            Vector2i cell = { x, y };
            snake.push_back(cell);
            it = foods.erase(it);
        }
        else
        {
            ++it;
        }
    }
Остальное всё понятно.
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
24.11.2018, 20:30
Цитата Сообщение от CyberGame Посмотреть сообщение
Что за метод front(), в коде его же нету.
Ну как это нету этого метода. Если, конечно, мы говорим про код из сообщения 193.

В методе update даже два раза применяется метод front. Первый раз, чтобы узнать текущее положение головы змейки для расчёта нового положения. Второй раз этот метод применяется, чтобы сравнить новое положение головы со всеми фруктами.

Почему ты скопировал этот код? Что здесь непонятно:
C++
1
2
3
4
5
6
7
8
9
10
11
void drawFood()
{
    Color3f foodColor;
    foodColor.r = 0.0f;
    foodColor.g = 0.5f;
    foodColor.b = 0.5f;
    for (auto const& food : foods)
    {
        drawSquare(food.x, food.y, 1, foodColor);
    }
}
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
24.11.2018, 20:55  [ТС]
8Observer8, все что идёт после for. Что это вообще такое)
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
24.11.2018, 21:04
Мне интересно, как ты так внимательно изучал код, что не заметил метода front?

C++
1
2
3
4
5
6
7
8
9
10
11
void drawFood()
{
    Color3f foodColor;
    foodColor.r = 0.0f;
    foodColor.g = 0.5f;
    foodColor.b = 0.5f;
    for (auto const& food : foods)
    {
        drawSquare(food.x, food.y, 1, foodColor);
    }
}
В for идёт перебор элементов списка. Такой синтаксис на C++. На Python выглядит более понятно. Тот же самый код:
Python
1
2
3
4
def draw_food():
    glColor3f(0.5, 0.5, 1.0)  # set color to blue
    for x, y in food:         # go through each (x, y) entry
        draw_rect(x, y, 1, 1) # draw it at (x, y) with width=1 and height=1
Добавлено через 3 минуты
Почти тот же самый. В коде на C++ рисуются квадраты в цикле, вызывая метод drawSquare и передавая координаты очередной еды из списка, размер квадрата (равный единице), так же передаётся цвет.

На Python рисуются прямоугольники с шириной и высотой равное единице. Цвет рисования выставляется сразу здесь в draw_food, без передачи его в функцию draw_rect
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
24.11.2018, 21:51  [ТС]
8Observer8,
Мне интересно, как ты так внимательно изучал код, что не заметил метода front?
Я его заметил, но реализацию не видел.

C++ (Qt)
1
(auto it = foods.begin(); it != foods.end();
C++ (Qt)
1
2
3
4
5
for (auto const& food : foods)
    {
        drawSquare(food.x, food.y, 1, foodColor);
    }
}
Очень не понятные для меня конструкции, что они выполняют я понял. А вот все равно как-то не очень, есть ли более простая реализация?
0
9991 / 2963 / 497
Регистрация: 05.10.2013
Сообщений: 8,138
Записей в блоге: 243
25.11.2018, 07:26
Цитата Сообщение от CyberGame Посмотреть сообщение
Я его заметил, но реализацию не видел.
С этого момента поподробнее. Ты хочешь увидеть реализацию этого метода? Я правильно понял?

Если да, то я тоже не видел. Зачем тебе реализация? У тебя есть готовый класс std::list, описание и примеры использования которого ты можешь найти здесь: http://www.cplusplus.com/reference/list/list/ или здесь: https://en.cppreference.com/w/cpp/container/list

Я не знаю, возможно ли увидеть реализацию классов стандартной библиотеки, которая используется в Visual Studio. Может быть компания Microsoft написала реализацию или они взяли где-то эту реализацию. Скорее всего, Microsoft не предоставляет исходников STD, а вся реализация устанавливается в виде собранных lib вместе с установкой Visual Studio.

Даже если бы ты нашёл реализацию метода front класса list, то вряд ли бы тебе это чем-то помогло понять, как работает метод front. Чтобы понять с точки зрения пользователя этого метода, что делает этот метод, тебе достаточно погуглить: front list c++. По первым ссылкам ты увидишь описание и примеры использования:
http://www.cplusplus.com/refer... ist/front/
https://en.cppreference.com/w/... list/front

Цитата Сообщение от CyberGame Посмотреть сообщение
А вот все равно как-то не очень
Наверное потому что тебе не понятны слова: auto, const и символ '&' Всё что непонятно нужно сначала погуглить. Вот тебе непонятно, что такое auto. Ты в гугле набираешь: auto c++. Там будет, например, много ссылок на темы на форумах, на статьи из блогов, на туториалы, на документацию на MSDN и т.д. Везде люди пытаются изо всех сил как можно понятнее на примерах объяснить, что такое auto. Если ты много раз прочитаешь разные описания, то во конце в концов поймёшь что это такое. Может даже не в этот день, как когда проснёшься, вдруг поймёшь, так бывает. Таким образом ты должен погуглить: const c++. А потом: с++ &

Цитата Сообщение от CyberGame Посмотреть сообщение
А вот все равно как-то не очень, есть ли более простая реализация?
Ты всё равно бы от итераторов никуда бы не делся. Представь, что они работают как указатели, то есть значение итератора it указывает на адрес элемента в списке, а конструкция *it возвращает элемент списка по адресу, который хранится в итераторе. Если искать другую реализацию без списков, то будут свои сложности. Лучше пиши дальше игру, а по ходу в перерывы будешь гуглить конструкции, читать документацию, читать об этих конструкциях в книгах и т.д. Что-то с первого раза не будет понятно, но всё понимается по спирали, то есть ты возвращаешься к чему-то каждый раз и с каждым разом понимаешь это лучше и лучше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.11.2018, 07:26

Какой язык изучать или что изучать?
Здравствуйте форумчане. какой язык программирования изучать чтоб работать дома через интернет? может 1с? я сам живу в деревне работы нет,о...

Подскажите, как лучше всего изучать язык, ежели в академии не дают достаточный объем знаний
хожу на курсы в академию уже 3 месяца, изучаем С++ по либерти, практики нету вообще, просто примеры по книге набираем...в общем туго идет,...

Какие паттерны можно использовать для совершенствования приложения
Доброго времени суток! У меня есть приложение реализованное на Qt C++ - тестирование студентов. Суть приложения заключается в...

Что изучать для работы
Всем здравствуйте. Ребята, такой вопрос. Какие технологии сейчас лучше изучать, чтобы было проще и быстрее, и при этом чтобы можно было...

Что изучать для создания сайтов
Привет всем, всех с новым годом! кто занимается web - разработкой, создание сайтов , хотелось у вас узнать ко э что. В каком порядки...


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

Или воспользуйтесь поиском по форуму:
200
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru