目录
引言
1.开发环境
2.游戏介绍
3.生成随机数
3.1 rand()函数
3.2 srand()函数
3.3 time()函数
4.主体思路
4.1 选择模块
4.2 菜单模块
4.3 游戏模块
5.关机奖励
5.1 system()函数
5.2 关机指令
5.3 strcmp()函数
5.4 取消关机指令
6.完整代码
阿哇旭作为一个小白,一个简单的C语言小游戏无非提高了我学习C语言的兴趣,相信大家也是如此。接下来,我将用到之前介绍的分支与循环,为大家带来我设计这个猜数字小游戏的方法与思路。
话不多说,让我们一起来看看吧!
集成开发环境(IDE):Visual studio 2022,若要使用scanf函数,请添加如下注释:
#define _CRT_SECURE_NO_WARNINGS
//忽略scanf函数的安全警告
1.电脑通过随机数生成器生成一定区间的随机数段(例:1~100);
2.玩家输入要猜测的数字,在此过程中,电脑根据输入数字的大小给出猜大了、猜小了及猜对了的文字反馈;
3.玩家共有五次的猜测机会,机会用完则会有关机惩罚;
4.输入指定的自定义密钥(例:“我是猪”),即可取消关机程序。
本次的重点,如何实现随机数的生成?相信知道这个知识点的小伙伴已经迫不及待了。
在主函数中,为实现真正的随机而引用了时间戳的概念。
什么是时间戳?
一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列,唯一地标识某一刻的时间。通俗的讲,就是表示某一刻的时间。
时间戳的计算方法
格林威治时间(1970年01月01日00时00分00秒)起至现在的总秒数。
根据时间戳的概念,可以看出每时每刻的时间戳都是的独一无二的,配合函数使用来实现真正意义上的随机。
用于生成随机数,rand 函数会返回一个伪随机数,这个随机数的范围是在0~RAND_MAX之间,这个RAND_MAX的大小是依赖编译器上实现的,但是大部分编译器上是32767。
函数名:rand
头文件:
函数原型:int rand(void);
参数:无参数
返回值:返回生成的随机数
在本游戏中生成1~100的随机数
对rand取余就是0~99
rand()%100+1的范围就是1~100;
初始化随机数的发生器,程序中在调用 rand 函数之前先调用 srand 函数,通过 srand 函数的参数 seed 来设置 rand 函数生成随机数的时候的种子,只要种子在变化,每次生成的随机数序列也就变化起来了。
函数名:srand
头文件:
函数原型:void srand(unsigned seed);
参数:unsigned seed 要设置随机时间的种子,其值为整数
返回值:无返回值
获取系统时间
函数名:time
头文件:
函数原型:long time(long *t);
参数:当前系统时间
返回值:返回当前系统时间
补充:
(1) t1=time(NULL)或t1=time(0)
将空指针传递给time()函数,并将time()返回值赋给变量t1;
(2) time(&t2)
将变量t2的地址作为实参传递给time()函数,函数自动把结果传递给t2,不需要额外的赋值语句 。
主要代码如下:
srand((unsigned)time(NULL));
int ret = rand() % 100 + 1;/*随机生成1~100之间的数字*/
1.首先设计游戏菜单;
2.让玩家选择 1.开始游戏 0.退出游戏;
3.若输入其他数字则提示玩家重新输入。
int main()
{
system("cls");
system("color 70");
srand((unsigned)time(NULL));
int num = 0;
do
{
menu();
printf("请输入游戏选项数字:\n");
scanf("%d", &num);
switch (num)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误,请重新选择\n");
}
} while (num);
return 0;
}
该模块不需要返回任何值,即用无类型函数 void
/*游戏菜单*/
void menu()
{
printf("******** 选择菜单 ********\n");
printf("******** 1.play ********\n");
printf("******** 0.exit ********\n");
printf("************************\n");
}
阿哇旭现在的能力有限,只能设计简单的选择菜单,还希望多多包涵,如果有大佬帮助我设计实现就更好了。
玩家进行数字的猜测,共有五次的猜测机会,机会用完则会有关机惩罚。
主要代码如下:
/*游戏函数*/
void game()
{
int count = 5;/*可以猜测的次数*/
int guess = 0;/*玩家猜测的数字*/
int ret = rand() % 100 + 1;/*随机生成1~100之间的数字*/
while (count)
{
printf("\n请输入要猜测的数字:\n");
scanf("%d", &guess);
if (guess > ret)
{
printf("数字猜大了\n");
}
else if (guess < ret)
{
printf("数字猜小了\n");
}
else
{
printf("恭喜你,数字猜对了,来个奖励\n");
printf("请输入密钥,取消关机程序");
//Shutdown();/*可以取消该处注释,不论是猜测机会用完还是猜中数字,均执行关机指令*/
}
count--;/*每猜测一次,次数减少一,直至为零*/
printf("你还有%d次机会\n", count);
}
if (count == 0)
{
Shutdown();
}
}
目录
用于发出一个DOS命令
函数名:system
头文件:
函数原型:int system(const char *command);
参数:char *command为需要执行的DOS命令
返回值:命令执行成功返回0,执行失败返回-1
system("shutdown -s -t 60");
/*system()执行windows系统的命令,定时60秒关机*/
若想去整你的朋友,可以将60改为0,猜中数字立即关机,但不要顺着网线来打我呀。
比较两个字符串的大小
函数名:strcmp
头文件:
函数原型:int strcmp(const char *str1,const char *str2);
参数:str1和str2为要比较的字符串
返回值:str1 > str2,返回 1;
str1 < str2,返回 -1;
str1 == str2,返回 0。
当然,可以取消关机指令,但如果是立即关机,我也没办法咯。
system("shutdown -a");
/*取消关机*/
主要代码如下:
/*关机函数*/
int Shutdown()
{
char arr[20] = { 0 };
/*system()执行windows系统的命令,为定时关机*/
system("shutdown -s -t 60");
again:
printf("你的电脑将在60秒后关机\n");
printf("请输入密钥,取消关机程序:\n");
scanf("%s", &arr);
/*利用strcmp函数判断输入的字符是否为指定密钥*/
if (strcmp(arr, "我是猪") == 0)
{
/*取消关机*/
system("shutdown -a");
printf("已取消关机,感谢游玩!");
printf("\n");
}
else
{
goto again;/*使用goto语句实现迭代*/
}
}
我将代码分装在两个 标头.c 文件和一个 标头.h 文件中,可以让代码更清晰,后期可维护性更高。
该部分我放在test.c文件中,用作游戏逻辑的实现。
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
/*游戏菜单*/
void menu()
{
printf("******** 选择菜单 ********\n");
printf("******** 1.play ********\n");
printf("******** 0.exit ********\n");
printf("************************\n");
}
int main()
{
system("color 70");/*美化程序运行界面*/
/*使用time函数的返回值设置种子*/
/*因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换*/
srand((unsigned)time(NULL));
int num = 0;
do
{
menu();
printf("请输入游戏选项数字:\n");
scanf("%d", &num);
switch (num)
{
case 1:
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("选择错误,请重新选择\n");
}
} while (num);
return 0;
}
该部分我放在game.h文件中, 用作函数的声明
#pragma once
//关机函数声明
int Shutdown();
//游戏函数声明
void game();
该部分我放在game.c文件中, 用作函数的实现。
/*关机函数*/
int Shutdown()
{
char arr[20] = { 0 };
/*system()执行windows系统的命令,为定时关机*/
system("shutdown -s -t 60");
again:
printf("你的电脑将在60秒后关机\n");
printf("请输入密钥,取消关机程序:\n");
scanf("%s", &arr);
/*利用strcmp函数判断输入的字符是否为指定密钥*/
if (strcmp(arr, "自定义密钥") == 0)
{
/*取消关机*/
system("shutdown -a");
printf("已取消关机,感谢游玩!");
printf("\n");
}
else
{
goto again;/*使用goto语句实现迭代*/
}
}
/*游戏函数*/
void game()
{
int count = 5;/*可以猜测的次数*/
int guess = 0;/*玩家猜测的数字*/
int ret = rand() % 100 + 1;/*随机生成1~100之间的数字*/
while (count)
{
printf("\n请输入要猜测的数字:\n");
scanf("%d", &guess);
if (guess > ret)
{
printf("数字猜大了\n");
}
else if (guess < ret)
{
printf("数字猜小了\n");
}
else
{
printf("恭喜你,数字猜对了,来个奖励\n");
printf("请输入密钥,取消关机程序");
//Shutdown();/*可以取消该处注释,不论是猜测机会用完还是猜中数字,均执行关机指令*/
}
count--;/*每猜测一次,次数减少一,直至为零*/
printf("你还有%d次机会\n", count);
}
if (count == 0)
{
Shutdown();
}
}
至此,整个游戏的方法与思路讲解完了,快去邀请你的好朋友来玩吧。也请动动你们的手指点赞+收藏,若有不足,还望各位指正!这将对我有很大的帮助。