赢得猜词游戏时无法终止for循环

时间:2019-01-06 20:21:22

标签: c loops break

我已经为猜词游戏编写了代码;

  1. 该代码从一个单词文件中提取一个随机单词,在该文件中,每行有“ 1”个单词。

  2. 然后代码将这个单词转换为星号,并在运行代码时显示出来。

  3. 它会提示运行该程序的任何人输入字母。如果字母正确,则对应于该字母的星号将变为该字母。如果没有,程序会提示您再次猜测。

尝试次数由用户在程序运行时设置。该程序称为 wordguess ,因此在命令提示符下使用“ wordguess filename.txt n” 运行。

filename.txt 是指包含要选择的单词的文件。 n 是指在输掉游戏之前允许用户尝试的次数。如果某人在所选尝试次数内未猜到单词,我可以使游戏完成,但如果该人获胜,我似乎无法完成游戏。如果猜对了单词,则循环将继续进行,直到该人用完所有猜测为止。我不确定在循环中应该放置什么条件来促进获胜。我尝试了各种if语句,但是尝试时这些代码无法运行。

    //taking random word from file
    srand(time(0));
    f = fopen(argv[1], "r");
    while (!feof(f))
    {
        fgets(word, 1024, f);
        word[strcspn(word, "\n")] = '\0';
        nL++;
    }
    randomline = rand() % nL;
    fseek(f, 0, SEEK_SET);
    for (i = 0; !feof(f) && i <= randomline; i++)
        fgets(word, 1024, f);
        word[strcspn(word, "\n")] = '\0';
    strcpy(astword, word); //copies word to another char
    for (i = 0; i < strlen(astword); i++)
    {
        astword[i] = '*'; //copy is converted to asterisks
    }
    int counter = 0;
    for (i = 0; i < tries; i++)
    {
        printf("%s \n", astword);
        printf("guess a letter\n");
        scanf(" %c", &guess);
        for (i = 0; i < tries; i++)
{
    printf("%s \n", astword);
    printf("guess a letter\n");
    scanf(" %c", &guess);

    for (j = 0; j < tries; j++)
    {
        if (guess == word[j])
            astword[j] = guess;
    }   
}

我缺少明显的东西吗?

编辑:根据Ozan的回答,我修改了我的循环,但它似乎没有用;

        for (j = 0; j < tries; j++)
        {

            if (guess == word[j]) 
            {
                astword[j] = guess;
                counter++; 
            }

            if (counter == strlen(astword))
            {
                break;
            }
        }

1 个答案:

答案 0 :(得分:-1)

如果我正确理解了您的问题,则只想找到正确的逻辑来终止 for循环。如果您想在用户正确猜对所有字母后终止循环,则可以通过计算程序进行了多少次星号->字母替换以及当计数达到计数时来管理循环该单词的字母,那么该是时候终止循环了,因为这意味着不再有星号可以猜测,并且单词及其所有丢失的字母都可以正确猜到。

在您程序的以下代码块中(发生替换的 );

for (j = 0; j < tries; j++){
    if (guess == word[j])
      astword[j] = guess;
}   

只需添加一个计数器即可计算将星号(*)替换为字母的次数;

for (j = 0; j < tries; j++){
  if (guess == word[j]){
    astword[j] = guess;
    counter++; // int variable, initialized to 0 before for loop starts
  }
}

然后在外部 for循环的开头,添加 if语句,以检查counter是否等于strlen(astword)

if (counter == strlen(astword))
      break; // if the replacement action is occured with the same number of word's lenght, break the loop.

因此,作为上述代码的组合,您的 for循环必须正在处理这种中断情况;

for (i = 0; i < tries; i++){
    if (counter == strlen(astword))
      break;
    printf("%s \n", astword);
    printf("guess a letter\n");
    scanf(" %c", &guess);

    for (j = 0; j < tries; j++)
    {
        if (guess == word[j]){
            astword[j] = guess;
            counter++;
        }
    }   
}