- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
#include <iostream>
#include <ctime>
#include <random>
#include <windows.h>
#include <cstdint> // Для int8_t;
#include <string>
#include <string_view>
#include <array>
#include <iomanip> // setw();
using namespace std;
const array <string, 94> arr = { "олицетворение", "патология", "субтропики", "лекарь", "предосторожность", "монархист",
"социум", "клякса", "борщевик", "лемур", "старьевщик", "марсельеза", "послушание", "прикол", "шифровка", "фантом", "субмарина",
"гладиолус", "сообщество", "гениальность", "трансформация", "пальпация", "усушка", "благополучие", "капелла", "недоумение",
"траверс", "проныра", "полоскание", "побережье", "закись", "кровопиец", "сыродел", "продвижение", "совместимость", "двойственность",
"сабботаж", "рассылка", "куратор", "прорицание", "синтез", "негодяй", "паралич", "тяжелоатлет", "освободитель", "кунжут",
"мордобой", "ностальгия", "хлорофилл", "первооткрыватель", "гипотенуза", "шкатулка", "психиатр", "маэстро", "прыть",
"пустомеля", "здравоохранение", "алиментщик", "параметр", "аннотация", "пудинг", "прыжок", "пневматика", "штырь", "фасовщик",
"совместитель", "свиновод", "яйцеварка", "зверобой", "тундра", "вогнутость", "рикошет", "компромисс", "фоторепортер",
"кордебалет", "нумизмат", "гипербола", "желтизна", "брезент", "ботфорты", "гостинец", "символист", "акустика", "психика",
"удивление", "уховертка", "снежинка", "меценат", "атомоход", "контрабас", "брюква", "миловидность", "спринтер", "пунктир" };
int randNumber(int min, int max)
{
random_device rd; //Will be used to obtain a seed for the random number engine
mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
uniform_int_distribution<int> distrib(min, max);
return distrib(gen);
}
string_view randString()
{
return (string_view)arr[randNumber(0, arr.size())];
}
void printGuessedChar(string_view input, string_view randWord)
{
for (int i = 0; i < randWord.size(); ++i)
{
for (int j = 0; j < input.size(); ++j)
{
if (randWord[i] == input[j])
{
cout << randWord[i];
break;
}
}
cout << '*';
}
cout << endl;
}
int randNumber(int min, int max)
{
random_device rd; //Will be used to obtain a seed for the random number engine
mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
uniform_int_distribution<int> distrib(min, max);
return distrib(gen);
}
void theGame()
{
cout << "Добро пожаловать в игру 'Виселица'!" << endl;
string_view randWord = randString();
cout << "Компьютер сгенерировал слово" << endl;
cout << "Слово - ";
for (int i = 0; i < randWord.size(); ++i)
{
cout << '*';
};
cout << endl;
int8_t count = 0;
string input;
do
{
cout << "У вас " << 6 - count << " попыток угадать слово." << endl << "Введите букву: ";
if (cin.fail()) // если предыдущее извлечение оказалось неудачным,
{
cin.clear(); // то возвращаем cin в 'обычный' режим работы
cin.ignore(32767, '\n'); // и удаляем значения предыдущего ввода из входного буфера
}
cin >> setw(1) >> input[count];
printGuessedChar(input, randWord);
++count;
} while (count != 6);
}
int main()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
srand((unsigned)time(nullptr));
theGame();
}
Заколебался уже с этим кодом. Не получается впихнуть пользовательский ввоз в массив...Первая попытка освоить std::string и std::string_view. Ну и в целом советы по коду приветствуются. Благодарю
//Давайте напишем популярную игру, которая называется «Виселица».В игре вам нужно угадать слово, которое загадала программа, буква за буквой.
//Игрок угадывает одну букву за раз и может ошибиться только 6 раз(после этого он проигрывает).
//Необходимый функционал вашей программы :
//создайте массив слов(например, поместите туда 40 слов) и рандомным образом выберите 1 слово для угадывания;
//программа должна выводить длину всего слова и отображать буквы, которые угадал игрок;
//после каждого неудачного угадывания, программа должна сообщить игроку, сколько у него осталось попыток неверно указать букву, прежде чем он проиграет;
//если человек указал букву, которую ранее уже угадывал, и она не дублируется в слове, то не наказывайте его, а просто предоставьте возможность угадать букву еще раз.
//Например, компьютер загадал слово INTERESTING :
//
//Добро пожаловать в игру "Виселица"!
//Слово - _ _ _ _ _ _ _ _ _ _ _
//Угадайте букву : S
//Верно - _ _ _ _ _ _ S _ _ _ _
//Угадайте следующую букву : F
//Неверно!Такой буквы нет, у вас осталось 5 попыток неверно указать букву!
//...
bormand 30.11.2020 10:39 # +4
Фу.
> uniform_int_distribution<int> distrib(min, max);
> return (string_view)arr[randNumber(0, arr.size())];
Прога крашится с вероятностью 1/95, или я туплю?
> cout << '*';
Хм, звёздочка безусловно выводится, даже если символ угадали?
> "У вас " << 6 - count << " попыток
Я бы скобочки въебал, читатель не обязан помнить приоритеты.
> string input;
> cin >> setw(1) >> input[count];
Как это вообще работает.
> srand((unsigned)time(nullptr));
Выбрось каку, крестовые генераторы не юзают этот стейт.
1024-- 30.11.2020 12:46 # +2
static_cast<std::string_view>(randNumber (0, arr.size())])
bormand 30.11.2020 12:47 # 0
1024-- 30.11.2020 12:56 # 0
bormand 30.11.2020 12:58 # +1
Потому что в ёбаном "iostream" это с первого раза никто не напишет.
gost 30.11.2020 13:00 # +2
bormand 30.11.2020 13:00 # 0
З.Ы. Кстати, сможешь что-нибудь сворецировать на основе слов из этого кода?
gost 30.11.2020 13:02 # +3
#NewLinesMatter
> З.Ы. Кстати, сможешь что-нибудь сворецировать на основе слов из этого кода?
Хм, если взять какую-нибудь модельку и обрезать по этим словам…
3.14159265 20.12.2020 14:07 # 0
Тоже сначала подумал, что массив слов для каких-то хитрых вореций.
1024-- 30.11.2020 13:55 # +2
или
Потому, что сначала надо убедиться, что программа не тронулась умом по части памяти, и уже потом пердолиться с iostream, что я пожелал бы оставить автору как домашнее задание ибо сам не хотел бы в это погружаться.
Но потом я занялся рабочим вопросом и забыл про ГК.
bormand 30.11.2020 13:58 # +3
1024-- 30.11.2020 14:07 # +1
bormand 30.11.2020 14:08 # 0
3.14159265 09.02.2022 12:58 # 0
А как правильно? Какие подводные камни?
Если чо, я госту въебал плюс за «getchar()». Это лютая годнота.
bormand 09.02.2022 14:44 # 0
> getchar()
По-дефолту вроде включена синхронизация буфера между c и c++ стримами, но в общем случае тоже можно ногу отстрелить.
guest6 09.02.2022 15:11 # 0
а есть пруф?
Soul_re@ver 09.02.2022 15:23 # 0
guest6 09.02.2022 15:26 # 0
Я такой невнимательный...
Soul_re@ver 09.02.2022 15:16 # +1
guest6 09.02.2022 15:25 # 0
Soul_re@ver 09.02.2022 15:29 # +1
guest6 09.02.2022 15:31 # 0
Soul_re@ver 09.02.2022 15:40 # +1
2) Убедиться, что лишние буквы неаккуратно введёные питухом не ломают программу.
3) Убедиться, что решение к (2) не теряет буквы из потока символов, переправленных из файла или чем то типа myprog < abcdef
4) Прочесть пробел
5) Прочесть перенос строки
guest6 09.02.2022 15:49 # 0
Я к стыду своему не знаю, как портабельно отключить буфер, чтобы читать сразу, а не после \n.
С буфером можно сгородить стейт машину, и фильттровать говно, но это геморно.
Soul_re@ver 09.02.2022 16:04 # +2
В том и дело, что если тебе нужно от ввода что-то иное, чем «последовательности печатных символов, разделённые последовательностями пробельных символов», то проще либо забить на iostream и манипулировать вводом самому, либо читать ввод большими кусками и парсить отдельно.
guest6 09.02.2022 16:29 # 0
C++ слишком абстрактен, и не предоставляет небуферизированный, низкоуровневый API.
Я могу не ебаться с макросней, а просто собрать разные объектные файлы, и прилинковать их на разных ОС же?
На позиксе я возьму termios, в досе conio на винде -- Console API и потеку.
Читать кусками и парсить отдельно это гиморно. Тогда уж лучше я возьму тулу для генерации лексера какого-то может быть.
j123123 30.11.2020 15:10 # +6
>{
> random_device rd; //Will be used to obtain a seed for the random number engine
> mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
> uniform_int_distribution<int> distrib(min, max);
> return distrib(gen);
>}
А может не надо каждый раз для получения случайного числа переинициализировать ГПСЧ новым сидом?
ttps://stackoverflow.com/questions/29549873/
jojaxon 30.11.2020 15:15 # 0
MAKAKA 30.11.2020 15:16 # +1
jojaxon 30.11.2020 15:21 # 0
1024-- 30.11.2020 15:16 # 0
1024-- 30.11.2020 15:14 # +1
Я бы ещё рекомендовал ради тренировки в архитектурщине эту питушню переделать в
void printGuessedString(std::string_view input, std::string_view randWord, std::ostream out), чтобы выводить куда угодно
либо в
std::string getGuessedString(std::string_view input, std::string_view randWord), чтобы полученную строку использовать где угодно как угодно.
(std::string или std::string_view или const std::string, или ... на выходе - не знаю, пишу по смыслу, а не по царскому пирфомансу)
Ну и, как минимум, переименовать в printGuessedString, чтобы читатель кода не охреневал от происходящего.
radionnazmiev 06.12.2020 22:26 # +1
https://repl.it/@radionnazmiev/Ravesli#Ravesli_24_H/main.cpp
Что еще можно улучшить помимо проверки на ввод? Правильные ли переменные я подобрал, string_view правильно ли применил, да и семантику перемещениянужно ли было реализвать где то?