Комментарии 19
Странный способ завлечь на "профессию: C++ разработчик" кодом, за появление которого в продукте автора погонят на улицу с огромной вероятностью.
Интерес здесь пробуждается не кодом, а головоломкой, вызовом, ведь начать карьеру со сложного CPP — это значит ответить на вызов, захотеть разбираться в языке. При этом автор честно предупреждает, что код далёк от идеала; мы со своей стороны указываем хаб «Ненормальное программирование», а «Программирование», конечно, не указываем
Если ты умеешь бегать, прыгать, ездить на роликах, коньках, велосипеде, мотоцикле - это хорошо. Если ты при этом умеешь падать - это отлично. Но ты специально не будешь падать. Умея падать ты рефлекторно понимаешь технику падения и твой навык езды только улучшается (лучше и легче избегаешь падений, как физически так и психологически - не боишься их). Поэтому - полезное упражнение.
Не соглашусь, т.к. аналогия плохая.
Уроки на роликах начинаются с обучения падению т.к. это мало зависящее от твоего сознательного поведения событие (по крайней мере, первое время). Можно сказать, вырабатывают рефлекс и это вынужденная мера.
А вот показывать плохой пример новичку в программировании и объяснять его это примерно как учить кататься на роликах с падением на лицо. Это не вынужденная мера - давать странный код и долбанутых заказчиков джуну никто не будет.
Если вы почуствовали что падаете, отведите плечи и руки за спину, выпрямите и напрягите тело, подайте лицо вперед. И как это необычно, а главное - вы сэкономили почти на всей экипировке, потому что при этом стиле торможения она вам не нужна! Мы научим вас кататься на роликах!
Да, новичок должен прочувствовать что падать больно. Должен прочувствовать, что отладка, сопровождение, наращивание функционала в таком коде боль. Поэтому именно с завязанными руками лицом вперед. Поднялся, отряхнулся, и выслушал фразу "а вот теперь используй все возможности своего тела (мозга), чтобы больше не было больно".
Я понимаю что это перевод и автор моего комментария тут не увидит..
Но если уж хочется себя чем-то ограничить и взять на себя челлендж - так уж лучше написать эту змейку на ассемблере. Причем не для современных процессоров с новомодными 64-битными (и шире!) регистрами в количестве до 30 штук, а для, скажем, x86-32 процессора в реальном режиме с прямым доступом к видеопамяти. Звучит сложно, но, на самом деле, не так уж тяжело в реализации.
Игры для Радио 86рк были на ассемблере. В том числе и змейка.
В детстве писал змейку для Корвета на асемблере. Правда не графикой, а символами. Ничего сложного вообще не было в этом. По моему был в классе 9-м. А писал код в тетрадке, сам транслировал в HEX-коды и уже их вбивал в файл на исполнение. Было весело!
для, скажем, x86-32 процессора в реальном режиме с прямым доступом к видеопамяти.
Сложным это может звучать только для никогда не писавшего лабораторок на ассемблере под DOS. Прямая запись в видеопамять вместо работы через прерывания всё только упрощает.
Что то ну очень замудреный алгоритм. Чем плох алгоритм со временем жизни ячеек?
Hidden text
![](https://habrastorage.org/getpro/habr/upload_files/0d0/926/35d/0d092635dcfacf6a956f80aa1f1e640c.png)
Максимальное значение - это длина, а его координаты - голова змейки.
Каждую итерацию проходимся по всем ячейкам и уменьшаем их значение на единицу. Затем в зависимости от направления движения змейки, в следующую ячейку записываем значение равное длине змейки.
По сути получается нужны только массив данных, длина змейки и текущие координаты головы.
можно даже запихнуть координату головы в одну переменную
Да можно еще и длину, и еще чего нть, например переменную цикла обхода клеток(если обычный for используется, а не foreach). Ну а что, как и у автора: те же 4 байта, только не по отдельности по разным переменным, а в одну все запихано.
vars
— это32
-битное целое число, в котором будут храниться следующие данные:
#define s_exit(e) do { endwin(); exit(e); } while(0);
Что это за белиберда?
Вся идея идиомы do { ... } while(0)
в макросах критически основана на том, что в самом макросе ни в коем случае не должно быть ;
после while (0)
. Кто и зачем влепил туда эту ;
?
Если у автора это "работает" в коде, значит ему вообще не нужна была эта идиома. Можно было пользоваться просто парой { ... }
. Зачем он слепо вставлял в свои макросы все это do { ... } while(0)
?
Это просто классический пример карго-культа: где-то в чьих-то макросах увидел это do { } while(0)
и слепо повторяет, совершенно не понимая, зачем все это делается и как это должно работать.
Лайк за ненормальное программирование!
---
#define s_tog(b) (map^=(1<<(b))) // переключает в map бит b (сейчас не используется)
#define s_set_0(b) (map&=~(1<<b)) // устанавливает бит b в map в 0
В одной из этих строчек ошибкоопасный код :)
Вопрос к автору кода, почему. Было лень копипастить, руками набрал и кое-что забыл?
Технически, можно написать и с одной переменной, если это будет объект.
Я с ребенком на питончике не так давно рисовал консольную змейку, из переменных там кольцевой буфер с координатами змеи и направление по Х и У. При движении просто в кольцевом буфере появляется голова и отгрызается хвост, а при кушании яблока хвост остается на месте. Кода было строк пятнадцать.
Как написать «Змейку» в четыре переменные?