前言
一、游戏菜单
二、游戏逻辑
1.用户选择
2.开始游戏
2.1 生成1~100的随机数
总结
前言
本文讲解使用C语言写一个猜数字小游戏(1~100),涉及到的语法为:循环、分支、随机数、函数
一、游戏菜单
一个游戏的最开始,往往是一个菜单,我们只需利用print函数,打印出一个简易菜单即可。
//游戏菜单
void menu()
{printf("******欢迎进入猜数字游戏******\n");printf("*********1、开始*************\n");printf("*********0、退出*************\n");printf("****************************\n");
}
二、游戏逻辑
1.用户选择
打印完菜单后,用户开始选择,在游戏逻辑中,无论是否开始游戏,都会运行一遍菜单,因此在这里使用do...while循环是最合适的。
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);
2.开始游戏
调用game()函数,在该函数可以分为两步:1、生成1~100的随机数;2、开始猜数字
2.1 生成1~100的随机数
生成随机数函数:rand();C语言规定,使用该函数需先定义一个随机数生成器:srand()
在MSDN上查找rand() 与 srand() 函数,看看它们的结构:
可以看到Remarks: The rand function returns a pseudorandom integer in the range 0 to RAND_MAX. Use the srand function to seed the pseudorandom-number generator before calling rand。意思为rand函数返回一个介于0到rand MAX范围内的伪随机整数。在调用rand之前,使用srand函数为伪随机数生成器提供种子。
rand()函数会生成0~rand_MAX之间的数,我们可以看看rand_MAX是什么:
RAND_MAX为32767的数,因此rand()会生成0~32767之间的数,我们再看看srand()函数:
该函数的参数,需要传递一个unsigned int 种子,这个种子需要是一个变化的值。我们来看看官方给的例子:
srand( (unsigned)time( NULL ) );
time()函数需要传递的参数为指针,返回值为一个time_t的指针,该指针为时间戳,下面我们看看时间戳的概念:
时间戳:当前时间点和计算机起始时间的一个差值,然后转换成秒
当然,使用这三个库函数也要包含对应的头文件:
stdlib.h --> rand、srand
time.h --> time
解释清楚后,我们该如何编写代码呢?
//游戏逻辑
void game()
{printf("游戏开始\n");//1、生成随机数//rand()函数(包含stdlib.h头文件) --> 生成随机数 --> 使用此函数需要先定义一个随机数生成器// srand(unsigned int 变化的数)int number = rand() % 100 + 1; //rand() % 某数 --> 0~某数-1 -->再进行+1 --> 1~某数int Num = 0;//2、猜数字while (1){printf("请输入:>");scanf("%d", &Num);if (Num > number){printf("猜大了!\n");}else if (Num < number){printf("猜小了!\n");}else{printf("恭喜你,猜对了!\n");break;}}
}
srand()函数生成一次就够了。当需要多次rand()时,不需要每一次都进行srand。如果每次rand都srand,则会导致生成的随机数不够随机,因此将srand定义在调用循环之前。
还有一点需要注意,关于生成1~100范围的随机数,对rand() % 最大范围 操作,可以生成0~最大范围-1 之间的数,再进行+1 则生成1~最大范围 的数。当需要自定义生成某一个范围之间的数时,可以这样做。
rand() % 100 +1
总结
好了,这就是用c语言简易版的猜数字小游戏,下面是完整代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>//游戏菜单
void menu()
{printf("******欢迎进入猜数字游戏******\n");printf("*********1、开始*************\n");printf("*********0、退出*************\n");printf("****************************\n");
}
//游戏逻辑
void game()
{printf("游戏开始\n");//1、生成随机数//rand()函数(包含stdlib.h头文件) --> 生成随机数 --> 使用此函数需要先定义一个随机数生成器// srand(unsigned int 变化的数)int number = rand() % 100 + 1; //rand() % 某数 --> 0~某数-1 -->再进行+1 --> 1~某数int Num = 0;//2、猜数字while (1){printf("请输入:>");scanf("%d", &Num);if (Num > number){printf("猜大了!\n");}else if (Num < number){printf("猜小了!\n");}else{printf("恭喜你,猜对了!\n");break;}}
}
//猜数字游戏
//范围1~100
int main()
{int input = 0;// srand往往只需调用一次,在一个程序调用多次会让随机数不够随机//包含stdlib.h头文件srand((unsigned int)time(NULL)); //time()-->包含time.h头文件函数会返回时间戳,是变化的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;
}