Utf-8 в Utf-16 или игра "Угадай слово"
При запуске эта учебная консольная игра описывает себя так:
const wchar_t* LOGO = LR"(Игра "УГАДАЙ СЛОВО" /// 1. Предлагается 5 раундов, в каждом из них загадывается новое слово. | /// 2. В каждом раунде предлагается несколько попыток на открытие букв. | /// 3. Затем Вы можете угадать слово целиком. | /// 4. Если слово не угадано, то Вы проиграли раунд. | /// 5. По итогам 5 раундов окончательно определяется победитель. | )";
То есть, не совсем "Поле чудес" и для одного игрока.
Полезного в коде, собственно, метод
bool Utf8ToUtf16(std::string const& src, std::wstring& dst)
, конвертирующий строку Utf-8 (в этой кодировке сохранён файл словаря) в "родную" для Windows Utf-16, с которой работает наше консольное приложение.
Словарь не "вылизан", хотя 10000+ проверенных слов там есть.
Проект компилировался в актуальной сборке Visual Studio 2019 в стандарте C++17 для платформы x64.
Скачать проект в архиве .zip, развернуть в новую папку (43 Кб)
скриншот приложения в работе (фрагмент окна консоли)
В реальном приложении словарь можно "зашифровать", например, заменой символов, как в этом образце, заодно показывающем работу с консолью в UTF-16 (только для Windows + MS Studio).
#include <iostream> #include <string> #include <windows.h> #include <corecrt_io.h> #include <fcntl.h> int main () { _setmode(_fileno(stdout), _O_U16TEXT); _setmode(_fileno(stdin), _O_U16TEXT); _setmode(_fileno(stderr), _O_U16TEXT); std::wstring s, r; std::wcout << L"Введите строку: "; std::getline(std::wcin, s); ::CharUpperW(s.data()); r.resize(s.size()); std::wstring alphabet(L"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"); std::wstring cypher (L"ГМНОАЕЖКЙБВДЗИЛТПРФХСУЦЧЪШЩЫЬЭЯЮ"); //Кодируем и выводим: for (size_t i = 0, p; i < s.size(); ++i) { if ((p = alphabet.find(s[i]))!= std::wstring::npos) r[i] = cypher[p]; else r[i] = s[i]; } std::wcout << L"Coded: [" << r << L"]\n"; //Очищаем исходную строку: s.clear(); s.resize(r.size()); //Декодируем и выводим: for (size_t i = 0, p; i < s.size(); ++i) { if ((p = cypher.find(r[i])) != std::wstring::npos) s[i] = alphabet[p]; else s[i] = r[i]; } std::wcout << L"Encoded: [" << s << L"]\n"; return 0; } /* Введите строку: Привет, волк! Coded: [ТПЙНЕФ, НЛДВ!] Encoded: [ПРИВЕТ, ВОЛК!] */
18.03.2024, 19:18 [160 просмотров]