【发布时间】:2019-01-06 20:21:21
【问题描述】:
我为一个猜字游戏编写了代码;
代码从单词文件中随机抽取一个单词,在文件中,每行有“1”个单词。
然后代码将该单词转换为星号并在代码运行时显示。
- 它提示运行程序的人输入一个字母。如果字母正确,则对应于该字母的星号将成为该字母。如果不是,程序会提示您再次猜测。
尝试次数由用户在程序运行时设置。该程序称为 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;
}
}
【问题讨论】:
-
“我是否遗漏了一些明显的东西?”不幸的是,是的。但你并不孤单。绝大多数学习编程的人都遇到与您完全相同的问题:您不知道如何调试。调试对于编程至关重要。没有它你就无法前进。您必须花时间学习如何调试。然后它会节省你无数小时盯着你的程序想知道它为什么不工作。您需要调试自己的程序,至少可以显着缩小问题范围,并且可以提出比“我的程序不起作用”更具体的问题
-
另外,您的段落是一堵文字墙。请注意这一点并组织您的陈述。
-
以防万一我没被理解:您显然缺少的是您需要调试程序。
-
我同意,在阅读了您的评论后,我明白需要留出时间来学习如何调试。谢谢。
-
fseek在具有可变长度单词的文本文件中是可疑的。建议你把整篇文章读入记忆,然后分解成碎片?