引言
这是之前接的一单,要求用时间库和线程库实现一个猜数字小游戏。其实只用时间库就OK了,用线程库反而会变得麻烦,可能老师是想用这个小作业训练一下大家对线程库的基本使用。
功能简介
- 设置每一轮游戏的时间
- 开始一轮游戏
- 显示当前游戏统计数据
代码
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;
}
运行结果
两种版本只是实现方式略有差异,运行结果是完全相同的。