Код пропускает следующий код после выхода из функции - PullRequest
0 голосов
/ 17 марта 2020

Я работаю над небольшой текстовой приключенческой игрой, первым проектом, над которым я когда-либо работал для собственного удовольствия, и столкнулся с проблемой. У меня есть вопрос, хотите ли вы играть, как вас зовут, и тогда возникает проблема, когда вы пытаетесь выбрать расу. Он отлично работает, когда пользователь вводит первый символ, но когда он вводит строку, он пропускает пол и класс cin. Должен ли я очистить Cin? Или мой код просто неверный ?? Спасибо за любую помощь, которую вы можете предоставить.

#include "pch.h"
#include <iostream>
#include <string>
#include <cctype>
#include <map>
using namespace std;

enum races { Human, Orc, Elf, Dwarf};
enum classes { Warrior, Mage, Archer, Assassin};
const std::map< char, string > race_map =
{ {'H', "human"}, {'O', "orc"}, {'E', "elf"}, {'D', "dwarf"} };
const std::map< char, string > class_map =
{ {'W', "warrior"}, {'M', "mage"}, {'Ar', "archer"}, {'A', "assassin"} 
};

void gameIntro();
void gameStart();
void raceFunc(char race);
void playerClassFunc(char playerClass);


void gameIntro()
{
string playerName;
char race;
char sex;
char playerClass;

cout << "Enter your name: \n";
cin >> playerName;
cout << "\n";


cout << "Select a race (Human, Orc, Elf, Dwarf): \n";
cin >> race;
cout << "\n";
raceFunc(race);


cout << "Select Gender (M or F): \n";
cin >> sex;
cout << "\n";


cout << "Select a class (Warrior, Mage, Archer, Assassin): \n";
cin >> playerClass;
cout << "\n";
playerClassFunc(playerClass);

gameStart();
}

void raceFunc(char race)
{
race = toupper(race);
switch (race)
{
case 'H':
    cout << "You chose Human!\n\n";
break;
case 'O':
    cout << "You chose Orc!\n\n";
break;
case 'E':
    cout << "You chose Elf!\n\n";
break;
case 'D':
    cout << "You chose Dwarf!\n\n";
break;

default:
    cout << "Please choose from the following. Program closing.\n";
    system("pause");
    exit(0);
}
}

void playerClassFunc(char playerClass)
{
playerClass = toupper(playerClass);
switch (playerClass)
{
case 'W':
    cout << "You chose Warrior!\n";
break;
case 'M':
    cout << "You chose Mage!\n";
break;
case 'Ar':
    cout << "You chose Archer!\n";
break;
case 'A':
    cout << "You chose Assassin!\n";
break;

default:
    cout << "Please choose from the following. Program closing.\n";
    system("pause");
    exit(0);
}
}

void gameStart()
{

}

int main()
{
char answer;

cout << "Welcome to Dark Horse\n\n";
cout << "This is my fisrt ever actual program I made out of my own free 
will lol.\n";
cout << "It is a Text-Based Adventure game. In this game you will make a 
character,\n";
cout << "and explore the land of Spelet, battling enemies, leveling up, 
getting loot,\n";
cout << "and learning skills! You do not need to capitalize anything but 
your character\n";
cout << "name. If a question has (something like this) if you don't 
enter whats inside\n";
cout << "the program will CLOSE, so please pay attention! Thank you for 
trying it out!\n";
cout << "I really hope y'all enjoy it!\n\n";
do
{
    cout << "Would you like to play?\n";
    cin >> answer;
    if (answer == 'Y')
    {
        gameIntro();
    }
    else if (answer == 'N')
    {

        system("pause");
        return 0;
    }
    else if (answer != 'N' || 'Y' || 'exit')
    {
        cout << "Come on dog it's Y or N...yes or no...\n\n";
    }

} while (answer == 'N' || 'Y');

system("pause");
return 0;
}

Problem when entering string

Working when entering character

1 Ответ

1 голос
/ 17 марта 2020

" cin , класса istream, является стандартным входным каналом, используемым для пользовательского ввода. Этот поток соответствует C s stdin. Обычно этот поток подключен на клавиатуру операционной системой. " (Josuttis, 2012, p. 745)

Josuttis, N. (2016). Стандартная библиотека C ++: Учебное пособие и справочник, 2-е издание: Addison-Wesley

Типы важны.

char race;
std::cout << "Please enter your race:" << std::endl;
std::cin >> race;

Если пользователь вводит «Человек», стандартный поток ввода содержит Human, а переменная race теперь имеет значение H (типа char). Стандартный поток ввода теперь содержит uman.

char gender;
std::cout << "Please enter your gender:" << std::endl;
std::cin >> gender;

Вызов >> с std::cin получает еще один символ из стандартного потока ввода (в данном случае u) и сохраняет его в gender. Стандартный поток ввода теперь содержит man.

Хотя кажется, что гендерный вопрос был пропущен, теперь вы можете видеть, что это не так. Входной поток по-прежнему содержит символы. Если вы посмотрите на свой первый скриншот, то увидите, что был выбран «Маг». Это связано с тем, что значение playerClass равно m, то же самое m, что и при вводе human.

Один из способов исправить это - использовать std::string вместо char для хранения ввода. Таким образом, у вас будет больше гибкости в разборе того, что вводит пользователь (например, вы можете разрешить H или Human).

...