Проблемы с циклами while и switch - PullRequest
1 голос
/ 23 февраля 2012

У меня проблемы с моим кодом. Я пытаюсь построить игру, и она как-то выдает ошибки при достижении основных циклов. Я покажу код и ошибки, которые я получаю.

Просто небольшая заметка, смысл при выборе варианта 1 и в игре состоит в том, что игра повторяется после получения правильного ответа и дает игроку второе случайное слово, и продолжает делать это, пока игрок не пишет «выход .

Это код:

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    enum fields {WORD, HINT, NUM_FIELDS};
    const int NUM_WORDS = 3;
    const string WORDS[NUM_WORDS][NUM_FIELDS] =
    {
        {"jumble1", "First word."},
        {"jumble2", "Second word."},
        {"jumble3", "Third word."}
    };

    srand(static_cast<unsigned int>(time(0)));
    int choice = (rand() % NUM_WORDS);
    string theWord = WORDS[choice][WORD];
    string theHint = WORDS[choice][HINT];

    string jumble = theWord;
    int length = jumble.size();
    for (int i = 0; i < length; ++i)
    {
        int index1 = (rand() % length);
        int index2 = (rand() % length);
        char temp = jumble[index1];
        jumble[index1] = jumble[index2];
        jumble[index2] = temp;
    }

    int choice;
    bool choiceNotMade = true;

    while (choiceNotMade)
    {
        cout << "[1] Play\n";
        cout << "[2] Credits\n";
        cout << "[3] Quit\n\n";

                cout << "Your choice: ";
        cin >> choice;
        }

            switch (choice)
            {
            case 1:
                cout << "Unscramble the letters to make a word.\n";
                cout << "Enter 'hint' for a hint.\n";
                cout << "Enter 'quit' to quit the game.\n\n";
                cout << "The jumble is: " << jumble;

                string guess;
                cout << "\n\nYour guess: ";
                cin >> guess;

                while ((guess != theWord) && (guess != "quit"))
                {
                    if (guess == "hint")
                    {
                        cout << theHint;
                    }
                    else
                    {
                        cout << "That's not the right word.";
                    }

                    cout << "\n\nYour guess: ";
                    cin >> guess;
                }

                if (guess == theWord)
                {
                    cout << "\nYou guessed it!\n";
                }

                cout << "\nThank you for playing.\n";

                system("Pause");
                choiceNotMade = false;
                break;

            case 2:
                cout << "\n\nThis game has been made by:\n\n";
                choiceNotMade = false;
                break;

            case 3:
                cout << "Program will exit";
                exit(1);

            default:
                cout << "\nYou did not pick a valid option.\n\n";
                choiceNotMade = false;
                break;  

                } 

    return 0;
}

И это ошибка:

word_jumble.cpp: In function `int main()':
word_jumble.cpp:32: error: redeclaration of `int choice'
word_jumble.cpp:17: error: `int choice' previously declared here
word_jumble.cpp:83: error: jump to case label
word_jumble.cpp:53: error:   crosses initialization of `std::string guess'
word_jumble.cpp:88: error: jump to case label
word_jumble.cpp:53: error:   crosses initialization of `std::string guess'
word_jumble.cpp:92: error: jump to case label
word_jumble.cpp:53: error:   crosses initialization of `std::string guess'
word_jumble.cpp:83: warning: destructor needed for `guess'
word_jumble.cpp:83: warning: where case label appears here
word_jumble.cpp:83: warning: (enclose actions of previous case statements requiring destructors in their own scope.)
word_jumble.cpp:88: warning: destructor needed for `guess'
word_jumble.cpp:88: warning: where case label appears here
word_jumble.cpp:92: warning: destructor needed for `guess'
word_jumble.cpp:92: warning: where case label appears here
word_jumble.cpp:100:2: warning: no newline at end of file
make[2]: *** [build/Debug/MinGW-Windows/word_jumble.o] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

Ответы [ 5 ]

2 голосов
/ 23 февраля 2012

Вы объявляете int choice дважды. Сообщение об ошибке довольно ясно об этом.

После того, как вы объявили переменную, вы не можете повторно объявить ее в той же области:

{
  int x;

  //...
  int x; // <-- illegal, just use x
}
1 голос
/ 23 февраля 2012

Вы объявляете

int choice; 

дважды, один раз

int choice = (rand() % NUM_WORDS);

, а затем прямо перед

while (choiceNotMade)
1 голос
/ 23 февраля 2012

Я думаю, что сообщение

переопределение `int choice '

должно быть довольно очевидно.

Другие сообщения об ошибках немного сложнее понять, но они исчезнут, если вы объявите переменную guess вне оператора switch.

1 голос
/ 23 февраля 2012

Я предполагаю, что это домашнее задание, поэтому я буду избегать слишком конкретных рекомендаций.

Вы объявили переменную choice в строке 19, поэтому вам нужно удалить второе объявление в строке 34.

Вам также нужно переместить объявление string guess до оператора switch.Это связано с тем, что C ++ требует, чтобы все локальные переменные были инициализированы ровно один раз, и компилятор не смог бы убедиться в этом, если в первый раз в цикле вы берете case 2:, а во второй раз - case 1:, где string guess объявляется.

Это сделает вашу программу компилируемой, но не будет работать так, как ожидалось.Посмотрите на открывающие / закрывающие скобки в вашей программе и убедитесь, что блоки кода вложены так, как вы ожидаете.

1 голос
/ 23 февраля 2012

Вы объявили choice в двух местах.Кроме того, вы написали switch вне цикла while, что означает, что даже если ваша программа компилируется, она застрянет в бесконечном цикле.

...