БлогNot. Utf-8 в Utf-16 или игра "Угадай слово"

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 просмотров]


теги: программирование учебное игра c++ windows textprocessing

К этой статье пока нет комментариев, Ваш будет первым