最近自学了C语言,完成了模拟猜单词程序,下面我将能够运行出的程序展现出来供和我一样的初学者参考。
一.内容和要求
模拟猜单词游戏包括:单词管理、玩家记录、猜词过程、系统设置等必须完成的基本功能以及成绩计算、猜词时间限制、词库管理等选做的拓展功能。
二.基本要求
-
单词管理:程序中用来做谜题的单词必须存放在磁盘文件中。
-
猜词过程:
i.先请用户输入猜的单词数量,可以有一个默认值
ii.随机抽取单词,对每个单词,系统根据谜底单词长度在屏幕上显示相应个数‘ - ’,假设谜 \quad 底单词为“hello",则在屏幕上输出’ -----’
iii.玩家输入一个字母进行猜测,如果这个字母不在单词中,系统提示玩家不对;如果猜对 \quad 字母,比如玩家输入了一个‘ l ',则在屏幕上输入“—ll-”
iv.重复3,直到玩家在规定的次数内猜出了单词或者超过次数游戏失败
v.显示玩家每个单词猜对与猜错次数等统计信息。如果玩家猜出单词,计算成绩,如进入前 \quad 五名提示玩家并记录存储到记录文件中
vi.询问玩家是否开始新一轮猜词,如果玩家选“否”,则系统退到外面的菜单 -
系统设置:猜词次数可以设为默认值。玩的时候,可以对其进行修改
三.代码实现
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
//函数原型声明
void OpenFile(char string[21][11]);
void PlayGame(char wordlist[21][11]);
void StartGame(char wordlist[21][11]);
void Menu();
//声明用户结构体
struct Player
{
char name[20];
int right;//猜对单词个数
int wrong;//猜错个数
int time;//猜数时间
};
typedef struct Player Player;
Player p[5] = {{"unknown",0,0,0},{"unknown",0,0,0},{"unknown",0,0,0},{"unknown",0,0,0},{"unknown",0,0,0} };
Player temp;
int right, wrong;
//读取单词库函数
void OpenFile(char string[21][11])//定义单词库中最多拥有21个单词,长度为11
{
FILE *fp=NULL;
fp = fopen("\path_name\data.txt","r");
if (fp==NULL)
{
printf("单词库为空。\n");
exit(0);
}
else
{
int len,count;
count=0;
char test_a[11];
while(fgets(test_a, 11, fp)!=NULL)
{
len=strlen(test_a);
test_a[len-1]='\0';
for(int j_two=0;j_two<len;j_two++)
{
string[count][j_two] = test_a[j_two];
}
count++;
}
}
}
int nums;//猜想单词数
void Set()
{
printf("请输入猜想单词的个数:");
scanf("%d", &nums);
}
//设置每个单词可以猜多少次
int guesstime;
void SetGame()
{
printf("设置可猜单词的次数:");
scanf("%d", &guesstime);
}
//用户猜词过程
right = 0;
wrong = 0;
void PlayGame(char wordlist[21][11])
{
guesstime = 10;
char guess;//存入用户打入的字母
char guessword[11];//存入用户打入的词
int l;//定义单词长度
int q = 0, x = 0, y = 0;
char WrongGuess[11];//存入用户猜错的字母
int t = 0;//记录错误单词数组的下标
int flag = 0;
int c = 1;//查看是否猜对所有字母
srand(time(NULL));//设置一个随机种子
q = rand() % 21;//随机取出单词
l = strlen(wordlist[q]);//求取出单词的长度
for (int f = 0; f < l; f++)//定义一个空单词,词长与所选单词一致
{
guessword[f] = '-';
}
guessword[l] = '\0';//在字符串结尾添加'\0'
for(int f=0;f<l;f++)
{
printf("%c", guessword[f]);//输出“-”
}
int k,m=1;
for (k = 1; k <= guesstime&&c!=0;k++)//判断是否猜完
{
flag = 0;
printf("你还有%d次机会!Now k=%d \n", guesstime - k + 1,k);
getchar();
guess = getchar();
//判断输入的字母是否在单词中
for (int j = 0; j < l; j++)
{
if (guessword[j] == '-')//判断是否猜过这个字母
{
if (wordlist[q][j] == guess || (wordlist[q][j] - guess) == 32)//如果单词中有这个字母
{
guessword[j] = wordlist[q][j];//在空单词中打入这个字母
x++;
flag = 1;
}
}
}
if (flag == 0)//如果单词中没有这个字母
{
WrongGuess[t] = guess;
t++;
}
printf("%s", guessword);
if (x > y)
{
y = x;//如果x>y说明上一个字母猜对了,可以继续猜,不算下一次。
}
else
m++;
c = strcmp(guessword, wordlist[q]);//比较两字符串是否相等
}
if (c == 0)
{
printf("你成功猜出了单词!\n 正确单词为%s", wordlist[q]);
right++;
}
else
{
printf("很遗憾,没猜出...\n 正确单词为%s", wordlist[q]);
wrong++;
}
printf("在猜这个单词中,你猜对了%d个字母,猜错了%d个字母。\n", x, m - 1);
WrongGuess[t] = '\0';
if(strlen(WrongGuess)>0)
{
printf("错误字母分别是%s\n", WrongGuess);
}
}
void Input()
{
printf("请输入您的姓名:");
scanf("%s",temp.name);
}
void Result()
{
temp.right = right;
temp.wrong = wrong;
}
void Compare()
{
int i=0, j;
for (i = 0; i < 6&&strcmp(p[i].name,"unknown")!=0; i++)
{
if(temp.right>p[i].right)
{
for (j = 5; j > i; j--)
{
p[j]=p[j-1];//后移
}
p[i]=temp;//插入
return;
}
else if(temp.right==p[i].right)
{
if(temp.time<p[i].time)
{
for (j = 5; j > i; j--)
{
p[j]=p[j-1];
}
p[j]=temp;
return;
}
else if(temp.time>p[i].time)
{
for(j=5;j>i+1;j--){
p[j]=p[j-1];
}
p[j]=temp;
return;
}
}
}
p[i]=temp;
return;
}
//将结果写入txt中
void Record()
{
int i;
FILE *fp;
fp = fopen("record.txt", "r+");
if (!fp)
{
printf("游戏记录无法打开!");
exit(1);
}
fprintf(fp, "名次 姓名 成绩(猜对or猜错) 时间(s)\n");
for (i = 0; i < 5; i++)
{
fprintf(fp, "%d %s Right:%d Wrong:%d Time:%d\n", i + 1, p[i].name, p[i].right, p[i].wrong, p[i].time);
}
fclose(fp);
}
//展示结果
void Show()
{
int i;
FILE *fp;
fp = fopen("record.txt", "r+");
if (!fp)
{
printf("游戏记录无法打开!");
exit(1);
}
fprintf(stdout, "名次 姓名 成绩(猜对or猜错) 时间(s)\n");
for (i = 0; i < 5; i++)
{
fprintf(stdout, "%d %s Right:%d Wrong:%d %d\n", i + 1, p[i].name, p[i].right, p[i].wrong, p[i].time);
}
fclose(fp);
}
//开始游戏
void StartGame(char wordlist[21][11])
{
int t1, t2, t;
t1 = time(NULL);
int i;
right = 0;
wrong = 0;
for (i = 0; i < nums; i++)
{
char str[21][11] = { 0 };
printf("--------------------------------------\n请输入你要猜的字母,每次一个!\n");
OpenFile(str);
PlayGame(str);
}
t2 = time(NULL);
t = t2 - t1;
temp.time = t;
temp.right = right;
temp.wrong = wrong;
Compare();
Record();
printf("\n");
}
int main()
{
int p = 1;
while (p)//使得猜完单词或看完排行榜返回主菜单
{
Menu();
Record();
}
return 0;
}
void Menu()
{
int choice;
char wordlist[21][11];
system("title 猜字母游戏");
system("color f2");
printf("\n");
printf("-------------------猜单词游戏---------------\n");
printf("********************************************\n");
printf("************ 1 开始游戏 **************\n");
printf("************ 2 设置游戏 **************\n");
printf("************ 3 成绩排行 **************\n");
printf("************ 4 退出游戏 **************\n");
printf("请输入你的选择:");
scanf("%d", &choice);
while (choice<1 || choice>4)
{
printf("Please choice 1--4 again\n");
scanf("%d", &choice);
}
while(1)
{
if(choice==1)
{
Set();
Input();
StartGame(wordlist);
break;
}
if(choice==2)
{
SetGame();//调用设置函数
break;
}
if(choice==3)
{
Show();
break;
}
if(choice==4)
{
exit(0);
}
}
}
以上为实现模拟猜单词游戏的详细代码,感兴趣的可以自己动手操作起来!