好久不见啊,假期期间复习了一些学校学习的知识,整合成了一个小程序,一起来看一下吧。
因为程序包含多个功能,所以我创立了不同的函数模块,使各个模块分开设计,互不干扰。
首先是一个菜单标题页,因为不需要返回值,所以我们直接使用void来定义函数。
一:用menu1来作为函数名
void menu1()
{
printf("********************\n");
printf("**** 请设置密码 ****\n");
printf("********************\n密码:");
}
实现效果如下
二:密码设置及进入
接下来就是第二个模块,设置密码,然后输入密码,并且有三次的输入机会,三次输入错误则退出程序。
输入密码
void password()//密码块
{
char pass[10] ={0}; //定义一个字符串,用来存放设置的密码
scanf("%s", pass); //输入密码
printf(" !设置成功!\n!解锁后开始游戏!\n");//设置成功后开始输入密码进入游戏
printf("请输入密码:"); //pass字符串是正确的密码
char word[10] ={0}; //word字符串是后来输入的,我们要将其进行比对
然后我们用接下来的程序实现三次错入机会的效果
int i = 0; //定义一个变量,主意这个变量定义在函数内部
while (i < 3) //其作用域只有这个函数当“ i ”小于三时进入循环
{
scanf("%s", word); //输入密码,存到word
if ((strcmp(word,pass))==0) //用strcmp来将先后输入的密码进行比对
{
printf("输入正确\n游戏开始\n"); //如果一样,则表明输入正确并退出循环
break;
}
else if (i != 3) //其他情况则表明输入错误
{
printf("输入错误,请再次尝试\n");
}
i++; //i++没有放到循环体的最后,因为这会影响到最后一条if语句的判断
if (i == 3) //因为i= 3时就不会再进入循环所以,要先让i加一再判断这条if语句
{
printf("三次错误输入,程序已结束运行");
Sleep(900); //时程序暂停900毫秒,使看起来舒适
int* p = &ip;
*p = 0;
break;
}
}
还记得最开始定义的一个整形变量ip吗?他就要用在这里了
int* p = &ip;
*p = 0;
break;
因为这个实参变量ip在函数外部,我们要想影响到它的真实值就要使用指针,如果三次不成功则做一个记号,将原本为1的ip变为0,再在主函数外部进行检测判断,如果ip等于0则直接退出程序。
其实也可以直接使用exit(0);这个指令直接替换掉这三条语句,但是想到了指针的知识所以使用了一下,想要简单粗暴的方法的话替换掉就好。
实现效果如下
三:引导及进一步确认
接下来就进入到游戏的部分了,猜数字游戏的主体前还需要一个引导环节,游戏模块,当然在它之前也需要一个菜单界面,我们给他来安排一下。
int menu2()//菜单块2 //菜单,打印就好
{
printf("*******************************\n");
Sleep(1000);
printf("*********1.开始游戏************\n");
Sleep(1000);
printf("*********2.退出游戏************\n");
Sleep(1000);
printf("*******************************\n");
printf("请输入1或2》——");
int i = 0; //创建临时变量,用于选择
scanf("%d", &i); //开始选择 //使用到了switch case语句
switch (i)
{
case(1): //开始游戏
printf("Loding"); //这就是一个小操作实现等待的效果,loding效果
for (int i = 0; i <= 6; i++)
{
printf(". ");
Sleep(900);
}
system("cls"); //清屏指令,使以后的界面不至于那么复杂
printf("游戏启动成功");
printf("\a");
Sleep(2000);//暂停一会,然后清屏
system("cls");
printf("开始猜数>>___");
break; //case结束后紧跟break紧跟break是个好习惯
case(2): //退出程序
printf("游戏已结束......");
exit(0); //正常结束程序
break;
default: //习惯性加一个其他选项避免无法执行
printf("错误!请重新输入");
int menu2();
break;
}
return 0;
}
动态展示一下
四:正式游戏
最后就是最重要的游戏板块了
void game()//游戏块
{
//生成随机数
int num = 0,c=0;
srand((unsigned int)time(NULL)); //这里用到了srand函数来生成随机数,详细介绍见文本
num = (rand()%100)+1; //这里限制一下随机数的范围是0到100,以不至于太难猜到
int n = 0; //因为取余100后的数字一定在100以内
do //这里用do while 循环来作为猜数字的过程
{
while ((scanf("%d", &c))) //用scanf返回值的特性做到多次输入的效果
{
if (c > num) //猜的大了或小了就显示相应的提示
{
system("cls"); //用这个指令来做到清屏
printf("猜大了\n");
}
if (c < num)
{
system("cls");
printf("猜小了\n");
}
if (c == num) //当然等于的话就是猜到了,要退出循环
{
system("cls");
printf("猜对了!!恭喜!!!\n");
break;
}
}
printf("是否再来一次?输入0或1\n>>__"); //这里加了个小操作,当你想再来一次的话
scanf("%d", &n); //输入1就好了
if (n == 1)
{
printf("开始猜数》》__");
}
} while (n == 1); //当n = 1时会再次进入大循环,然后进入小循环形成闭环
具体来说一下这个生成随机数的函数
srand((unsigned int)time(NULL));
我们简单使用srand语句的话会发现每次生成的随机数都一样没有可玩性,十分的单调,不能做到完全的随机,所以我们需要借助一个时刻在变化的东西,对就是“时刻”在变化,也就是时间戳,它随着时间的变动不断变化,这个参数每时每刻都是不一样的,现在我们将这个参数作为生成随机数的参考,这样就能做到每次进入游戏它生成的随机数都不一样了。获取方法就是
time(NULL),头文件#include<time.h>,(unsigned int)是用来强制类型转化的,为符合函数结构,不必过多在意。
到这里介绍得就差不多了,接下来上总结:此次小常识用到了do while,指针,system指令,还有随机数的生成。有深刻想法的同志们欢迎在评论区交流。最后留下一份纯净版,需要的同学可以直接拷走。
整体版本
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<time.h>
#include<string.h>
#include <windows.h>
int ip = 1;
void menu1()
{
printf("********************\n");
printf("**** 请设置密码 ****\n");
printf("********************\n密码:");
}
void password()//密码块
{
char pass[10] ={0};
scanf("%s", pass);
printf(" !设置成功!\n!解锁后开始游戏!\n");
printf("请输入密码:");
char word[10] ={0};
int i = 0;
while (i < 3)
{
scanf("%s", word);
if ((strcmp(word,pass))==0)
{
printf("输入正确\n游戏开始\n");
break;
}
else if (i != 3)
{
printf("输入错误,请再次尝试\n");
}
i++;
if (i == 3)
{
printf("三次错误输入,程序已结束运行");
Sleep(900);
int* p = &ip;
*p = 0;
break;
}
}
}
int menu2()//菜单块2
{
printf("*******************************\n");
Sleep(1000);
printf("*********1.开始游戏************\n");
Sleep(1000);
printf("*********2.退出游戏************\n");
Sleep(1000);
printf("*******************************\n");
printf("请输入1或2》——");
int i = 0;//创建临时变量,用于选择
scanf("%d", &i);//开始选择
switch (i)
{
case(1):
printf("Loding");
for (int i = 0; i <= 6; i++)
{
printf(". ");
Sleep(900);
}
system("cls");
printf("游戏启动成功");
printf("\a");
Sleep(2000);//暂停一会,然后清屏
system("cls");
printf("开始猜数>>___");
break;
case(2):
printf("游戏已结束......");
exit(0);//正常结束程序
break;
default:
printf("错误!请重新输入");
int menu2();
break;
}
return 0;
}
void game()//游戏块
{
//生成随机数
int num = 0,c=0;
srand((unsigned int)time(NULL));
num = (rand()%100)+1;
int n = 0;
do
{
while ((scanf("%d", &c)))
{
if (c > num)
{
system("cls");
printf("猜大了\n");
}
if (c < num)
{
system("cls");
printf("猜小了\n");
}
if (c == num)
{
system("cls");
printf("猜对了!!恭喜!!!\n");
break;
}
}
printf("是否再来一次?输入0或1\n>>__");
scanf("%d", &n);
if (n == 1)
{
printf("开始猜数》》__");
}
} while (n == 1);
if (n == 0)
{
printf("\n");
printf("***********************************************************\n");
printf("*********>>>>>>>>>>>>>>>> E N D <<<<<<<<<<<<<<<<<<<<*******\n");
printf("***********************************************************\n");
}
}
int main()
{
menu1();
password();
if (ip == 0)
{
return 0;
}
system("cls");
menu2();
game();
return 0;
}