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

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

08.11.2018, 09:25. Показов 19615. Ответов 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
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,030
Записей в блоге: 242
26.12.2018, 14:39
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Я, к сожалению, сам забываю регулярно решать задачи. Это полезно и интересно. Тем более, что задачи там простые. Их сложность увеличивает очень медленно, а так как навык тоже потихоньку растёт, то кажется, что задачи одинаково простые.

Обрати внимание на поле "Sample Tests" справа-внизу на скриншоте:
Screenshot


Я поясню, что это такое. Перед решением задачи нужно представлять, какие входные данные мы передаём и что мы ожидаем на выходе в зависимости от разных входных данных. Удобно перед решением задачи или во время решения выписать в столбик, что этим входным данным соответствует такой ожидаемый результат, другим входным данным - такой и т.д. Этот вид информации можно оформить в тесты. Тесты можно назвать: спецификацией функции, либо требованиями технического задания, либо просто сокращённо ТЗ, либо живой документацией, либо дополнительной защитой от ошибок рефакторинга.

Например, если мы пишем калькулятор, то
для сложения будет:
Code
1
2
5, 6    11
1, -5   -4
для деления:
Code
1
2
10, 5    2
15, 0    Exception("Деление на ноль")
Цитата Сообщение от 8Observer8 Посмотреть сообщение
В поле "Sample Tests" ты увидишь такой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Describe(Tests)
{
    It(ExampleTests)
    {
        Assert::That(sequenceSum(2, 6, 2), Is().EqualTo(12));
        Assert::That(sequenceSum(1, 5, 1), Is().EqualTo(15));
        Assert::That(sequenceSum(1, 5, 3), Is().EqualTo(5));
        Assert::That(sequenceSum(0, 15, 3), Is().EqualTo(45));
        Assert::That(sequenceSum(16, 15, 3), Is().EqualTo(0));
        Assert::That(sequenceSum(2, 24, 22), Is().EqualTo(26));
        Assert::That(sequenceSum(2, 2, 2), Is().EqualTo(2));
        Assert::That(sequenceSum(2, 2, 1), Is().EqualTo(2));
        Assert::That(sequenceSum(1, 15, 3), Is().EqualTo(35));
        Assert::That(sequenceSum(15, 1, 3), Is().EqualTo(0));    
    }
};;
Assert::That(actual, expected) - мы проверяем равно ли действительное значение ожидаемому.

actual - переводится, как "фактический" результат
expected - "ожидаемый" результат

Например:
C++
1
Assert::That(sequenceSum(16, 15, 3), Is().EqualTo(0));
Стартовое значение 16 больше, чем 15, а по ТЗ в такой ситуации функция sequenceSum() должна вернуть 0, что и написано в тесте.

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

Я придумал тебе задание. Я сделал заготовку для всех задач из codewars для VS: KataGTestCpp.zip Эта заготовка использует GoogleTest или сокращённо GTest. GTest - это фреймворк от компании Google для написания программ с использованием тестов.

Не забудь, что если у тебя не VS2015, а другая версия, то в настройках нужно выставить твою версию VS. По-моему, у тебя 2017. Нужно выставить в "Platform Tools" значение "Visual Studio 2017". Эта настройка находится здесь, как на скриншоте:
Screenshot


При решении очередной задачи тебе нужно извлечь проект из архива: Открыть решение. В решении будет два проекта: Project и Project.UnderTests. Делаешь второй проект активным. Запускаешь его с помощью сочетания клавиш Ctrl+F5.

Твоё задание состоит из двух частей:
  • Запустить проект с тестами Project.UnderTests с помощью сочетания клавиш Ctrl+F5. Пока что там только один левый тест.
  • Добавить тесты из задачи выше. Само решение задачи пока не нужно писать. Пусть будет просто заглушка.

Я начал добавлять. Добавь остальные тесты по аналогии. Запусти тесты. Покажи скриншот окна консоли с результатом запуска тестов.

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <gtest/gtest.h>
#include "Kata.h"
 
TEST(Kata, Test01)
{
    ASSERT_EQ(Kata::SequenceSum(2, 6, 2), 12);
}
 
TEST(Kata, Test02)
{
    ASSERT_EQ(Kata::SequenceSum(1, 5, 1), 15);
}
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
26.12.2018, 16:54  [ТС]
8Observer8,
Когда мы создали новую голову newPos, то раз она ещё не нарисована, то мы можем поработать с этой головой в update. К примеру, можно запустить цикл по всем текущим элементам змейки и проверить не совпадает ли по координатам хотя бы один из элементов змейки с newPos. Если совпадает, то значит мы врезались в свой хвост. Тогда можно как-то обработать эту ситуацию: поставить игру на паузу, вывести сообщение "Game Over. Press Enter to try again."
C++
1
2
3
4
5
6
7
8
9
for (auto it = ++snake.begin(); it != snake.end();)
        {
            int snakeX = (*it).x;
            int snakeY = (*it).y;
            if (newPos.x == snakeX && newPos.y == snakeY)
            {
                dirSnake = false;
            }
        }
Не работает данная логика.
0
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,030
Записей в блоге: 242
26.12.2018, 17:23
Цитата Сообщение от CyberGame Посмотреть сообщение
Не работает данная логика.
Конечно, не работает, ты написал бесконечный цикл.
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
26.12.2018, 17:49  [ТС]
8Observer8,
C++
1
2
3
4
5
6
7
8
9
for (auto it = ++snake.begin(); it != snake.end(); ++it)
        {
            int snakeX = (*it).x;
            int snakeY = (*it).y;
            if (newPos.x == snakeX && newPos.y == snakeY)
            {
                dirSnake = false;
            }
        }
Сейчас же всё должно работать, а он игнорирует условие.
0
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,030
Записей в блоге: 242
26.12.2018, 18:01
Цитата Сообщение от CyberGame Посмотреть сообщение
Сейчас же всё должно работать, а он игнорирует условие.
У меня срабатывает. Я поставил точку останова на строке:
C++
1
dirSnake = false;
Точка останова срабатывает, когда голова врезается в хвост.
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
26.12.2018, 18:22  [ТС]
8Observer8, кхм, она спокойно проходит через хвост.
0
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,030
Записей в блоге: 242
26.12.2018, 18:28
Цитата Сообщение от CyberGame Посмотреть сообщение
кхм, она спокойно проходит через хвост.
Скорее всего, проблема в логике. Я не понимаю, зачем тебе dirSnake. А условие срабатывает? То есть если поставить точку останова, то останавливается ли программа? Или ты не знаешь, как ставить точки останова? F9 - поставить/убрать точку останова.
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
26.12.2018, 18:36  [ТС]
8Observer8, Я же тебе говорил проблемы с отладчиком. Выше прочитай.
0
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,030
Записей в блоге: 242
27.12.2018, 00:37
Цитата Сообщение от CyberGame Посмотреть сообщение
Я же тебе говорил проблемы с отладчиком. Выше прочитай.
Я пропустил. В каком сообщении ты писал? Нужно справа кликнуть на (permalink), чтобы получить ссылку на сообщение.

Без отладчика очень плохо. Тогда попробуй добавить вывод в консоль, чтобы убедиться, что условие срабатывает:
C++
1
2
3
4
5
6
7
8
9
10
11
    bool dirSnake = true;
    for (auto it = ++snake.begin(); it != snake.end(); ++it)
    {
        int snakeX = (*it).x;
        int snakeY = (*it).y;
        if (newPos.x == snakeX && newPos.y == snakeY)
        {
            dirSnake = false;
            std::cout << "Hello" << std::endl;
        }
    }
Добавлено через 5 часов 42 минуты
Цитата Сообщение от 8Observer8 Посмотреть сообщение
CyberGame, допустим, программа остановлена на том моменте, когда змейка подошла вплотную к еде снизу. Мы находимся в начале функции update(), а перед нами еда. Опиши, по шагам, как происходит увеличение змейки на одну ячейку, которое увидит игрок после срабатывания draw()
Зря ты не описал алгоритм поедания еды и как увеличивается змейка. Я не знаю, понимаешь ли ты его до конца. В алгоритме есть хитрость, которую сложно сразу понять, тем более, что у тебя не работает отладчик и выполнение по шагам. Даже если ты понимаешь, то всё равно нужно пытаться объяснять, так ещё лучше понимаешь и запоминаешь. А если не до конца понимаешь, то есть очень слабо понимаешь, то тем более нужно объяснять.

Я приведу всю текущую логику игры:
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
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 xHead = snake.front().x;
    int yHead = snake.front().y;
 
    if (xHead == food.x && yHead == food.y)
    {
        Vector2i cell = { food.x, food.y };
        snake.push_back(cell);
 
        // Generate a new food
        food.x = getRandomInt(gameFieldSize);
        food.y = getRandomInt(gameFieldSize);
    }
 
    glutTimerFunc(250, update, 0);
    glutPostRedisplay(); // Draw all game objects
}
Хитрость поедания заключается в том, что хотя мы и добавляем элемент в конец хвоста змейки, но он через 250 милисекунд удаляется. Обрати внимание, что добавляется элемент в конец хвоста и при этом координаты его не меняются и равны координатам новой головы (и съеденой еды). Через 250 милисекунд после добавления элемента происходит очередной вызов update(). Новая голова генерируется впереди текущей головы, но удаляется последний элемент с неправильными координатами, который мы добавили в хвост на предыдущем игровом тике, но который имеет координаты совпадающие с координатами текущей головы (и старой еды).

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

Лучше доводить понимание до автоматизма, то есть до внедрения в долговременную память, делать знания навыками, которые уже не забудешь. Этого можно добиться только многократным регулярным повторением одних и тех же вещей, то есть продумыванием и написанием одних и тех же вещей. В идеале, ты должен будешь научиться создать новый проект и написать змейку с нуля из головы по памяти несколько раз, заглядывая только в документацию.
0
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,030
Записей в блоге: 242
27.12.2018, 17:58
В сообщении #281 не прикрепился архив: KataGTestCpp.rar
0
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,030
Записей в блоге: 242
27.12.2018, 20:29
C++
1
2
3
4
5
6
7
8
9
        for (auto it = ++snake.begin(); it != snake.end(); ++it)
        {
            int snakeX = (*it).x;
            int snakeY = (*it).y;
            if (newPos.x == snakeX && newPos.y == snakeY)
            {
                dirSnake = false;
            }
        }
Ты так и не объяснил, что за флаг dirSnake? Что ты придумал делать с этим флагом?

Добавлено через 25 минут
Тест
0
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,030
Записей в блоге: 242
28.12.2018, 23:54
Цитата Сообщение от 8Observer8 Посмотреть сообщение
Добавить тесты из задачи выше. Само решение задачи пока не нужно писать. Пусть будет просто заглушка.
Почему ты не сделал это задание? Возьми отсюда тесты: https://www.codewars.com/kata/... /train/cpp

И продолжи создавать тесты в проекте KataGTestCpp.rar, я уже два написал:

C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <gtest/gtest.h>
#include "Kata.h"
 
TEST(Kata, Test01)
{
    ASSERT_EQ(Kata::SequenceSum(2, 6, 2), 12);
}
 
TEST(Kata, Test02)
{
    ASSERT_EQ(Kata::SequenceSum(1, 5, 1), 15);
}
Скопируй сюда, что у тебя получилось, чтобы я понял, что ты понимаешь о чём я. Потом мы добавим тесты в змейку. Нужно будет убрать всё из main в класс Game. Нехорошо, когда в файле main.cpp весь код игры.
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
29.12.2018, 14:25  [ТС]
8Observer8, начал добавлять следующий тест. Ошибка.
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
#include <gtest/gtest.h>
#include "Kata.h"
 
TEST(Kata, Test01)
{
    ASSERT_EQ(Kata::SequenceSum(2, 6, 2), 12);
}
 
TEST(Kata, Test02)
{
    ASSERT_EQ(Kata::SequenceSum(1, 5, 1), 15);
}
TEST(Kata, Test03)
{
    ASSERT_EQ(Kata::basicOp('+', 5, 4), 9);
    
}
TEST(Kata, Test04)
{
    ASSERT_EQ(Kata::basicOp('-', 11, 8), 3);  
}
TEST(Kata, Test05)
{
    ASSERT_EQ(Kata::basicOp('*', 3, 4), 12);
}
TEST(Kata, Test06)
{
    ASSERT_EQ(Kata::basicOp('/', 16, 4), 4);
}
0
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,030
Записей в блоге: 242
29.12.2018, 15:15
Первыми двумя тестами ты тестируешь функцию SequenceSum из задачи: https://www.codewars.com/kata/... /train/cpp
C++
1
2
3
4
5
6
7
8
9
TEST(Kata, Test01)
{
    ASSERT_EQ(Kata::SequenceSum(2, 6, 2), 12);
}
 
TEST(Kata, Test02)
{
    ASSERT_EQ(Kata::SequenceSum(1, 5, 1), 15);
}
Определение функции SequenceSum() должно находится в файле "Kata.h", который ты подключаешь здесь:
C++
1
#include "Kata.h"
У тебя в каждом проекте должна быть одна задача. Ты зачем-то взял две задачи и стал объединять их в одном проекте. Один проект - одна задача.

Ты либо продолжи писать тесты для задачи SequenceSum, либо начни писать тесты для друнгой задачи basicOp. Какой вариант ты выбираешь?

Добавлено через 1 минуту
А что за новую задачу ты решил начать? Откуда basicOp? Можешь дать ссылку на неё?

Что у тебя сейчас в файле "Kata.h"?

Добавлено через 24 минуты
Скопируй сюда, что у тебя находится в файле "Kata.h". Всё его содержимое.
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
29.12.2018, 17:21  [ТС]
8Observer8,
А что за новую задачу ты решил начать? Откуда basicOp? Можешь дать ссылку на неё?
Как ты мне говорил?
Открываешь гугл, забиваешь название задачи. Например: basicOp Kata. Мне нашло https://www.codewars.com/kata/... /train/cpp .
Как мы эти тесты будем во змейки использовать?
Скопируй сюда, что у тебя находится в файле "Kata.h". Всё его содержимое.
Странно, но найти я его не могу.
Первыми двумя тестами ты тестируешь функцию SequenceSum из задачи: https://www.codewars.com/kata/... /train/cpp
Воу, и что мне заполнять это поочередно, это же долго. Есть другие методы?
Вот например
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Describe(Tests)
{
    It(ExampleTests)
    {
        Assert::That(sequenceSum(2, 6, 2), Is().EqualTo(12));
        Assert::That(sequenceSum(1, 5, 1), Is().EqualTo(15));
        Assert::That(sequenceSum(1, 5, 3), Is().EqualTo(5));
        Assert::That(sequenceSum(0, 15, 3), Is().EqualTo(45));
        Assert::That(sequenceSum(16, 15, 3), Is().EqualTo(0));
        Assert::That(sequenceSum(2, 24, 22), Is().EqualTo(26));
        Assert::That(sequenceSum(2, 2, 2), Is().EqualTo(2));
        Assert::That(sequenceSum(2, 2, 1), Is().EqualTo(2));
        Assert::That(sequenceSum(1, 15, 3), Is().EqualTo(35));
        Assert::That(sequenceSum(15, 1, 3), Is().EqualTo(0));    
    }
};;
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
29.12.2018, 21:17  [ТС]
8Observer8, на этом форуме, можно ли говорить на английском?
Я решил проблему с кодом. Теперь змейка останавливается если врезается.
Проблема была в том что, она сначала проверял входит ли новая голова в змейку, а только потом определял положение новой головы.
Вот код:
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
#include <GL/freeglut.h>
#include <iostream>
#include <string>
#include <list>
#include <ctime>
 
using namespace std;
 
bool dirSnake = true;
int lives = 3;
int score = 0;
 
const int gameFieldSize = 20;
 
int fieldWidth = 260;
int fieldHeight = 260;
 
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;
 
Vector2i food;
 
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;
    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));
    if (score >= 10)
    {
        drawText(gameFieldSize / 3, gameFieldSize / 2, "You win the game");
    }
    if (dirSnake == false)
    {
        drawText(gameFieldSize / 3, gameFieldSize / 2, "You lose the game");
    }
    drawFood();
    drawSnake();
 
    glutSwapBuffers();
}
 
int getRandomInt(int max)
{
    srand(time(0));
    return rand() % max;
    return 0;
}
 
void update(int value)
{
    if (score >= 10)
    {
        dirSnake = false;
    }
    if (dirSnake)
    {
        Vector2i newPos;
        int xHead = snake.front().x;
        int yHead = snake.front().y;
        if (xHead >= gameFieldSize)
        {
        snake.front().x = -1;
        }
        else if (xHead == -1)
        {
        snake.front().x = gameFieldSize;
        }
        else if (yHead >= gameFieldSize)
        {
            snake.front().y = -1;
        }
        else if (yHead == -1)
        {
        snake.front().y = gameFieldSize;
        }
 
        newPos.x = snake.front().x + snakeDir.x;
        newPos.y = snake.front().y + snakeDir.y;
        snake.push_front(newPos);
        snake.pop_back();
 
        for (auto it = ++snake.begin(); it != snake.end(); ++it)
        {
            int snakeX = (*it).x;
            int snakeY = (*it).y;
            if (newPos.x == snakeX && newPos.y == snakeY)
            {
                dirSnake = false;
                cout << "Warning" << endl;
            }
        }
 
        if (xHead == food.x && yHead == food.y)
        {
            score++;
            Vector2i cell = { food.x, food.y };
            snake.push_back(cell);
 
            // Generate a new food
            food.x = getRandomInt(gameFieldSize);
            food.y = getRandomInt(gameFieldSize);
        }
 
        glutTimerFunc(150, update, 0);
        glutPostRedisplay();
    }
    
}
 
void specialKeyHandler(int key, int x, int y)
{
    switch (key)
    {
    case GLUT_KEY_UP:
        if (snakeDir.y == 0) {
            snakeDir.x = 0;
            snakeDir.y = 1;
        }
        break;
    case GLUT_KEY_LEFT:
        if (snakeDir.x == 0) {
            snakeDir.x = -1;
            snakeDir.y = 0;
        }
        break;
    case GLUT_KEY_DOWN:
        if (snakeDir.y == 0) {
            snakeDir.x = 0;
            snakeDir.y = -1;
        }
        break;
    case GLUT_KEY_RIGHT:
        if (snakeDir.x == 0) {
            snakeDir.x = 1;
            snakeDir.y = 0;
        }
        break;
    }
}
 
void normalKeyHandler(unsigned char key, int x, int y)
{
    switch (key)
    {
    case 'w':
        if (snakeDir.y == 0) {
            snakeDir.x = 0;
            snakeDir.y = 1;
        }
        break;
    case 'a':
        if (snakeDir.x == 0) {
            snakeDir.x = -1;
            snakeDir.y = 0;
        }
        break;
    case 's':
        if (snakeDir.y == 0) {
            snakeDir.x = 0;
            snakeDir.y = -1;
        }
        break;
    case 'd':
        if (snakeDir.x == 0) {
            snakeDir.x = 1;
            snakeDir.y = 0;
        }
        break;
    default:
        cout << "This key is not used: " << key << endl;
        break;
    }
}
 
void setNewCoordSystem(int width, int height)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0f, gameFieldSize, 0.0f, gameFieldSize, 0.0f, 1.0f);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
}
 
int main(int argc, char** argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(fieldWidth, fieldHeight);
    glutCreateWindow("Snake");
    glutDisplayFunc(draw);
    glutTimerFunc(250, update, 0);
 
    glutKeyboardFunc(normalKeyHandler);
    glutSpecialFunc(specialKeyHandler);
 
    setNewCoordSystem(fieldWidth, fieldHeight);
 
    Vector2i head = { 4, 1 };
    snake.push_back(head);
    
    glutMainLoop();
    return 0;
}
Интересно, что делать дальше? Рефактором заниматься?
Название: Снимок.PNG
Просмотров: 59

Размер: 1.5 Кб
0
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,030
Записей в блоге: 242
29.12.2018, 23:23
Цитата Сообщение от CyberGame Посмотреть сообщение
Как мы эти тесты будем во змейки использовать?
Будем. Постепенно научимся и это будет легко. Но для полноценного использования TDD для змейки нужно будет дополнительно к GoogleTest подключить ещё GoogleMock. Я подключу, скину проект и постепенно переделаем проект со змейкой под GTest и GMock. А пока что нужно решать задачи с CodeWars, переписывая тесты в KataGTestCpp

Цитата Сообщение от CyberGame Посмотреть сообщение
Как ты мне говорил?
Открываешь гугл, забиваешь название задачи. Например: basicOp Kata.
Новую задачу искать нужно не так. Просто заходишь на https://www.codewars.com/ - тебе сразу предлагают задачу.

Давай пока что со старым заданием разберёмся. Я опишу пошагам, а ты напиши на каком шаге у тебя не получается:
  • Ты скачиваешь архив: KataGTestCpp.rar
  • Создаёшь папку с названием задачи, напирмер: sum-of-a-sequence и извлекаешь в неё архив
  • Переходишь по ссылке: https://www.codewars.com/kata/... /train/cpp
  • Оттуда переписываешь тесты в проект Kata.UnitTests в файл KataTests.cpp
  • Решаешь задачу в проекте Kata в файле Kata.h
  • Скидываешь посмотреть содержимое файла Kata.h проекта Kata и содержимое файла KataTests.cpp проекта Kata.UnitTests

Пока что нужна мне только задача, которую ты вроде решил: https://www.codewars.com/kata/... /train/cpp

Скинешь эту, а потом к новой перейдём.

Цитата Сообщение от CyberGame Посмотреть сообщение
Странно, но найти я его не могу.
Ты скачал архив, запустил файл с решением KataGTestCpp.sln и в нём ты видишь два проекта:
  • Проект Kata - это рабочий проект. В нём тестов нет. В нём только начало решения задачи в файле Kata.h (файл, который ты не смог найти)
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    #pragma once
     
    static class Kata
    {
    public:
        static int Kata::SequenceSum(int start, int end, int step)
        {
            return -1;
        }
    };
  • Kata.UnitTests - это проект с тестами. В нём есть файл KataTests.cpp, в котором нужно писать тесты:
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    #include <gtest/gtest.h>
    #include "Kata.h"
     
    TEST(Kata, Test01)
    {
        ASSERT_EQ(Kata::SequenceSum(2, 6, 2), 12);
    }
     
    TEST(Kata, Test02)
    {
        ASSERT_EQ(Kata::SequenceSum(1, 5, 1), 15);
    }
0
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,030
Записей в блоге: 242
29.12.2018, 23:33
Цитата Сообщение от CyberGame Посмотреть сообщение
8Observer8, на этом форуме, можно ли говорить на английском?
Yes, we can. Let's try. Forums rules does not forbid Enlish language. It is an official language like Russian:
Официальными языками форума являются русский и английский языки. Размещение сообщений на других языках запрещено.
Nice idea. We will rewrite our Snake Game with TDD and Google Mock after holiday. I need to go to a village. I will return in 2 or 3 days. I will go tomorrow on 1:00 pm.

Happy New Year!
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
30.12.2018, 18:44  [ТС]
8Observer8,
Okey,
and you "Happy New Year!"

Добавлено через 4 часа 32 минуты
8Observer8,
How can import game, to my friends can play it's game?
0
9949 / 2950 / 497
Регистрация: 05.10.2013
Сообщений: 8,030
Записей в блоге: 242
02.01.2019, 15:00
Цитата Сообщение от CyberGame Посмотреть сообщение
How can import game, to my friends can play it's game?
You can build your game to an executable file (.exe). You need to select "Release" in VS.

Please, install Git and register on GitHub. I will show you some commands that will make our team-work more comfortable.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.01.2019, 15:00

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
300
Ответ Создать тему
Новые блоги и статьи
[golang] Pipeline
alhaos 08.06.2026
Pipeline Pipeline — паттерн конкурентной обработки данных в Go. Суть: данные проходят через цепочку независимых стадий, каждая из которых работает в своей горутине и общается с соседями через. . .
Свет внутри себя
kumehtar 07.06.2026
Пусть это будет здесь lIs4oanZS9Y
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru