C ++刽子手游戏

时间:2014-03-24 17:17:14

标签: c++ string vector crash

我为一个悬挂人游戏编写了这个代码,用于将单词读入字典文件中的向量。然而,代码立即崩溃,我不能在我的生活中看到它的原因可能是什么。您提供的任何建议都将是一个很大的帮助!

#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
#include <ctime>
#include <string>

using namespace std;

const int MAX_TRIES=5;

int letterFill (char guess, string secretword, string &guessword)
{
    int i;
    int matches=0;
    int len=secretword.length();
    for (i = 0; i< len; i++)
    {
    // Did we already match this letter in a previous guess?
    if (guess == guessword[i])
    return 0;

    // Is the guess in the secret word?
        if (guess == secretword[i])
        {
            guessword[i] = guess;
            matches++;
        }
    }
return matches;
}


int main ()
{
    string name;
    char letter;
    int num_of_wrong_guesses=0;

   //Input file
   ifstream inFile;
   inFile.open("dictionary2.txt");

   //Vector with elements preallocated 
   //to increase push_back speed
   vector<string> dict;

    //Temporary string
    string temp;

    //Grab words from file into vector
    while(inFile >> temp)
    {
      dict.push_back( temp );
    }  
    //Close input file
    inFile.close();

    //Seed random number generator
    srand(time(NULL));

    //Generate a random index
    int index = rand() % dict.size();

    //Word to use for hangman
    string hangManWord = dict[index];
    cout << hangManWord << endl;   


    // Initialize the secret word with the * character.
    string unknown(hangManWord.length(),'*');

    // welcome the user
    cout << "\nWelcome to hangman";
    cout << "\nEach letter is represented by an underscore.";
    cout << "\nYou have to type only one letter in one try";
    cout << "\nYou have " << MAX_TRIES << " attempts left";
    cout << "\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~";

    // Loop until the guesses are used up
    while (num_of_wrong_guesses < MAX_TRIES)
    {
        cout << "\n" << unknown;
        cout << "\n Guess a letter: ";
        cin >> letter;
        // Fill secret word with letter if the guess is correct,
        // otherwise increment the number of wrong guesses.
        if (letterFill(letter, hangManWord, unknown)==0)
        {
            cout << endl << "Whoops! That letter isn't in there!" << endl;
            num_of_wrong_guesses++;
        }
        else
        {
            cout << endl << "You found a letter! Isn't that exciting!" << endl;
        }
        // Tell user how many guesses has left.
        cout << "You have " << MAX_TRIES - num_of_wrong_guesses;
        cout << " guesses left." << endl;
        // Check if user guessed the word.
        if (hangManWord==unknown)
        {
            cout << hangManWord << endl;
            cout << "Yeah! You got it!";
            break;
        }
    }
    if(num_of_wrong_guesses == MAX_TRIES)
    {
        cout << "\nSorry, you lose...you've been hanged." << endl;
        cout << "The word was : " << hangManWord << endl;
    }
    cin.ignore();
    cin.get();
    return 0;
}

2 个答案:

答案 0 :(得分:3)

由于您不知道如何使用调试器,因此代码中可疑的位置是:

int len=secretword.length();
for (i = 0; i< len; i++)
{
  // Did we already match this letter in a previous guess?
   if (guess == guessword[i])

和此:

 //Generate a random index
int index = rand() % dict.size();

//Word to use for hangman
string hangManWord = dict[index];

对于第一项,您使用secretword的长度来确定要循环的迭代次数(然后使用“i”作为循环计数器)。但是,您在guessword字符串中使用“i”。你怎么知道guessword中的位置“i”是否超出范围?

根据你如何称呼该功能,秘密词可能是“阶梯”,而猜词可能是“伙伴”。当你得到秘密词的索引3时,没有猜词[3],导致错误的访问。所以基本上你有两个单独的字符串,并且你假设它们的大小相同,但它们的大小可能不同。你可以通过确保循环来自

来解决这个问题

[ 0, min(guessword.size(), secretword.size()) )

换句话说,循环应该只从0开始循环到两个字符串的较小长度,少一个。

对于第二项,索引的值可能在或可能不在dict向量的范围内。请通过打印index和dict.size()的值来检查这一点。如果index超出了dict.size()的范围,那么你就知道问题是什么了 - 你的字典要么没有读出你认为的所有单词,要么指数计算错误。

答案 1 :(得分:2)

你在行上有一个整数除零

//Generate a random index
int index = rand() % dict.size();

您可以通过首先检查dict.size()是否为> 0来解决这个问题,只有在dict是{{1}}的情况下才能解决这个问题。如果不是,则无论如何都不需要索引,因为{{1}}中没有元素。