2013-12-15 8 views
0

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

Первая проблема: у меня есть функция, чтобы увидеть, хочет ли игрок играть снова, введя y или n. Если они нажимают n, он заканчивается так, как должен, но если они нажимают Y или y, он просто запрашивает их снова, если они хотят снова играть, пока не будет нажат любой другой символ, отличный от y.

Моя вторая проблема, и самый раздражающий, является счетчиком цикла, который я использую, чтобы определить, использовался ли символ, который они ввели в качестве предположения, или нет в слове (игра в палач). Он работал до того, как я внес некоторые незначительные изменения, он больше не работает так, как предполагалось, и при этом он не связан с этим кодом вообще, он был в другом месте. По сути, счетчик циклов сбрасывается до 0 каждый раз, когда цикл встречает пользователя в пределах слова, но если счетчик равен длине слова, это означает, что пользовательская догадка не найдена, и она должна установить отображаемое значение плюс один. Тем не менее, все, что он делает СЕЙЧАС, постоянно остается на ноль, даже если пользователь вводит неверное предположение, которое должно увеличивать значение отображения на единицу, оно остается равным нулю. Я потратил два дня, пытаясь заставить ПРОСТО, чтобы эта часть работала, и она работала вчера, но не сегодня, и я могу использовать другой набор глаз, чтобы посмотреть, не упустил ли я что-то!

void playHangman(string wordArray[], bool usedWords[]) 
{ 
    string secretWord; 
    unsigned seed = time(0); 
    srand(seed); 
    int wordChoice = (rand()%20); 
    int counter = 0; 
    int display = 0; 
    bool winner = false; 
    int wordLength = secretWord.length(); 
    int count; 
    char again; 

    do 
    { 
     while(usedWords[wordChoice]) 
     { 
      if(wordChoice == 19) 
       wordChoice = 0; 
      else if(counter == 20) 
      { 
       for(int i = 0; i < SIZE; i++) 
        usedWords[i] = false; 
       wordChoice = (rand()%20); 
       counter = 0; 
      } 
      wordChoice++; 
      counter++; 
     } 
     secretWord = wordArray[wordChoice]; 
     const char *word = new char [secretWord.length()]; 
     word = secretWord.c_str(); 
     char *userPrompt = new char [secretWord.length()]; 
     for(int i = 0; i < secretWord.length(); i++) 
      userPrompt[i] = '_'; 
     userPrompt[secretWord.length()] = '\0'; 
     char userGuess = '\n'; 

     while(!winner) 
     { 
      count = 0; 
      for(int i = 0; i < secretWord.length(); i++) 
       cout << userPrompt[i] << " "; 
      cout << "\n" << endl; 
      displayGallows(display); 

      if(display == 6) 
      { 
       cout << "Sorry, you lost!" << endl; 
       break; 
      } 

      cout << "Enter a letter: "; 
      cin >> userGuess; 
      cin.ignore(); 
      for(int i = 0; i < secretWord.length(); i++) 
      { 
       if(word[i] == userGuess) 
       { 
        userPrompt[i] = userGuess; 
        count = 0; 
       } 
       else if(count == (wordLength - 1)) 
        display++; 
       count++; 
      } 
      winner = checkWin(word, userPrompt, display, secretWord);  
     } 
     again = playAgain(); 
    }while(again == 'Y' || again =='y'); 
} 

char playAgain() 
{ 
    char playAgain; 
    cout << "Would you like to play again? Enter y or n: "; 
    cin >> playAgain; 
    return playAgain; 

} 
+3

Извлеченный урок: используйте исходный репозиторий и сохраните, например, промежуточное промежуточное состояние, чтобы вы могли сравнить, что изменилось, и узнать, что вы сломали, или просто вернуться и продолжить оттуда. [git] (http://git-scm.com/) кажется настоящим модным выбором для исходного репозитория. –

ответ

2

Есть действительно два вопроса:

  1. Почему это не перезапустить игру? Ответ: потому что программа думает, что игра была успешно сыграна. Вы настраиваете свои переменные перед циклом, и вы не сбрасываете их, чтобы играть в другую игру. Рекомендация: создайте функцию, которая фактически играет в игру и просто вызовет ее из внешнего цикла. Играйте в эту игру.
  2. Почему он не увеличивает count? Не знаю. Почему вы думаете, count всегда остается на 0? Тем не менее, кажется, что состояние count == (wordLength - 1) вряд ли каждый стать true, поскольку wordLength устанавливается в размере secretWord когда secretWord оказывается пустым (т.е. wordLength установлен в 0) и никогда не изменял впоследствии.
+0

Фактически, он работал до этого с тем же кодом. По сути, wordLength - 1 - сколько раз цикл for циклически проходит через массив. ЕСЛИ он находит символ в слове, он сбрасывает счетчик на 0, и ничего не должно произойти. Если он проходит через весь массив символов, и пользовательская догадка НЕ ​​найдена, счет СЛЕДУЕТ точно равняться wordLength - 1 (поскольку я использую версию слова STRING для определения слова Length, она должна быть длиной минус 1, поскольку только C- strings и strlen возвращают значение int БЕЗ нулевого ограничителя, подсчитанного по длине). –

+0

и как моя программа настроена, secretWord.длина всегда будет иметь значение, потому что игра даже не начнется, пока ПОСЛЕ того, что файл не был успешно загружен, и содержимое файла успешно передается в массив String. Отсюда secretWord выбирает случайное слово из массива, и THEN этот код работает .... поэтому длина всегда имеет по крайней мере значение 4 (включая нулевой ограничитель). –

+0

@ DragonWolf: если вы не хотите ответа, не спрашивайте! Вы заявили, что программа не работает, и я сказал вам, почему. Я не говорю, что 'wordLength' не имеет значения, но имеет значение' 0', потому что вы устанавливаете его только тогда, когда 'secretWord' пуст и не изменяется после этого. Я предполагаю, что ваше изменение двигало инициализацию вокруг нарушения вашего предположения. –

1

Просить повторить игру может быть вызвано не сбросом переменной «победитель». Это можно исправить следующим образом.

do 
{ 
    winner = false; //set to false at each iteration 
    while(usedWords[wordChoice]) 
    { 
     if(wordChoice == 19) 
      wordChoice = 0; 
     else if(counter == 20) 
+0

Итак, это позаботилось о повторном выпуске игры, по крайней мере, работает, добавив эту строку в цикл do-while. Мне также пришлось поместить здесь выбор слов, иначе он снова заберет то же слово! Все еще нужно решить проблему, когда они вводят и неправильный выбор ... цикл должен увеличивать отображение на единицу, если пользователь догадывается, что нет слова ..... –