前言:
题目:
1.随机数在1-100之间
2.猜数字
1>猜小了,程序会告诉你猜小了。继续猜
2>猜大了,程序会告诉你猜大了。继续猜
3>猜对了,程序会告诉:恭喜你猜对了。结束
3.游戏可以反复玩
4.打印菜单
先上总代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void menu() //打印菜单
{
printf("**************************\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("**************************\n");
}
void game() //游戏的基础逻辑
{
int num = 0;
int ret = rand()%100+1;
while (1)
{
printf("请猜数字:>");
scanf("%d", &num);
if (num < ret)
{
printf("猜小了\n");
}
else if (num > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); //srand库函数的随机数发生器
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;
}
接下来我们一段一段解析
一.首先确定主体该怎么写
#include<stdio.h>
void menu() //由于菜单不需要返回值,所以用void
{
printf("**************************\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("**************************\n");
}
int main()
{
int input=0; //初始化输入值;
//猜数字游戏要先猜一次,所以使用do while循环
//判断条件就可以用input来判断,由于在C语言中0为假,非零为真。
do
{
menu(); //先打印菜单
scanf("%d",&input);
}while(input)
return 0;
}
我们再开始把菜单打印出来,在进一步写下去。
小tips:在C语言,每写完一小段最好编译一下,更好的发现代码的BUG,而不是写完全部在找BUG
二.写游戏的逻辑
紧接上文,我们继续写主函数里面,总体的思路该怎么走
#include<stdio.h>
#include<windows.h> //windows 库函数头文件
void menu() //由于菜单不需要返回值,所以用void
{
printf("**************************\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("**************************\n");
}
int main()
{
int input=0; //初始化输入值;
//猜数字游戏要先猜一次,所以使用do while循环
//判断条件就可以用input来判断,由于在C语言中0为假,非零为真。
do
{
menu(); //先打印菜单
scanf("%d",&input);
switch(input) //用非0和0来判断真假
{
case 1:
printf("游戏即将开始\n");
game() //设置一个game函数,不需要返回值
break;
case 0:
printf("即将退出游戏\n");
Sleep(1500) //使用Sleep库函数是实现睡眠,单位是毫秒,使代码打印慢一些。
system("cls"); // 使用Windows库函数,该代码的意思为清空页面
//使得每次游戏结束时清空屏幕。
break;
defalut:
printf("选择错误,请重新选择\n");
break;
}
}while(input)
return 0;
}
ok,现在总体的思路我们已经写清楚了。接下来就是game函数的编写,要实现它该怎么做呢?
我们一步一步跟随主函数的思路写
//单独写出game函数(自定义函数)
void game() //游戏是由输入值进来,所以不需要返回值,故使用void。
{
int num =0; //应题目要求我们应该生成随机数,在c语言中可以使用rand
int ret=rand()%100+1 //rand的返回值用ret来接受
//由于题目要求为1-100,所以%100之后范围就为1-99,之后再加一个1就满足题目条件
//接下来开始猜数字游戏的主体逻辑
while(1) //游戏可以重复玩,可以使用循环;
{
scanf("%d",&num);
if(num>ret)
printf("猜大拉\n");
if(num<ret)
printf("猜小拉\n");
else
{
printf("恭喜你,猜对啦\n");
break; //出循环
}
}
}
ok,现在游戏的逻辑我们就写完啦~
如果我们把一和二拼接起来,编译运行起来,会发现,每次猜的数字并不随机而且,非常相近。
这是怎么回事呢?
进一步说明下:计算机并不能产生真正的随机数,而是已经编写好的一些无规则排列的数字存储在电脑里,把这些数字划分为若干相等的N份,并为每份加上一个编号用srand()函数获取这个编号,然后rand()就按顺序获取这些数字。当srand()的参数值固定的时候,rand()获得的数也是固定的,所以一般srand的参数用time(NULL),因为系统的时间一直在变,所以rand()获得的数,也就一直在变,相当于是随机数了。只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟。如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子。
小tips:rand函数在使用之前要是用一个srand来设置随机数的生成器
所以我们需要用time函数来获得系统时间,这样就是完全的随机数。
我们只需要在主函数调用一次就够了,不需要多次调用。
int main()
{
int input = 0;
srand((unsigned int)time(NULL)); //用空指针,程序就不需要参数获得数据。
//time_t型数据转化为(unsigned)型再传给srand函数
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;
}
ok这样我们就大功告成啦~。将它们拼接起来就是
#include<stdio.h>
#include<windows.h> //windows 库函数头文件
#include<time.h>
#include<stdlib.h>
void menu() //由于菜单不需要返回值,所以用void
{
printf("**************************\n");
printf("****** 1. play ******\n");
printf("****** 0. exit ******\n");
printf("**************************\n");
}
void game()
{
int num = 0;
int ret = rand() % 100 + 1;
while (1)
{
printf("猜数字:");
scanf("%d", &num);
if (num < ret)
{
printf("猜小了\n");
}
else if (num > ret)
{
printf("猜大了\n");
}
else
{
printf("恭喜你,猜对了\n");
Sleep(2000);
system("cls");
break;
}
}
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
printf("游戏即将开始\n");
game();
break;
case 0:
printf("即将退出游戏\n");
Sleep(1500);
system("cls");
break;
default:
printf("选择错误,请重新选择\n");
break;
}
} while (input);
return 0;
}
大功告成润咯~