讲完循环和判断我们就可以上游戏啦!兴奋吧,激动吧,直接进入正题,来看!
在进入猜数字游戏之前,先让我们看一下模拟登录(后面用于游戏登录)
目录
1.模拟登录
2.猜数字
1.模拟登录
//模拟登录
#pragma warning(disable:4996)
#include<stdio.h>
#include<string.h>
#include<windows.h>
#define USENAME "mengxin"//设置用户名
#define PASSWORD "1234abcd"//设置密码
void Locking(int times)
{
while (times)
{
printf("你的电脑已经被锁死,还剩下...%2d\r", times);
times--;
Sleep(1000);
}
printf("\n");
}
void Lock(int lock_count)
{//对不同的错误次数做出不同的惩戒措施;
switch (lock_count)
{
case 1:
Locking(10);
break;
case 2:
Locking(600);
break;
case 3:
Locking(3600);
break;
//Locking函数是锁机函数,实参为锁机的时间
default:
system("shutdown -s -t 180");
//锁机命令设置,在解析中解释
break;
}
}
int main()
{
char use[50] = "\0";//用来输入账号的数组
char pass[9] = "\0";//用来设置密码的数组
int lock_count = 0;//用来记录输入错误的次数
while (1)
{
printf("请输入账号>");
scanf("%s", use);
printf("请输入密码>");
scanf("%s", pass);
if ((0 == strcmp(use, USENAME)) && (0 == strcmp(pass, PASSWORD)))
//strcmp函数用来比较字符串,讲在解析中讲解
//此处判断意为 输入账号密码是否与预设值均相同(一个不同即判断不成立)
{
printf("Congratulations on mengxin logging into my system!");
break;
}
else
{
lock_count++;//输入错误的次数
printf("认证失败,你的电脑已锁死,请稍后再试!\n");
Lock(lock_count);//惩罚方式的设置函数
}
}
return 0;
}
解析:
我们知道main函数是入口函数,作为程序运行的起点,进入main函数。 我们首先创建两个 数 组来存储内设的账号和密码,内设的账号和密码定义为宏常量,该程序中,设置的账号为“mengxin”,密码为“1234abcd”,并定义lock_count 用来记录输入的错误次数
进入while循环,输入账号密码,然后对输入的账号密码和内设的账号密码进行比较,若均相同,则if判断成立(注意这里的比较,因为账号密码均为字符串形式,而字符串形式不能直接进行比较,需要用函数strcmp(,),逗号左右为两个比较的字符串,我们只要知道,当两个字符串比较相等时,strcmp返回值为0),所以当两个strcmp返回值均为0时,说明账号密码均相同。
输出“欢迎“mengxin”登录我的系统”(当然是英文),然后break跳出while循环。
若账号或密码输入错误,则lock_count记录的错误次数+1,然后调用函数Lock用于惩戒(保护账号密码的惩戒措施),进入Lock函数,建立Switch多分支语句,将错误次数分为不同等级,做出不同的惩罚措施,当错误次数超过3次时,执行关机指令(ststem是系统命令的使用,需要头文件windows.h,“shutdown -s -t 就是命令行中的关机命令,-t后面的数字表示多少秒后自动关机,若要取消关机,则按window+r调出运行框,输入cmd后进入命令交互界面,输入shutdown -a即可取消关机操作”)
当错误次数不超过3时,分别执行不同时间的锁机函数Locking,如错误一次,进入Locking(10),用形参 times接收10,建立while循环,进行倒计时输出(\r转义的含义在转义中有过讲解,光标回到该行开头并在再,次输出数据时覆盖原数值,这里不再赘述倒计时的实施),倒计时10s后退出Locking函数,执行完毕主函数的else分支,跳出if语句,继续进行while输入账号密码的循环,直到输入正确,否则嘿嘿嘿(神秘一笑)。
2.猜数字
如上,我们就完成了模拟登录的代码实现,现在让我们来进行猜数字游戏的主体实现(先不与登录代码叠加)
//猜数字游戏的简单实现
#pragma warning(disable:4996)
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
void Menu()
{
printf("##########################\n");
printf("#####1.play 0.exit#####\n");
printf("##########################\n");
}
void Game()
{
printf("猜数字游戏开始!数字范围为1~100噢\n");
int t = rand()%100+1;
//设置随机数范围
int input;
while (1)
{
printf("你猜的数字>");
scanf("%d", &input);
if (input > t)
{
printf("猜大了\n");
}
else if (input < t)
{
printf("猜小了!\n");
}
else
{
printf("恭喜你!猜对了!!\n");
break;
}
}
}
int main()
{
srand((unsigned long)time(NULL));
//随机数的设置
int input;
do
{
Menu();
//简易菜单函数的调用
scanf("%d", &input);
switch (input)
{
case 1:
Game();
break;
case 0 :
printf("退出游戏\n");
break;
default:
printf("选择错误!请重新选择\n>");
}
} while (input);
return 0;
}
解析:
进入main函数,首先设置一个随机数种子,定义一个变量。然后进入do~while循环,执行scanf,创建多分支来进行游戏选择,若输入1则进入游戏函数Game,输入0,则退出switch语句,进入到while的条件判断,读取input为0,所以do~while循环结束,退出程序,输入其他值时,输出“选择错误”,之后退出switch后进入while条件判断,input非0,则继续循环,重新输入。
当输入1时,进入Game函数,首先设置一个范围为1~100的随机数(rand()%100的范围是0~99,再+1就是1~100),进入while循环,当输出数不等于随机数时,循环输入,当猜对时,跳出while循环,同时跳出main函数中的switch语句,进入while的条件判断,由于我们是输入的1进入的Game函数,所以while读取值为1,判断为真,继续进入while循环,输入1继续游戏,输入0则可退出。
注意随机数种子的设立不要再重复调用的函数里面,单独设置一次即可,如此次程序,若设置在game里面,则每次调用game都会执行srand,每次调用srand()都将重新设置随机数种子,由于两次设置时间间隔小于1s【这是由于time(0)返回值是从1970年1月1日至今所经历的时间(以秒为单位)】,所有两次设置的种子一致,导致两次输出的随机数序列相同,所以如果不能保证两次srand()设置的时间间隔大于1s,则不要调用两次srand(),否则将得到相同的随机数序列(该段意思摘自原文链接:https://blog.csdn.net/xiya)
3.将登录和猜数字放在一起
text.h
//text.h
#pragma once
#pragma warning(disable:4996)
#include<stdio.h>
#include<time.h>
#include<windows.h>
#include<math.h>
#define USENAME "mengxin"//设置用户名
#define PASSWORD "1234abcd"//设置密码
extern void Lock(int lock_count);
extern void Locking(int times);
extern void Menu();
extern void Game();
extern void log_in();
text.c
#include "text.h"
//text.c
void Menu()
{
printf("##########################\n");
printf("#####1.play 0.exit#####\n");
printf("##########################\n");
}
void Game()
{
printf("猜数字游戏开始!数字范围为1~100噢\n");
int t = rand() % 100 + 1;
//设置随机数范围
int input;
while (1)
{
printf("你猜的数字>");
scanf("%d", &input);
if (input > t)
{
printf("猜大了\n");
}
else if (input < t)
{
printf("猜小了!\n");
}
else
{
printf("恭喜你!猜对了!!\n");
break;
}
}
}
void Locking(int times)
{
while (times)
{
printf("你的电脑已经被锁死,还剩下...%2d\r", times);
times--;
Sleep(1000);
}
printf("\n");
}
void Lock(int lock_count)
{//对不同的错误次数做出不同的惩戒措施;
switch (lock_count)
{
case 1:
Locking(10);
break;
case 2:
Locking(600);
break;
case 3:
Locking(3600);
break;
//Locking函数是锁机函数,实参为锁机的时间
default:
system("shutdown -s -t 180");
//锁机命令设置,在解析中解释
break;
}
}
void log_in()
{
char use[50] = "\0";//用来输入账号的数组
char pass[9] = "\0";//用来设置密码的数组
int lock_count = 0;//用来记录输入错误的次数
while (1)
{
printf("请输入账号>");
scanf("%s", use);
printf("请输入密码>");
scanf("%s", pass);
if ((0 == strcmp(use, USENAME)) && (0 == strcmp(pass, PASSWORD)))
//strcmp函数用来比较字符串,讲在解析中讲解
//此处判断意为 输入账号密码是否与预设值均相同(一个不同即判断不成立)
{
printf("Congratulations on mengxin logging into my system!\n");
break;
}
else
{
lock_count++;//输入错误的次数
printf("认证失败,你的电脑已锁死,请稍后再试!\n");
Lock(lock_count);//惩罚方式的设置函数
}
}
return ;
}
main.c
//main.c
//猜数字游戏的简单实现
#include"text.h"
int main()
{
log_in();
srand((unsigned long)time(NULL));
//随机数的设置
int input;
do
{
Menu();
//简易菜单函数的调用
scanf("%d", &input);
switch (input)
{
case 1:
Game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误!请重新选择\n>");
}
} while (input);
return 0;
}
我们只对两个小程序进行了简易的合并,只是使用了多文件将登录程序通过log_in函数加进了猜数字中。因此不多赘述。
下篇我们将掀开新的篇章,正式进入函数的讲解!