C语言猜数字小游戏(时间库+线程库)

引言

这是之前接的一单,要求用时间库和线程库实现一个猜数字小游戏。其实只用时间库就OK了,用线程库反而会变得麻烦,可能老师是想用这个小作业训练一下大家对线程库的基本使用。

功能简介

  1. 设置每一轮游戏的时间
  2. 开始一轮游戏
  3. 显示当前游戏统计数据

代码

1.0版(时间库)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int TIME = 30;            //游戏时间
int sum = 0, correct = 0; //总局数和获胜的局数

void Show()
{
    printf("    **********************************************\n");
    printf("    *                 猜数字小游戏               *\n");
    printf("    **********************************************\n");
    printf("    *               总局数:%-3d                  *\n", sum);
    printf("    *               获胜局数:%-3d                *\n", correct);
    printf("    **********************************************\n");
}

void Game()
{
    int answer = rand() % 10000 + 1; //正确答案
    int x;
    int start = time(NULL);
    printf("    **********************************************\n");
    printf("    *                  游戏开始!                *\n");
    printf("    **********************************************\n");
    while (1)
    {
        printf("    **********************************************\n");
        printf("    *               剩余时间:%4d秒             *\n", TIME - (time(NULL) - start));
        printf("    **********************************************\n");
        printf("请输入一个整数:");
        scanf("%d", &x);
        if (TIME - (time(NULL) - start) <= 0)
        {
            printf("很遗憾,未能在规定时间内猜出正确数字,该数字为%d\n", answer);
            sum++;
            break;
        }
        if (x > answer)
            printf("高了!\n");
        else if (x < answer)
            printf("低了!\n");
        else
        {
            printf("恭喜!正确猜出数字%d\n", x);
            sum++;
            correct++;
            break;
        }
    }
}

int main()
{
    srand(time(NULL)); //设置随机数种子
    while (1)
    {
        printf("    **********************************************\n");
        printf("    *                 猜数字小游戏               *\n");
        printf("    **********************************************\n");
        printf("    *               1. 设置游戏时间              *\n");
        printf("    *               2. 开始游戏                  *\n");
        printf("    *               3. 数据统计                  *\n");
        printf("    *               0. 退出游戏                  *\n");
        printf("    **********************************************\n");
        int i = -1;
        while (i < 0 || i > 3)
        {
            printf("请选择:");
            scanf("%d", &i);
        }
        switch (i)
        {
        case 1:
            printf("    *********************************************\n");
            printf("    *            当前游戏时间:%4d秒            *\n", TIME);
            printf("    *********************************************\n");
            printf("请设置游戏时间(秒):");
            scanf("%d", &TIME);
            printf("成功设置游戏时间为%4d秒!\n", TIME);
            break;
        case 2:
            Game();
            break;
        case 3:
            Show();
            break;
        case 0:
            exit(0);
            break;
        }
        system("pause");
    }
    return 0;
}
2.0版(加线程库)

这里用的线程库是<pthread.h>,在VS中需要一些配置,在gcc编译器中可以直接使用。2.0版本并没有实现当时间结束时强制退出的功能,可以通过exit()实现强制退出程序,但不能实现停止等待用户输入的状态。

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <time.h>
int TIME = 30;            //游戏时间,单位为秒
int sum = 0, correct = 0; //总局数和获胜的局数
int end = 0;              //时间是否结束,1为结束,0为未结束且未猜出数字,-1为时间未结束且猜出数字

void timer();//监控时间
void Game();//开始游戏
void Show();//显示局数

void Show()//显示局数
{
    printf("    **********************************************\n");
    printf("    *                 猜数字小游戏               *\n");
    printf("    **********************************************\n");
    printf("    *               总局数:%-3d                  *\n", sum);
    printf("    *               获胜局数:%-3d                *\n", correct);
    printf("    **********************************************\n");
}

//子线程,监控时间
void timer()
{
    time_t start = time(NULL);//开始时间 
    while(1)
    {
        if(end==-1)//时间未到成功猜出数字
            break;
        if(time(NULL)-start>=TIME)//超时
        {
            end = 1;//时间结束
            break;
        }
    }
}

void Game()//开始游戏
{
    pthread_t P;//定义线程P
    int flag = pthread_create(&P, NULL, (void*)timer, NULL);//创建线程,调用timer函数 
    if(flag ==-1)//0表示成功;-1表示失败
    {
        printf("创建线程失败!\n");
        return;
    }
    time_t start = time(NULL);//开始时间 
    int answer = rand() % 10000 + 1; //正确答案
    int x;
    end = 0;
    printf("    **********************************************\n");
    printf("    *                  游戏开始!                *\n");
    printf("    **********************************************\n");
    while (1)
    {
        printf("    **********************************************\n");
        printf("    *               剩余时间:%4d秒             *\n", TIME - (time(NULL) - start));
        printf("    **********************************************\n");
        printf("请输入一个整数:");
        scanf("%d", &x);
        if (end)//时间到了
        {
            printf("很遗憾,未能在规定时间内猜出正确数字,该数字为%d\n", answer);
            sum++;
            pthread_join(P, NULL);//等待线程P结束
            break;
        }
        if (x > answer)
            printf("高了!\n");
        else if (x < answer)
            printf("低了!\n");
        else
        {
            printf("恭喜!正确猜出数字%d\n", x);
            sum++;
            correct++;
            end = -1;//退出timer函数
            break;
        }
    }
}

int main()
{
    srand(time(NULL)); //设置随机数种子
    while (1)
    {
        printf("    **********************************************\n");
        printf("    *                 猜数字小游戏               *\n");
        printf("    **********************************************\n");
        printf("    *               1. 设置游戏时间              *\n");
        printf("    *               2. 开始游戏                  *\n");
        printf("    *               3. 数据统计                  *\n");
        printf("    *               0. 退出游戏                  *\n");
        printf("    **********************************************\n");
        int i = -1;
        while (i < 0 || i > 3)
        {
            printf("请选择:");
            scanf("%d", &i);
        }
        switch (i)
        {
            case 1:
                printf("    **********************************************\n");
                printf("    *            当前游戏时间:%4d秒            *\n", TIME);
                printf("    **********************************************\n");
                printf("请设置游戏时间(秒):");
                scanf("%d", &TIME);
                printf("成功设置游戏时间为%4d秒!\n", TIME);
                break;
            case 2:
                Game();
                break;
            case 3:
                Show();
                break;
            case 0:
                exit(0);
                break;
        }
        system("pause");
    }
    return 0;
}

运行结果

两种版本只是实现方式略有差异,运行结果是完全相同的。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部