一.代码演示
#include <stdlib.h> #include <time.h> #include <stdio.h> //猜数字 void game() { //产生随机数 int ret = rand()%100+1; printf("%d\n", ret); //猜数字 int k = 0; while(1) { scanf("%d", &k); if (ret > k) { printf("猜小了\n"); } else if (ret < k) { printf("猜大了\n"); } else { printf("猜对了\n"); break; } } } void menu() { printf("*********************\n"); printf("****** 1.play *****\n"); printf("****** 0.exit *****\n"); printf("*********************\n"); } int main() { int count = 0; srand((unsigned)time(NULL)); menu(); int input = 0; do { scanf("%d", &input); switch (input) { case 1: printf("开始游戏\n"); count = 1; break;//这里的break只是为了不打印下面的情况 case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新尝试\n"); } break;//真正退出选项菜单 } while (input); if (count == 1) { game(); } return 0; }
这里为了方便演示,我把所猜数字打印出来。
二.菜单选择
一开始我们先打印一个关于菜单界面的函数。
void menu() { printf("*********************\n"); printf("****** 1.play *****\n"); printf("****** 0.exit *****\n"); printf("*********************\n"); } int main() { menu(); return 0; }
接下来对菜单进行选项判定,我们的初衷肯定是:选1进行游戏,选0退出游戏,选其他数提示错误并重新选择。其实本质上还是非0即真的原理。这里我用的是do while循环来控制它们。
int input = 0; do { scanf("%d", &input); switch (input) { case 1: printf("开始游戏\n"); count = 1; break;//这里的break只是为了不打印下面的情况 case 0: printf("退出游戏\n"); break; default: printf("输入错误,请重新尝试\n"); } break;//真正退出选项菜单 } while (input);
这里面有三个小细节,第一个是条件(input),这是菜单选项非0即真的核心。
第二是在case的最后都要打印break,不然会打印后面的情况。
第三就是在switch结束后再打印一个break,否则就一直在选择菜单里面,选了选项也跳不出循环。
三.游戏部分——创造随机数
这里有一个创造随机数的函数——rand(),
不过有一个弊端,不够随机。你会发现每一次游戏的随机顺序都是一样的。
这时候我们需要srand()来搭配使它随机,我们可以通过输入数字来改变rand一开始的随机值。
不过这又衍生了一个新的问题,srand里面必须也要随机数。
所以就有的时间戳的想法。time()是记录1970年开始以来的数字编码,它会实时增加,我们只需要赋予time(NULL)让它变化就行了。不过需要注意的是srand()的返回类型是unsigned int ,别忘了强制转换。
最后再通过模100+1来规定1-100之间的数字就行了。
void game() { //产生随机数 srand((unsigned)time(NULL)); int ret = rand()%100+1; printf("%d\n", ret); }
四.游戏部分——猜数字
这里可以说是最简单的部分了,先用while(1)搞个循环,最后来个基础判断就行了。
void game() { //产生随机数 int ret = rand()%100+1; printf("%d\n", ret); //猜数字 int k = 0; while(1) { scanf("%d", &k); if (ret > k) { printf("猜小了\n"); } else if (ret < k) { printf("猜大了\n"); } else { printf("猜对了\n"); break; } } }
后面有个小细节,就是时间戳不需要每一次都重新调用,这里会使随机值很接近,所以放到main主函数里就行了。结束~~~