Комментарии 26
Спасибо. Кстати подобные способы разнообразить вывод в консоли частенько помогают сделать дамп например 3д модели в собственном формате в видее структур, нод.
Особенно когда однотипной информации много и удобство листинга лишним не будет.
Ну а зачем при таком низкоуровневом использовании консоли использовать потоковые функции? Логичнее и быстрее использовать WriteConsoleA. А сама Microsoft приводит пример кода ClearScreen через ScreenBuffer - можно было и у них взять.
Не буду придираться к содержимому и целеполаганию такого поста, но длинные листинги лучше сразу прятать в спойлеры.
Только я хотел написать, что бабочка - это насекомое, а не животное, а оказалось — таки да, animals.
Кстати, для того чтобы снабдить консольное приложение интерфейсом, можно Nuklear воспользоваться. Это очень лекговесная и простая штука, но там можно много чего сделать.
Или ImGui. Он как раз на C++ написан, в отличие от nuklear, который на си.
Буду знать.
#include <windows.h> - это библиотека для ...
Это не библиотека, а заголовочный файл (то же касается и conio.h и других #include).
Конструкцию с многократным } else if (attemptsLeft == ...) {
в функции printHangman()
стоило бы заменить на switch , то же касается проверки переменной key в функции ChooseWord()
. Причем во втором случае, из за отсутствия веток else, проверка условия равенства у Вас продолжается даже после нахождения совпадения.
Кстати, а в чём смысл оборачивать циклы for в фигурные скобки?
{ // я про эти
for(int m = 19; m < 26 ;m++)
{
SetXY(m,6); cout <<"_";
}
}
Для порядка:)
Не заметил, что комментарий создался фигово:
{
for(int m = 6; m < 14; m++)
{
SetXY(15,m); cout <<"*";
}
}
{
for(int m = 6; m < 14; m++)
{
SetXY(30,m); cout <<"*";
}
}
Не понятно, только, для какого порядка. Или это была шутка?
UPD: хабр заглючил, у меня предыдущий коммент был в одну строку, я поэтому новый создал.
Даже не знаю, когда-то начал писать так, и это вошло в привычку.
На будущее: лучше так не делать, потому что так никто не пишет.
Я так пишу
Можно узнать зачем? Я такого стиля ни разу не видел до этой статьи и, честно, не вижу ни одной причины так писать. Это усложняет чтение и заставляет читающего думать, зачем автор добавил пару лишних скобок
Кстати, а в чём смысл оборачивать циклы for в фигурные скобки?
Бывает, некоторым платят именно за количество строк кода. ;) В данном случае можно теоретически даже как-то так уплотнить:
void Walls()
{
SetColor(Blue , Black);
for(int m = 6; m < 14; m++){SetXY(15,m);cout<<"*"; SetXY(30,m); cout<<"*";}
for(int m = 15; m < 31;m++){SetXY(m,5); cout<<"*"; SetXY(m,14); cout<<"*";}
}
Но обычно в любой более-менее приличной компании у команды есть сложившиеся гайдлайны на форматирование, надо просто им следовать.
Я не настоящий C++ программист, но пару вопросов к коду при прочтении возникло.
"word = wordsA[rand() % wordsA.size()]". В этой строке мы выбираем случайный элемент вектора, номер которого равняется делению псевдослучайного числа на длину вектора.
% - это оператор взятия остатка от целочисленного деления, не просто деления.
rand() % wordsA.size() - насчет UB не скажу, но, лично для меня, такая конструкция при индексировании массива выглядит угрожающе (выход за границы массива 99,9% не произойдет, но таки вдруг).
if (key == 27) // 27 - ASCII-код клавиши "Esc"
Если Вы активно пользуетесь WinAPI тогда может удобней будет пользоваться кодами виртуальных клавиш самой Windows? Подключения доп.заголовкапри этом не требуется, раз подключен windows.h.
if (key == VK_ESCAPE) // 27 - ASCII-код клавиши "Esc"
P.S. Сам готов к конструктивной критике моего комментария :)
rand() % wordsA.size() - насчет UB не скажу, но, лично
для меня, такая конструкция при индексировании массива выглядит
угрожающе (выход за границы массива 99,9% не произойдет, но таки вдруг).
С чего бы ему произойти? Результат же будет лежать в интервале [0; wordsA.size() - 1]
А про коды клавиш верно заметили
Результат же будет лежать в интервале [0; wordsA.size() - 1]
Я с этим не спорю. Заработался и мне померещилась ситуация, когда компилятор оптимизирует wordsA.size() в какое-то число и будет подставлять его вместо вычисления заново даже если размер массива был уменьшен.
Типа такого
std::vector <std::string> words = { "Один", "Два", "Три"};
/* какой-то код */
// вычислили words.size() = сохранили как 3
std::cout << words[rand() % words.size()] << std::endl;
// удалили элемент, теперь размер = 2
words.pop_back();
/* какой-то код */
// компилятор вместо вычисления words.size() все равно ставит 3
std::cout << words[rand() % words.size()] << std::endl;
Прошу прощения за этот бред :)
Вместо си-шных логических операторов &&
, ||
и !
в C++ можно использовать соответственно and
, or
и not
. Так, на мой взгляд, код выглядит более читабельным.
Максимально простая игра на C++ (в консоли)