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

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

08.11.2018, 09:25. Показов 19965. Ответов 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
9953 / 2954 / 497
Регистрация: 05.10.2013
Сообщений: 8,075
Записей в блоге: 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
9953 / 2954 / 497
Регистрация: 05.10.2013
Сообщений: 8,075
Записей в блоге: 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
9953 / 2954 / 497
Регистрация: 05.10.2013
Сообщений: 8,075
Записей в блоге: 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
9953 / 2954 / 497
Регистрация: 05.10.2013
Сообщений: 8,075
Записей в блоге: 242
26.12.2018, 18:28
Цитата Сообщение от CyberGame Посмотреть сообщение
кхм, она спокойно проходит через хвост.
Скорее всего, проблема в логике. Я не понимаю, зачем тебе dirSnake. А условие срабатывает? То есть если поставить точку останова, то останавливается ли программа? Или ты не знаешь, как ставить точки останова? F9 - поставить/убрать точку останова.
0
208 / 95 / 15
Регистрация: 27.07.2018
Сообщений: 323
26.12.2018, 18:36  [ТС]
8Observer8, Я же тебе говорил проблемы с отладчиком. Выше прочитай.
0
9953 / 2954 / 497
Регистрация: 05.10.2013
Сообщений: 8,075
Записей в блоге: 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
9953 / 2954 / 497
Регистрация: 05.10.2013
Сообщений: 8,075
Записей в блоге: 242
27.12.2018, 17:58
В сообщении #281 не прикрепился архив: KataGTestCpp.rar
0
9953 / 2954 / 497
Регистрация: 05.10.2013
Сообщений: 8,075
Записей в блоге: 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
9953 / 2954 / 497
Регистрация: 05.10.2013
Сообщений: 8,075
Записей в блоге: 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
9953 / 2954 / 497
Регистрация: 05.10.2013
Сообщений: 8,075
Записей в блоге: 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
9953 / 2954 / 497
Регистрация: 05.10.2013
Сообщений: 8,075
Записей в блоге: 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
9953 / 2954 / 497
Регистрация: 05.10.2013
Сообщений: 8,075
Записей в блоге: 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
9953 / 2954 / 497
Регистрация: 05.10.2013
Сообщений: 8,075
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru