猜数字游戏
1.游戏可以重复玩(打印一个游戏菜单提示)-至少执行一次
2.程序会生成1-100之间的随机数
3.猜数字
(1)猜小了,程序会告诉你猜小了,继续猜
(2)猜大了,程序会告诉你猜大了,继续猜
(3)猜对了,程序会告诉:恭喜你猜对了,程序结束
写代码:不是一行一行的抄写,是想到哪写到哪
并且要一边写一边测试(才不会出现很多错误)
1.框架
#include<stdio.h> void menu() { printf("**************************\n"); printf("***** 1.play *****\n"); printf("***** 0.exit *****\n"); printf("**************************\n"); } int main() { int input = 0;//玩不玩游戏的循环判断条件(作用域) do { //打印菜单 menu(); printf("请选择\n");//提示你输入 scanf("%d", &input); //多分支语句 switch (input) { case 1: printf("猜数字\n"); break;//实现分支,跳出switch case 0: printf("退出游戏\n"); break; default: printf("选择错误,请重新选择\n"); break; } } while (input); return 0; }
这里我们就先测试一次,可以吗,可以就继续写
2.生成随机数
(1)第二次测试
#include<stdio.h> #include<stdlib.h>//rand-头文件 void menu() { printf("**************************\n"); printf("***** 1.play *****\n"); printf("***** 0.exit *****\n"); printf("**************************\n"); } //rand函数是专门用来生成随机数的 //int rand(void)-返回的是0-RAND_MAX之间的一个随机数 //#define RAND_MAX 0x7fff //0x7fff=32767 void game()//void-空-不用返回参数 { //1、生成随机数 int ret = rand(); printf("%d\n",ret); //2、猜数字 } int main() { //RAND_MAX;//鼠标右键查找转到定义 int input = 0;//玩不玩游戏的循环判断条件(作用域) do { //打印菜单 menu(); printf("请选择\n");//提示你输入 scanf("%d", &input); //多分支语句 switch (input) { case 1: //printf("猜数字\n"); game();//game()函数是猜数字的整个逻辑 break;//实现分支,跳出switch case 0: printf("退出游戏\n"); break; default: printf("选择错误,请重新选择\n"); break; } } while (input); return 0; }
1、rand函数是专门用来生成随机数的
格式:int rand(void)-返回的是0-RAND_MAX之间的一个随机数
#define RAND_MAX 0x7fff
0x7fff=32767
2、rand的头文件“stdlib.h”
这时我们运行两次程序,发现了第一次和第二次运行生成的随机数一样!如下:大家可以试试。
rand函数是返回0-32767之间的伪随机数
改正:rand函数在使用之前要使用一个srand函数来设置随机数的生成器(生成起点)
srand函数-设置随机数的生成器(生成起点)
格式:void srand(unsigned int seed)
返回值:void-不返回,就是没有
参数:unsigned int seed-无符号的整形种子,就是自然数
srand的头文件:“stdlib.h”
#include<stdlib.h> #include<stdio.h> int main() { int i = 0; for (i = 0; i < 10; i++) { srand(1);//随机数生成器 int ret = rand();//生成随机数 printf("%d\n", ret); } return 0; }
注:由上可看出 srand函数只需调用一次就可以了,不要频繁调用(生成起点一样,随机数不够随机)
只调用一次----放在main中
#include<stdlib.h> #include<stdio.h> int main() { srand(1);//随机数生成器 int i = 0; for (i = 0; i < 10; i++) { int ret = rand();//生成随机数 printf("%d\n", ret); } return 0; }
这个时候我们很高兴生成了随机数,但是当我们多次运行的时候又发现每一次运行生成的随机数又是一样的了。
这个时候该怎么办呢?
参数:要一个随机数?不又死循环了吗?
要一个变化的值--->时间不就是一直在变吗--->时间戳
在C语言中,time函数会返回时间戳
格式:time_t time(time_t* timer)
参数:(定时器)(1)指向存储时间值的类型对象的指针;(2)不使用参数,此参数可以是NULL指针(NULL-空指针)
返回值:读取成功,返回作为time_t对象的当前日历时间(就是一个整形数字);读取失败,返回of
time头文件:“time.h”
#include<stdlib.h> #include<stdio.h> #include<time.h> int main() { srand((unsigned int)time(NULL));//随机数生成器 int i = 0; for (i = 0; i < 10; i++) { int ret = rand();//生成随机数 printf("%d\n", ret); } return 0; }
这个时候我们才能每次都生成不同的随机数
3.猜数字
#include<stdio.h> #include<stdlib.h>//rand和srand-头文件 #include<time.h>//time-头文件 void menu() { printf("**************************\n"); printf("***** 1.play *****\n"); printf("***** 0.exit *****\n"); printf("**************************\n"); } //rand函数是专门用来生成随机数的 //int rand(void)-返回的是0-RAND_MAX之间的一个随机数 //#define RAND_MAX 0x7fff //0x7fff=32767 void game()//void-空-不用返回参数 { //1、生成随机数 int ret = rand()%100+1;//任意数%100=0-99,这时我们要1-100的数 //2、猜数字 int num = 0; while (1) { printf("请猜数字\n"); scanf("%d", &num); if (num < ret) printf("猜小了,继续猜\n"); else if (num > ret) printf("猜大了,继续猜\n"); else { printf("恭喜你猜对了,还要玩吗?\n"); break; } } } int main() { //RAND_MAX;//鼠标右键查找转到定义 int input = 0;//玩不玩游戏的循环判断条件(作用域) srand((unsigned int)time(NULL));//随机数生成器 do { //打印菜单 menu(); printf("请选择\n");//提示你输入 scanf("%d", &input); //多分支语句 switch (input) { case 1: //printf("猜数字\n"); game();//game()函数是猜数字的整个逻辑 break;//实现分支,跳出switch case 0: printf("退出游戏\n"); break; default: printf("选择错误,请重新选择\n"); break; } } while (input); return 0; }
我们基础的猜数字游戏就完成了,大家可以去试试吧
任意一个数%100=0-99--->想要0-100:任意数%100+1
做一个优化加强版的猜数字游戏:
总体思路大致相同:
1、优化页面--玩一次删除一次页面
2、设置游戏难度--即限制猜数字的次数
//加强版猜数字 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<windows.h> void menu() { printf("************************************\n"); printf("******* 1.play ********\n"); printf("******* 0.exit ********\n"); printf("************************************\n"); } void page() { printf("*************************************\n"); printf("******* 10.简单 ********\n"); printf("******* 5.中等 ********\n"); printf("******* 3.困难 ********\n"); printf("*************************************\n"); } void game() { //1、生成随机数1-100 int ret = rand()%100+1;//1、头文件“stdlib.h”2、前面要随机数生成器 //2.选择难度,猜数字 //打印难度页面 page(); printf("请选择难度:>\n"); int num = 0;//变量,猜数字 int flat = 0;//判断失败的变量 int diffculty = 0;//游戏难度 scanf("%d", &diffculty); int i = 0;//猜数字次数 for (i = 0; i < diffculty; i++)//控制猜的次数 { if (diffculty!= 10 && diffculty!= 5 && diffculty != 3) { printf("输入错误,游戏重新开始\n"); break;//终止循环 } printf("请猜数字\n"); scanf("%d", &num); if (ret > num) { printf("猜小了,你还剩余%d次机会", diffculty - ++i); } else if (ret < num) { printf("猜大了,你还剩余%d次机会", diffculty - ++i); } else { flat = 1; printf("恭喜你猜对了,还要玩吗?\n"); break; } } if (0 == flat) { printf("很遗憾,你失败了,建议降低难度。\n"); } Sleep(2000);//Sleep函数是实现睡眠,单位是毫秒;头文件“windows.h” system("cls");//system是一个库函数,可以执行系统命令,cls是清空屏幕的一个命令;头文件"stdlib.h" } int main() { int input = 0;//玩不玩的变量 srand((unsigned int)time(NULL)); do { //打印菜单 menu(); printf("请选择:>"); scanf("%d", &input); switch (input)//多分支语句 { case 1: game();//game函数是猜数字的整个逻辑 break; case 0: printf("退出游戏\n"); break; default : printf("选择错误,请重新选择\n"); break; } } while (input); return 0; }