模拟猜单词游戏

最近自学了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);
        }
    }
}

以上为实现模拟猜单词游戏的详细代码,感兴趣的可以自己动手操作起来!

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值