初级版本
什么是幸运数字游戏呢?就是说在1到10中找到缺少的数字。 比如:1、2、3、4、6、7、8、9、10 缺少的是5 那么我们怎么创建呢? 我们要在一组数字中找到缺少的数字,并且要找很多次才能结束,而不是找一次就够了。所以我们创建两个数组,一个完整数字的初始数组(如1到10),一个目标数组,然后创建10以内的随机值。如果数组的下标等于随机值,我们就不往目标数组里面放,否则就往目标数组里面放数字。 总的来说就是复制数组时跳过一个数组的元素,然后打印目标数组元素就会缺少一个数字了。 但是怎么产生随机值呢?如果不了解的朋友阔以看看我这篇文章:猜数字游戏,里面有讲解哈。 代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <time.h>
#include <stdio.h>
#define MAX 10
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int a[9] = { 0 };
double tmp = 0;
srand((unsigned long)time(NULL));
int stage = 0;
int y = 0;
for (stage = 0; stage < MAX; stage++)
{
int i = 0, j = 0;
int x = rand() % 10;
while (i < 10)
{
if (x != i)
{
a[j] = arr[i];
j++;
}
i++;
}
printf("请找出下面缺少的数字:\n");
for (i = 0; i < 9; i++)
{
printf("%d ", a[i]);
}
printf("\n\n");
do
{
scanf("%d", &y);
if (arr[x] != y)
{
printf("找错了,请重新输入:");
}
} while (arr[x] != y);
}
return 0;
}
图片分析: 程序运行结果如下:
中级版本
问题来了,我们找出缺少的数字不难,但是怎么区分快慢呢?我们玩游戏玩多了肯定有熟练嘛 有的人第一次用了50秒才全部找出来了,第二次用20秒就找出来。速度明显提升很快嘛,那怎么样才能看到进步呢?不错,就是看用的时间长短。 我们阔以用clock函数来统计我们用的时间。 用法如下:
C库函数 | clock() |
---|
头文件 | #include <time.h> | 声明 | clock_t clock(void) | 功能 | 求处理器调用某个进程所花费的时间 | 描述 | C 库函数 clock_t clock(void) 返回程序执行起(一般为程序的开头),处理器时钟所使用的时间。为了获取 CPU 所使用的秒数,您需要除以 CLOCKS_PER_SEC。 | 返回值 | 该函数返回自程序启动起,处理器时钟所使用的时间。如果失败,则返回 -1 值。在 32 位系统中,CLOCKS_PER_SEC 等于 1000000,该函数大约每 72 分钟会返回相同的值 |
还有我们用到了clock_t 这样的类型,其实种类型是头文件 time.h 中已经定义了,其实就是unsigned类型,所以我们只需要设两个clock_t 变量就阔以了。
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int a[9] = { 0 };
double tmp = 0;
clock_t start = 0, end = 0;
srand((unsigned long)time(NULL));
int stage = 0;
int y = 0;
start = clock();
for (stage = 0; stage < MAX; stage++)
{
int i = 0, j = 0;
int x = rand() % 10;
while (i < 10)
{
if (x != i)
{
a[j] = arr[i];
j++;
}
i++;
}
printf("请找出下面缺少的数字:\n");
for (i = 0; i < 9; i++)
{
printf("%d ", a[i]);
}
printf("\n");
do
{
scanf("%d", &y);
if (arr[x] != y)
{
printf("找错了,请重新输入:");
}
} while (arr[x] != y);
}
end = clock();
tmp = (end - start)/CLOCKS_PER_SEC;
printf("用的时间为:%.1f秒\n", tmp);
if (tmp > 35.0)
{
printf("反应太慢了\n");
}
else if (tmp > 30.0)
{
printf("反应有点慢呀\n");
}
else if (tmp > 20.0)
{
printf("反应还阔以\n");
}
else
{
printf("反应太快了吧\n");
}
return 0;
}
图片解析如下: 程序运行结果:
高级版本
我们玩游戏过程似乎发现有个问题,那就是数字1到10是有顺序的,我们玩多了找的就越来越快,对我们训练提升不大。所以我们想办法把1到10的数字打乱一下,令我们的难度增大一点。 那怎么实现呢?思路如下: 我们前面已经实现了抽调一个数字的数字,我们把数字的元素打乱重新排列 从a[0] ~ a[8]中随机选择一个元素和a[8]进行交换 从a[0] ~ a[7]中随机选择一个元素和a[7]进行交换 从a[0] ~ a[6]中随机选择一个元素和a[6]进行交换 从a[0] ~ a[5]中随机选择一个元素和a[5]进行交换 ····· 图片解析:
我们通过产生随机值下标 j 和a[i] 进行交换,如果碰巧i 等于 j 那就不交换。 过程代码如下:
for (i = 8; i >= 0; i--)
{
int j = rand() % (i + 1);
if (j != i)
{
int tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
而且我们还要玩很多把,所以再建立一个菜单让我们选择还玩不玩。 最后再把我们的函数封装成一个模块就阔以了。 最终代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#define MAX 10
void menu()
{
printf("***********************************\n");
printf("**** 1.玩幸运数字游戏 ********\n");
printf("**** 0.退出游戏 ********\n");
printf("***********************************\n");
}
void fun(int x)
{
if (x > 55.0)
{
printf("反应太慢了\n");
}
else if (x > 50.0)
{
printf("反应有点慢呀\n");
}
else if (x > 40.0)
{
printf("反应还阔以\n");
}
else
{
printf("反应太快了吧\n");
}
}
void Game()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int a[9] = { 0 };
double tmp = 0;
clock_t start = 0, end = 0;
srand((unsigned long)time(NULL));
int stage = 0;
int y = 0;
start = clock();
for (stage = 0; stage < MAX; stage++)
{
int i = 0, j = 0;
int x = rand() % 10;
while (i < 10)
{
if (x != i)
{
a[j] = arr[i];
j++;
}
i++;
}
for (i = 8; i >= 0; i--)
{
int j = rand() % (i + 1);
if (j != i)
{
int tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
}
printf("请找出下面缺少的数字:\n");
for (i = 0; i < 9; i++)
{
printf("%d ", a[i]);
}
printf("\n");
do
{
scanf("%d", &y);
if (arr[x] != y)
{
printf("找错了,请重新输入:");
}
} while (arr[x] != y);
}
end = clock();
tmp = (end - start) / CLOCKS_PER_SEC;
printf("用的时间为:%.1f秒\n", tmp);
fun(tmp);
}
int main()
{
int input = 0;
do
{
menu();
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)
{
case 1: Game();
break;
case 0:printf("退出游戏\n");
break;
default: printf("输入错误,请重新选择:\n");
break;
}
} while (input);
return 0;
}
游戏游戏结果:
总结
这就是幸运数字游戏的一步步演变了,我们做游戏过程中运用了很多的库函数,让我们学习到了很多新的东西,大家还要什么想法或者改进的地方欢迎在评论区探讨哦。
都看到这里了,来点个赞咯。
|