2016-03-30 3 views
-1

Я довольно новичок в программировании на С ++, так что это, вероятно, ошибка новобранец. НО. (почему я не могу скрыть остальную часть своего кода ... Я хочу показать ВСЕ, что я делаю ..)Программа распознает первый текстовый вывод, но не второй текстовый вывод

Итак, сначала мой код выглядит следующим образом (заголовки и т. Д. плюс первые несколько строк кода)

#include <iostream> 
#include <string> 

using namespace std; 

string command;  
string playername; 
char response;  

string object; 

int main() 
{ 

    do 
    {   
     cout << "What is your name? "; 
     cout << endl; 

     cin >> playername; 
     cout << endl; 

     cout << "Your name is " << playername << "? (Y/N)" << endl; 
     cout << endl; 
     cin >> response; 

     cout << endl; 
     cout << endl; 

    } while ((response != 'y')&&(response != 'Y')); 
} 

а потом вот немного проблема:

do 
{ 
    cout << endl; 
    cout << "What will you do?"; 
    cout << endl; 

    cin >> command >> object; 

    if ((command == "look")&&(object == "door")) 
     cout << "You look at the door. It appears to be but a simple wooden door 
     with a brass handle for opening and shutting. "; 

    else if ((command == "Open")&&(object == "door")) 
     cout << "You open the door and proceed to the next room"; 

    } while ((command == "look")&&(command == "Look")); 
} 

Моя программа будет распознавать, когда я ставлю в «смотреть» и «дверь» (как команды и объекта) и отвечает соответствующей строкой «Это дверь». НО, когда я помещаю «открытую» и «дверь», он просто принимает это и заканчивает программу, не отображая текст.

Если есть ЛЮБОЙ способ, я могу исправить это, я был бы очень благодарен.

Спасибо!

EDIT: для удобства чтения EDIT2: Изменено последнюю строку

}while ((command == "look")||(command == "Look")); 

и я получаю: the bulwarky that is this code

+1

Хотя компилятор не заботятся о таких вещах, как форматирование и отступы, мы, люди. Попробуйте отформатировать код с помощью отступа, чтобы его было легче читать. –

+0

Aaah sorry: S Я очень не привык к этому и просто пытаюсь собрать все вместе. – KitKatarine

ответ

0

Ваш чтения и печати код будет работать только один раз, потому что ваше состояние не является действительным. Я предполагаю, что если вы введете «Open» и «door» в качестве своих первых команд, вы получите свой открытый текст, а затем программа остановится.

Причина, по которой ваша программа однажды прочитает ваш код, объясняется тем, что цикл do-while создается таким образом. Он выполнит ваш цикл один раз, а затем проверяет, нужно ли это сделать снова, увидев, что оператор while (..) остается в силе.


Вот дополнительная информация о цикле do-while. http://www.tutorialspoint.com/cplusplus/cpp_do_while_loop.htm

Цитируется связанного сайта:

Синтаксис дел ...в то время как цикл в C++ является:

do 
{ 
    statement(s); 
} 
while(condition); 

Обратите внимание, что условное выражение появляется в конце цикла, так что оператор (ы) в цикле выполнить один раз перед тем, условие проверяется.


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

while (command != "stop"); 

Таким образом, программа будет продолжаться до тех пор, пока тип в слове «стоп»

+0

Я думал, что сделал это правильно. Я хочу, чтобы он зацикливался, пока пользовательские входы выглядят, но не тогда, когда пользователь вводит открытые. До сих пор (и я уверен, что я не объяснил это право в главном сообщении), я могу заставить его зациклиться, когда я набираю вид, что является ожидаемым поведением, но когда я вхожу в открытый, он не отображает текст, который Я хочу. и вместо этого просто завершает программу. – KitKatarine

+0

Теперь он делает это: https://i.gyazo.com/83930a7d4932f7b588069473f4417a11.png Ahh Я плохо в этом ... Поведение, которое я хочу, это: Loop, пока пользователь смотрит на дверь. Но я хочу, чтобы он показывал текст «Вы открываете дверь и продолжаете ... blabla», когда пользователь ОТКРЫВАЕТ дверь. Который в настоящее время не делает. Я действительно ценю вашу помощь, кстати ... – KitKatarine

+0

Попробуйте ввести «Open» с капиталом O, так как вы сравниваете его с «Open» в своем, если (..) –

2

Выражение (command == "look")&&(command == "Look") будет только справедливо, если command одновременно "look"и"Look" на то же самое, что-то невозможное и сделает условие false.

Вы должны использовать логический или вместо: (command == "look")||(command == "Look")

+1

Также «Open» указывается только с капиталом O. Возможно, стоит отметить. –

+0

О боже, я знаю. Я пробовал все, как кажется. Я отметил капитал O и маленький O. Я пробовал || различать все. Я просто в недоумении – KitKatarine

+0

Или вы можете использовать библиотеку Boost, чтобы сделать все ваши команды символами non-caps. Тогда вам не нужно сравнивать свою команду с «look» и «Look», но вам будет хорошо, если вы просто сравните свою команду с «look». См. Http://stackoverflow.com/questions/3403844/tolower-function-for-c-strings –

0

Ваша проблема зависит от дифферент между "Open" и "открыто". Это очень сложно, поэтому проверьте все строки для обоих случаев. Возможно, вы можете использовать функцию std :: toupper.

попробовать что-то вроде этого:

if(toupper(command) == toupper("open") && toupper(object) == toupper("door")) 

Edit: Ссылка на toupper-function

+0

Я тоже попробую. Спасибо. – KitKatarine

+0

Нет соответствующей функции для вызова toupper, говорится в сообщении. Есть ли заголовок, в котором я нуждаюсь? – KitKatarine

Смежные вопросы