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

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

Спасибо. Кстати подобные способы разнообразить вывод в консоли частенько помогают сделать дамп например 3д модели в собственном формате в видее структур, нод.
Особенно когда однотипной информации много и удобство листинга лишним не будет.

Ну а зачем при таком низкоуровневом использовании консоли использовать потоковые функции? Логичнее и быстрее использовать WriteConsoleA. А сама Microsoft приводит пример кода ClearScreen через ScreenBuffer - можно было и у них взять.

Что бы было переносимо, предположу.

_kbhit() и _getch уже не переносимы, собственно остальные функции по работе с консолью тоже

и даже больше - потоковые функции не гарантируют мгновенный вывод в терминал, так что это все работает без flush только на удаче

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

Только я хотел написать, что бабочка - это насекомое, а не животное, а оказалось — таки да, 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. Так, на мой взгляд, код выглядит более читабельным.

Так вот как вы выглядите))) А я сижу потом и не понимаю, зачем питониста за С++ проект пустили))) \sarcasm_off

Статические анализаторы ругаются на такое и gcc

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

Публикации

Истории