猜数字游戏
实例说明:
猜数字游戏具体要求如下:开始时应输入要猜的数字的位数,这样计算机可以根据输入的位数随机分配一个符合要求的数据,计算机输出guess 后便可以输入数字,注意数字间需用空格或回车符加以区分,计算机会根据输入信息给出相应的提示信息:A表示位置与数字均正确的个数,B表示位置不正确但数字正确的个数,这样便可以根据提示信息进行下次输入,直到正确为止,这时会根据输入的次数给出相应的评价。
实现过程:
1. 打开 VC++6.0开发环境,新建一个C源文件,并输入要创建C 源文件的名称。
2. 引用头文件、进行宏定义及数据类型的指定,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h> // 用于 sleep 函数
3. 自定义函数guess(),作用是产生随机数并将输入的数与产生的数作比较,并将比较后的提示信息输出。代码如下:
// 猜数字的函数
void guess(int n) {
int acount, bcount, i, j, k = 0, flag, a[10], b[10];
do {
flag = 0;
srand((unsigned)time(NULL)); // 利用系统时钟设定种子
for (i = 0; i < n; i++)
a[i] = rand() % 10; /*每次产生 0~9 范围内任意的一个随机数并存到数组 a 中*/
for (i = 0; i < n - 1; i++) {
for (j = i + 1; j < n; j++)
if (a[i] == a[j]) /*判断数组 a 中是否有相同数字*/
{
flag = 1; /*若有上述情况则标志位置 1*/
break;
}
}
} while (flag == 1); /*若标志位置为 1 则重新分配数据*/
do {
k++; /*记录猜数字的次数*/
acount = 0; /*每次猜的过程中位置与数字均正确的个数*/
bcount = 0; /*每次猜的过程中位置不正确但数字正确的个数*/
printf("guess:");
for (i = 0; i < n; i++)
scanf("%d", &b[i]); /*输入猜测的数据到数组 b 中*/
for (i = 0; i < n; i++)
for (j = 0; j < n; j++) {
if (a[i] == b[i]) /*检测输入的数据与计算机分配的数据相同且位置相同的个数*/
{
acount++;
break;
}
if (a[i] == b[j] && i!= j) /*检测输入的数据与计算机分配的数据相同但位置不同的个数*/
{
bcount++;
break;
}
}
printf("clue on:%d A %d B\n\n", acount, bcount);
if (acount == n) { /*判断 acount 是否与数字的个数相同*/
if (k == 1)
printf("you are the topmost rung of Fortune's ladder!! \n\n");
else if (k <= 5)
printf("you are genius!!\n\n");
else if (k <= 10)
printf("you are cleaver!!\n\n");
else
printf("you need try hard!!\n\n");
break;
}
} while (1);
}
4. main()函数作为程序的入口函数,通过输入相应的数字选择不同的功能。代码如下 :
int main(int argc, char const *argv[]) {
int i, n;
while (1) {
system("clear"); // 替换 clrscr
printf("1.start game?(y/n)\n");
printf("2.Rule\n");
printf("3.exit\n");
printf("please choose:");
scanf("%d", &i);
switch (i) {
case 1:
system("clear"); // 替换 clrscr
printf("please input n:\n");
scanf("%d", &n);
guess(n);
sleep(5);
break;
case 2:
system("clear"); // 替换 clrscr
printf("\t\tThe Rules Of The Game\n");
printf("step1: input the number of digits\n");
printf("step2: input the number,separated by a space between two numbers\n");
printf("step3: A represent location and data are correct\n");
printf("\tB represent location is correct but data is wrong!\n");
sleep(10);
break;
case 3:
exit(0);
default:
break;
}
}
return 0;
}
运行结果:
主菜单
程序运行
技术要点:
本实例的关键是如何实现随机分配数据与核对输入数据的过程。利用系统时钟作为随机数的种子,将每次产生的0~9之间(包含0和9)的随机数存到数组a中,将从键盘中输入的数字存到数组b中,用数组b中的所有数与数组a中的每个数比较,通过统计位置与数据均相同的个数及统计位置不同但数据相同的个数来输出提示信息。玩游戏者可以根据提示信息调整输入的数据,当输入的所有数据与所产生的随机数全部相等(位置与数据均相等)时,根据输入猜测的次数给出相应的评价,以上就是设计猜数字游戏的核心算法。