2013-08-15 2 views
4

Я только что начал пробовать C++ пару недель назад. У меня довольно приличная хватка на Java, прежде чем пытаться использовать C++. Многие говорили мне, что они действительно похожи в смысле синтаксиса.Почему этот блок корпуса не выполняется?

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

Вот мой код:

#include "stdafx.h" 
#include <iostream> 
#include <cstdlib>  // For rand() 
#include <string> 
#include <sstream> 
#include <algorithm> // transform() 
#include <cctype>  // toupper(), tolower() 
#include <functional> // ptr_fun() 
#include <time.h> 
// PUT S*** BELOW THIS POINT 
//____________________________________________________________________________ 

using namespace std; 

int main() 
{ 
    /* Expirimental text based adventure game. 
    * Mainly being used for practice methods. 
    * Developed by Zack Cook. 

    Generic title. Bad story. Bad interactions. 

    Lots and lots of bad, bad code. Be warned. 
    */ 

    string charName; 

    string charChoice; 

    int charDecision; 

    int playerHealth = 100; 
    int randomNumber; 
    int orcHealth = 100; 

    srand (time(NULL)); 

    cout << "_____________________________________________" << endl; 
    cout << "| ##### #########  ###  ### ### |" << endl; 
    cout << "| ### ### ###  ### ### ### ### |" << endl; 
    cout << "| ###  ###  ### ### ##### |" << endl; 
    cout << "|  ###  ###  #########  ### |" << endl; 
    cout << "| ### ### ### ###  ### ### |" << endl; 
    cout << "| #####  ### ###  ### ### |" << endl; 
    cout << "_____________________________________________" << endl; 
    cout << "" << endl; 
    cout << "" << endl; 
    cout << "Welcome player. What is your name?" << endl; 
    getline(cin, charName); 
    yesOrNo: 
    cout << "Hello " << charName << ". Are you ready to begin?" << endl; 

    getline(cin, charChoice); 

    transform(charChoice.begin(), charChoice.end(), charChoice.begin(), toupper); 
    cout << charChoice << endl; 
    if(charChoice == "YES"){ 
     cout << "Good. Let's begin." << endl; 
    } 
    else if(charChoice == "NO"){ 
     system ("exit"); 
    } 
    else 
    { 
     cout << "That is not a good answer." << endl; 
     goto yesOrNo; 
    } 

    cout << "Our story begins with a wanderer named " << charName << " passing through the small town of Hark's Pass." << endl; 
    cout << "A little cozy village with no more than 30 or so home stayers.\nThe village men work hard on the farms during the day." << endl; 
    cout << "The women cater to the children, and other house hold chores.\nIn the evening, most of the village turns to The Rusty Trough for a bit of drink." << endl; 
    cout << "As the sun starts to set, our wanderer, " << charName << ", starts foot towards The Rusty Trough." << endl; 
    cout << "As " << charName << " enters the tavern, a heavily drunken Orc man stumbles towards the entrance." << endl; 
    cout << "\"I've never seen you 'round here!\" The orc says to our wanderer. \"I think it's time to teach these adventure types what we really think about 'em\"" << endl; 

    cout << "" << endl; 
    cout << "What will you do?" << endl; 
    cout << "1| Get ready to fight!" << endl; 
    cout << "2| Call for help!" << endl; 
    cout << "3| Try to run!" << endl; 
    cout << "4| Do nothing at all!" << endl; 
    cout << "5| Try to reason!" << endl; 

    cin >> charDecision; 

    switch(charDecision) 
    { 
    case '1': 
     do{ 
      cout << "FIGHT" << endl; 
      randomNumber = rand() % 100 + 1; 
      if(randomNumber >= 50){ 
       orcHealth = orcHealth - (randomNumber - (randomNumber/5)); 
      cout << "You hit the orc! He now has " << orcHealth << " life left!" << endl; 
      } 
      else 
      { 
       playerHealth = playerHealth - (randomNumber - (randomNumber/5)); 
       cout << "The orc hit you! You now have " << playerHealth << " life left!" << endl; 
      } 
     }while(playerHealth || orcHealth != 0); 
     break; 

    default: 
     break; 
    } 

    return 0; 
} 
+0

'goto'? О, о. http://www.u.arizona.edu/~rubinson/copyright_violations/Go_To_Considered_Harmful.html – Chris

+4

'while (playerHealth || orcHealth! = 0)'? Почти наверняка не то, что вы хотели. –

+0

@Chris, Хотя это ужасное использование, и я не видел реального использования для 'goto' на C++, эта статья устарела, если честно. 'goto' действительно использует, но это не один из них. – chris

ответ

7

В вашей инструкции по эксплуатации сравнивается int charDecision с '1', что является char.

Вы со стандартного ввода в int, что означает charDecision будет содержать 1. Затем сравните 1 против '1', который переводит до 49, когда отливают в int. Таким образом, ваш вход никогда не будет соответствовать (если вы не вводите 49).

Исправление: Сравнить с 1 или сделать charDecision a char.

+1

Кроме того, объявление переменных, а не старых-C-стиле в начале, но только до их фактического использования, может помочь избежать таких ошибок. – foraidt

5

Переменная charDecision объявлена ​​как int.

Стандартные классы потоков ввода-вывода C++ (в том числе cin и cout, среди прочего) относительно интеллектуальны и «делают правильную вещь» в зависимости от типа переменной, которую вы ему даете.

Когда выполняется выражение cin >> charDecision, cin считывает все, что выглядит как число , и преобразует его в собственное представление числа. Итак, когда вы вводите 1 в этом меню, то, что хранится, является буквальным номером 1. Ваш коммутатор проверяет буква символ'1', который имеет целочисленное значение 49, поэтому он не будет соответствовать, так как 49! = 1 .

Вы хотите, чтобы либо изменить тип charDecision к charили тест число 1 вместо символа '1'.

+0

Может быть хорошей возможностью ознакомиться с [Enums] (http://www.enel.ucalgary.ca/People/Norman/enel315_winter1997/enum_types/), поскольку вы можете найти их полезными для своей игры. – mwjohnson

-2

Ваша основная проблема - использовать goto, избавиться от него!

yesOrNo: 
cout << "Hello " << charName << ". Are you ready to begin?" << endl; 

getline(cin, charChoice); 

transform(charChoice.begin(), charChoice.end(), charChoice.begin(), toupper); 
cout << charChoice << endl; 
if(charChoice == "YES"){ 
    cout << "Good. Let's begin." << endl; 
} 
else if(charChoice == "NO"){ 
    system ("exit"); 
} 
else 
{ 
    cout << "That is not a good answer." << endl; 
    goto yesOrNo; 
} 

можно заменить

do 
{ 
    cout << "Hello " << charName << ". Are you ready to begin?" << endl; 

    getline(cin, charChoice); 

    transform(charChoice.begin(), charChoice.end(), charChoice.begin(), toupper); 
    cout << charChoice << endl; 
    if(charChoice == "YES"){ 
     cout << "Good. Let's begin." << endl; 
     startGame();//it is the function where you should place your game logic, the "switch" block in your case 
     //if you want to get back to main menu after the end of the game you can delete next line: 
     break;//leave this loop 
    } 
    else if(charChoice == "NO"){ 
     break;//leave this loop 
    } 
    else 
    { 
     cout << "That is not a good answer." << endl; 
    } 
} while (true); 

делают также таким образом, вы можете вернуться в главное меню после окончания игры.
Я также рекомендую вам разделить логику игры на разные функции, код будет намного проще писать и поддерживать. Также я бы рекомендовал переписать свою игру объектно-ориентированным способом после того, как вы закончите, это может быть хорошей практикой для вас. И забудьте о goto, он может превратить любой код в кусок дерьма.

+0

Пожалуйста, не забудьте прокомментировать ваши ноты – SpongeBobFan

+1

Ну, ответ не затронул проблему, а скорее набросился на 'goto' (-1), который в этом случае был довольно невинным. Если кто-то читает за сокращенным названием документа, опубликованного Крисом, они понимают, что речь идет о нелокальных 'goto's; и это здесь очень локальный 'goto', используемый как контур цикла, довольно невинный. Продолжая, мы продолжим, чтобы показать лучшую структуру программы с правильным циклом и функциями, обеспечивающими значительное увеличение ремонтопригодности и удобочитаемости (+1). Нет ничего от меня. –

+0

@r_ahlskog, да, это не ответ на вопрос, но мы можем с уверенностью сказать, что автор этого вопроса учится, поэтому я думаю, что это хорошая идея дать ему небольшой урок. Я просто боюсь, что downvotes заставят его думать, что мое предложение - не лучший способ пойти, и он останется с goto, пока он не попытается написать что-то большое, а затем просто потеряет свои усилия, чтобы научиться программированию, потому что это очень сложно изменить код, содержащий goto. Может быть, ответ не подходит для этого, но я не могу объяснить это в формате комментариев. – SpongeBobFan

0

while (playerHealth != 0 || orcHealth != 0) Я думаю, что это проблема.

+0

Я думаю, что вместо ||, && будет работать. Потому что либо один должен быть равен нулю для его завершения. Если сказать, что orcHealth равен нулю, а playerHealth не равен нулю, он должен завершиться, но он не будет. –

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