Nano Hash - криптовалюты, майнинг, программирование

Обнаружение нажатия клавиши Enter в C++

Как я могу заставить свой код обнаруживать, что я нажимаю клавишу ввода? Я пытался использовать cin.get() безуспешно. Также, когда нажата клавиша ввода, я хотел бы изменить логическое значение x с истинного на ложное.

Почему это не работает?

if (cin.get() == '\n'){
x = false;
}

Я хотел бы завершить свой цикл (и, следовательно, и программу), когда нажата клавиша ввода (см. код ниже)

Весь код (простой камень, бумага, ножницы):

#include <iostream>
#include <string>
#include <cstdlib> //random
#include <time.h> //pc time

using namespace std;

int main()
{

    string rpsYou;
    string rpsCom;
    string winner;
    bool status = true;

while (status){
    cout << "Welcome to Rock, Scissors, Paper!\nYou'll have to compete against the computer."
            " Please enter 'Rock', 'Paper' or 'Scissors' here: ";
    cin >> rpsYou;

    //Random number
    srand (time(NULL));
int randomNum = rand() % 4; //  -> (rand()%(max-min))+min;

//Computers guess
if (randomNum ==1){
    rpsCom = "Rock";
}
else if (randomNum ==2){
    rpsCom = "Paper";
}
else {
    rpsCom = "Scissors";
}

//First letter to capital
rpsYou[0] = toupper(rpsYou[0]);

if (rpsYou == "Rock" || rpsYou == "Paper" || rpsYou == "Scissors"){

    cout << "You: " << rpsYou << "\nComputer: " << rpsCom << "\n";

}
else {
    cout << "ERROR: Please enter 'Rock', 'Paper' or 'Scissors'.";
}


if ( (rpsYou == "Rock" && rpsCom == "Rock") ||
     (rpsYou == "Paper" && rpsCom == "Paper") ||
     (rpsYou == "Scissors" && rpsCom == "Scissors") ){

    cout << "Tie :|";

}
else if( (rpsYou =="Rock" && rpsCom =="Scissors") ||
         (rpsYou =="Paper" && rpsCom =="Rock") ||
         (rpsYou =="Scissors" && rpsCom =="Paper")){
    cout << "Congratulations! You won! :)";
}

else{
    cout << "Oh no! You lost! :(";
}

}

    return 0;
}
12.10.2014


Ответы:


1

Вы можете сделать:

cout << "Hit enter to stop: ";
getline(cin, rpsYou);
if (input == "") {
    status=false;
}

Это предполагает, что в пользовательском вводе ничего нет (т.е. пользователь просто нажимает ввод)

12.10.2014
  • вы можете заменить cin >> rpsYou; на getline(cin, rpsYou); в своем while loop и добавить if (input == "") {status=false;} после получения ввода пользователя. (т.е. добавьте оператор else if над этой строкой: else {cout << "ERROR: Please enter 'Rock', 'Paper' or 'Scissors'.";}) 12.10.2014

  • 2

    Вы не можете определить, какая клавиша была нажата в стандартном C++. Это зависит от платформы. Вот похожий вопрос, который может вам помочь.

    12.10.2014

    3

    Похоже, вы думаете о том, чтобы нажимать клавиши «в режиме реального времени», что может быть полезно, например, в игре. Но cin так не работает. В стандартном С++ нет способа «обнаружить, когда пользователь нажимает ввод»! Таким образом, вы не можете завершить программу, когда пользователь нажимает ввод. Что вы можете сделать, так это завершить программу, когда пользователь вводит пустую строку или когда пользователь вводит, например, «выход» (или что-то еще, на ваше усмотрение), но каждый ввод пользователя должен заканчиваться нажатием клавиши ввода.

    Чтение из cin аналогично чтению из текстового файла, за исключением того, что этот текстовый файл получает новую строку каждый раз, когда пользователь нажимает клавишу ввода. Таким образом, ближе всего к обнаружению пользователя, нажимающего ввод, используется std::getline:

    std::string line
    std::getline(std::cin, line);
    

    Это позволит получить все символы из stdin до новой строки (или до конца файла), что обычно означает, что пользователь нажал клавишу ввода, когда это используется в консольном приложении. Обратите внимание, что фактический конец строки не будет сохранен в строке, поэтому, если пользователь просто нажал клавишу ввода, не вводя ничего другого, line будет пустой строкой.


    Глядя на вопрос после редактирования, вы можете заменить cin >> rpsYou; на getline(cin, rpsYou);. Затем вы также можете добавить обрезку строка, которую вы читаете, если пользователь, например, набрал лишние пробелы.

    12.10.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..