Как стать автором
Обновить

Комментарии 28

"К счастью там же еще описана функция FlushConsoleInputBuffer, которая удаляет все непрочитанные накопленные события. Сочетание этих двух функций позволит добиться нужного эффекта."


Это очень опасный подход. Он создает пусть и очень короткий (но на самом деле недетерменированый из-за того, что ОС может приостановить исполнение вашей программы в любой момент) отрезок времени между вызовами Peek и Flush, в течении которого ваша программа будет игнорировать любые события.


Правильный неблокирующий подход с моей точки зрения должен состоять в использовании Peek + ReadConsoleInput и обработки тех событий, которые вернул Read, до тех пор, пока Peek показывает, что Вас ждут сообщения.

Полностью согласен. Спасибо за уточнение.

Согласен, есть еще GetNumberOfConsoleInputEvents.
А так же хэндл консоли можно передать в Wait-функции.


Подходит с Peak+Read мне не нравится двойным копированием данных.(мелочь конечно… но все же)

Ну не знаю. Смысла мало в этом имхо. Изучение C++ и программирование? Тут скорее борьба с системой, как под конкретной операционной системой сделать те или иные вещи. Человек скорее концентрируется не на программировании, а на гуглении решений на стэковерфлоу. Программирование игр, ну может быть, но опять же все тонет в куче системного кода.


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


Повезло, что студент попался интересующий, один из скольких? Может он станет кем то, но лично мне его жаль. Да и у остальных наверное до сих пор волосы дыбом.

Так с готовым движком утонешь в накликивании сцены, поиске ассетов и сборке вот этого всего в кучу. Борьба в целом будет такая же, но не с операционной системой, а с движком. И в этой борьбе точно так же будет использовать SO.
Конкретно в этом случае я взял борьбу с ОС на себя, а студенту ставлю более высокоуровневые задачи на логику самой игры.


Студент способный и интересующийся. Только поэтому я с ним в эти дебри и полез. К менее способным другой подход.

Плох тот программист, который не знает на уровень-два ниже, чем в обычной жизни программирует. Кому-то же нужно уметь и эти самые «готовые» движки писать.

Впрочем, в этой статье не вижу каких-то деталей типа работы с DirectX/OpenGL/Vulkan. Это скорее общее замечание, что возня с близким к системе кодом имеет смысл для обучаемых.
А что у Вас с загрузкой процессора при запуске данной программы? Мне кажется не стоит «молотить» бесконечный цикл ввода по кругу, иногда можно и отдохнуть оператором sleep.

Загрузка процессора чудовищна для такой простой логики.
Ваша рекомендация очень полезна.

У меня в уриверсите преподователь тоже игры учил делать, и тоже на С++. В первом симестре мы просто изучали С++ и походу изученя делали программку которая в двумерном масиве 10на10 искала куда поставить фигуру Х или О. А в конце симестра преподователь устроил турнир среди наших прорамм! Да, это игра пять в ряд. Вот это было захватывающе и супер интерестно. А во втором симестре началось ООп и мы делали игру на ВиндоусФормс

По запросу "с++ rand" и "cpp rand" можно найти довольно много материалов. Например обширную статью на русском https://en.cppreference.com/w/cpp/numeric/random/rand и чуть более сухую на английском https://en.cppreference.com/w/cpp/numeric/random/rand

Вообще-то, то что вы нашли — это не "С++ rand", а унаследованный из Си. ГПСЧ для C++ ищется по ключевым словам "c++ random number generator", и прочитать про него можно тут: https://en.cppreference.com/w/cpp/numeric/random

Да, вы правы. В плюсах сейчас существует другой генератор, о котором я тоже упомянул.

Си++ я в статье не увидел, увидел Си, немного винапи, и использование пары функций из STL.
Зачем вы вставляете код картинками? Это не приведёт к желаемому вами результату.


Мы в универе писали простейшие игры в качестве лабораторных. Одна из лаб была сделать игру в текстовом режиме — фигачили через видеопамять (под дос, понятное дело). Помню я сделал аналог space invaders, жаль исходников не сохранилось.

Как вы тогда представляете написание игры именно на C++?


Зачем вы вставляете код картинками? Это не приведёт к желаемому вами результату.

Откуда вы знаете, какой именно результат у меня желаемый?


Мы в универе писали простейшие игры в качестве лабораторных. Одна из лаб была сделать игру в текстовом режиме — фигачили через видеопамять (под дос, понятное дело). Помню я сделал аналог space invaders, жаль исходников не сохранилось.

Это очень круто. Как думаете, чему вас это научило?


Я, кстати, пробовал начать с SDL.dll, но студент в нем утонул, несмотря на то, что мы шли по туториалам. Там очень много новых функций и всякого оформления приходится делать. Системного кода на порядок больше, чем получается в случае с WinAPI.

ООП подход весьма существенно отличается от процедурного. У вас как раз процедурный, так что вопрос тот же: а причем тут C++?
Код примитивный с "магическими" константами, с логическими ошибками, абсолютно ненаглядный и, более того, прибит гвоздями к конкретной платформе. Думаю, что для обучения должен быть иной подход.
Про скриншоты IDE ("защита" от копипасты кода?) уже намек дали.
Статья уровня местного форума или локального бложика, но никак не для хабра.

Вопрос в том, почему не применил ООП?
Потому что статья рассчитана на тех кто только-только освоил синтаксис уровня C. Читай: школьников и студентов. Более продвинутые читатели сами придумают абстракции, в которые это все можно обернуть.


Код примитивный с "магическими" константами, с логическими ошибками

Что конкретно не так с тем, что код примитивный? У меня нет цели понравиться вам и написать код уровня Senior C++. У меня цель — сделать материал для студентов, которые находятся на определенном этапе обучения. Как минимум для одного ученика мои примеры были достаточно наглядны.


Думаю, что для обучения должен быть иной подход.

Какой? Много вы людей со своим подходом обучили?


прибит гвоздями к конкретной платформе

Что конкретно дает кроссплатформенность студентам, изучающим основы программирования?

Вопрос в том, почему не применил ООП?
Потому что статья рассчитана на тех кто только-только освоил синтаксис уровня C. Читай: школьников и студентов. Более продвинутые читатели сами придумают абстракции, в которые это все можно обернуть.

Тогда не нужно писать про C++, потому что его идея именно в абстракциях.

Что конкретно не так с тем, что код примитивный?

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

Какой? Много вы людей со своим подходом обучили?

Нет никакого «моего» способа. И штамп «сперва добейся» здесь не работает.
Если вы чему-то хотите научить (и тем более C++), то нужно сперва показать основы абстракций, как из них составлять логические цепочки, получая в конце концов единое целое, в котором, тем не менее, можно заменить любой компонент без ущерба целостности. И, что немаловажно, код должен быть понятным и читаемым.

Что конкретно дает кроссплатформенность студентам, изучающим основы программирования?

Вы, должно быть, шутите? А если не шутите, то, выражаю надежду, что вы пересмотрите свои взгляды.

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


Если вы чему-то хотите научить (и тем более C++), то нужно ...

У меня нет цели обучить всему C++ в одной статье.
Цель статьи — показать решение вполне конкретных проблем, которые могут возникнуть.


Вы действительно хотите от каждой статьи о C++ разжевывания всех концепций с начала до конца?


Что конкретно дает кроссплатформенность студентам, изучающим основы программирования?

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

Про логические ошибки выше вам написали (бесконечные циклы с загрузкой процессора в top, неверное применение системной функции и т.д.). К чему мне повторяться?
Нечитаемость очевидна. Мало того, что простыня кода, так еще и скриншотами оформленная.

Вы действительно хотите от каждой статьи о C++ разжевывания всех концепций с начала до конца?

У вас логический парадокс. Если статья для новичков, то в ней и должны быть основы для новичков. Если статья для «бывалых», то и оформлена она должна быть соответствующе.
В данном случае новичкам здесь не будет понятно ни шиша, а знающие ничего не почерпнут.
Здесь не юмористический портал, где «миллионы мух», а портал для профессионалов и они вам оценку поставили. Полагаю, следовало бы сделать выводы.

Что конкретно дает кроссплатформенность студентам, изучающим основы программирования?


Возможность выбора. Очевидно же.
Возможность выбора. Очевидно же.

Какого выбора и зачем?
Кроссплатформенность это дополнительная сложность. Любая дополнительная сложность требует дополнительного объяснения. Сколько времени нужно будет посвятить объяснению кроссплатформенность и что это даст человеку на озвученном мною этапе обучения?


Здесь не юмористический портал, где «миллионы мух», а портал для профессионалов и они вам оценку поставили. Полагаю, следовало бы сделать выводы.

Знаете, вы правы. Надо попробовать на Пикабу выложить.
Вы, между прочим, могли бы рецензию написать отдельной статьей и по полочкам все разложить. Чтобы действительно была польза не только мне, а вообще всем.
А с вашими критериями оценки статей, вам останется только Хабр со статьями про клещей, выгорание и политику.

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

Действительно. Столько всего разного вокруг и так все сложно. Виндовс, линуксов целый зоопарк, макоси. Еще и для смартфонов целый пакован осей напридумывали. Буду прогать под венду, а остальные пусть мучаются — сами виноваты.

Знаете, вы правы.

Ну и славно. :-)
Наверное на С++ нужно создать абстракции, например, Screen или Window. Внутри спрятать весь вывод, закадровый буфер (если есть) и вообще всё рисование. Создать объект абстрактный Input, а к нему, например, добавить наследников InputKeyboard, InputJoystick, InputMouse. Ну, и ко всему этому уже прикручивать игровые сущности — Player, Map, Item, Unit, на что фантазии хватит.
Многое зависит от того, чего изучать. Если изучать введение в программирование под Windows, то ваш подход годится. А если уже на С++ замахнулись, то предполагается что основы всем известны и больше внимания надо уделять проектированию, декомпозиции и т.д. В целом сейчас WinAPI редко где можно встретить, кроссплатформеность важнее и формошлёпство востребовано.
P.S. GetTickCount(), GetKeyboardState(), GetAsyncKeyState() вам в помощь.
А если уже на С++ замахнулись, то предполагается что основы всем известны и больше внимания надо уделять проектированию, декомпозиции и т.д.

Кем предполагается?
Штука в том, что студенты, а также их родители, вообще не в курсе вот этих тонкостей между C и C++. Они не осознают концепции, которые составляют разницу.
Они приходят и говорят: хотим изучать C++, но вообще ничего не знаем и IDE в глаза не видели. Мне им теперь объяснять чем C++ от C отличается? Без толку. Я понял их цели и даю материал который позволит достичь цели.

А чего не воспользовались обычным curses?
Борьба с winapi, обилие кривых непортабельных решений — зачем?

Я во время поисков натыкался на упоминание curses. Насколько я понял, эта библиотека не входит в стандартную поставку MSVS. Так сложилось, что занимались мы с MSVS. Переходить на другую IDE не было причин, а добавлять дополнительную зависимость в MSVS — боль. Уже наелись такой с SDL.dll.

Честно скажу, к msvs его не подключал. Но к Dev-cpp (просто первая попавшаяся IDE под винду, которую нашел для теста) подключилось без проблем. Если хотите, могу поискать тем на форуме, где был пример с этим.
Ну, что к линуксу оно подключается вообще элементарно, можно не говорить.
Как бы то ни было, уж лучше освоить несколько функций более-менее стандартной библиотеки, в которой уже решены многие проблемы, чем долго и упорно бороться с winapi. Если что, там и атрибуты текста (цвет, подчеркивание и т.п.) поддерживается, и мышка, и неблокирующий ввод, и даже окна.
Мне еще любопытно, почему вам минус поставили.

Понятия не имею, это не я :)
Да curses не входит в стандартную библиотеку.
Лично я бы именно ее рекомендовал студентам для написания консольных игр.
Хотя все зависит и от студента, возможно если студент раньше программировал в школе на pascal и с С/С++ он только начал разбираться, conio.h с его kbhit() и getch() это наверное первое что приходит в голову для написания консольных игр под Windows.
через vcpkg pdcurses ставится без особых проблем, так что не все дополнительные зависимости это боль.

ну и простой пример кода по передвижению быквы X работает.
#include <curses.h>

int main()
{
	initscr();
	curs_set(0);
	noecho();
	keypad(stdscr, TRUE);

	int x = 5;
	int y = 5;

	for (;;)
	{
		mvprintw(y, x, "X");

		int ch = getch();
		if (ch == KEY_DOWN)  y++;
		if (ch == KEY_UP)    y--;
		if (ch == KEY_LEFT)  x--;
		if (ch == KEY_RIGHT) x++;

		clear();
		refresh();
	}
	endwin();
}


единственное, да добавляется много новых функций самой библиотеки. но на просторах интернета вполне много туториалов как использовать данную библиотеку.

Мне еще любопытно, почему вам минус поставили. Это из за предложения curses?
Если так, то почему именно это плохая идея?

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории