✅作者简介:大家好我是原始豌豆,感谢支持
🔥系列专栏:C语言项目实战
😶🌫️作者主页:原始豌豆的博客
🥳 创作不易:本文共两万八千字,文章最后附上全部源码和音频包,欢迎大家点赞,关注,评论
前言
猜数字游戏是大多数人学习C语言时都会了解到的一个有趣的C语言小游戏,本文对猜数字游戏进行了升级与优化,增加了很多新功能,比如进入游戏的黄色皮卡丘动态效果展示,动态的打印欢迎进入Guess_Number文字,加入了游戏背景音乐,增加了游戏说明书,主界面的菜单显示,难度的分级,和游戏失败的皮卡丘关机惩罚,玩小游戏的同时,也能对C语言和程序设计有更好的认识。
目录
一.游戏描述
二.头部文件
三.代码实现:
(1) 菜单函数
(2) 皮卡丘函数
(3) 动态字符串函数
(4) 心形图案函数
(5) 背景音乐函数
(6) 游戏难度等级函数
(7) 游戏主体函数
(8) 打印提示框函数
(9) 关机函数
(10) bug处理函数
(11) 游戏玩法说明函数
(12) 开发人员菜单函数
主函数
四.全部源码
五.项目总结
一.游戏描述
游戏分为普通模式,困难模式和地狱模式。
😃普通模式:程序生成一个1~100之间的的随机数,并给予玩家10次机会,让玩家去猜,并给予玩家一定的提示。
1.玩家输入猜测的数字,程序告诉玩家猜大了或者猜小了,然后继续猜。如果猜对了,则游戏结束,回到主菜单界面。
2.如果10次机会用尽,玩家依旧没有猜出来,则进入惩罚模式,电脑召唤红色的皮卡丘,对玩家电脑发动十万伏特攻击,将玩家的电脑倒计时两分钟关机,玩家可通过输入对应的口令解除关机。如果玩家头铁强行关闭程序,关机指令并不会关闭,倒计时结束依旧会关机。
🤔困难模式:困难模式在普通模式的基础上增大了随机数的生成范围(1~1000),并增加了二级关机指令,玩家输入对应的口令解除第一层关机后还会有第二层关机程序,解开题目方可彻底解除关机。
😡地狱模式:地狱模式在普通模式的基础上增大了随机数的生成范围(1~10000),并增加了伪关机指令,玩家输入对应的口令解除关机后,直接进入倒计时5s,倒计时结束强制关机,玩家开机后打印心型图案,降低玩家怒气。
二.头部文件
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,“Winmm.lib”)
三.代码实现
游戏使用的所有头文件如下,第一条头文件vs编译器专用,其他编译器删除此条。
#define _CRT_SECURE_NO_WARNINGS//vs编译器加上此条头文件,其他编译器不用。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<windows.h>
#include<mmsystem.h>
#pragma comment(lib,"Winmm.lib")
(1) 菜单函数 void Menu()
首先呢,我们既然做游戏,得有一个菜单,供玩家选择开始游戏或退出游戏等功能。我们先做一个Menu菜单函数并写上每个功能,使用时在主函数里调用就可以展示给玩家了。
菜单函数也可以设计的很精美,可以参考我的设计样式,system(“color 70”);是一个Windows Api,我们可以通过调用它实现菜单和颜色和字体的的设置。
void Menu()
{
system("color 70");//灰底黑字
printf("\t\t\t\t猜数字游戏\n");
printf("\t\t\t _______________________\n");
printf("\t\t\t| 1.开始游戏 |\n");
printf("\t\t\t|_______________________|\n");
printf("\t\t\t| 2.困难模式 |\n");
printf("\t\t\t|_______________________|\n");
printf("\t\t\t| 3.地狱模式 |\n");
printf("\t\t\t|_______________________|\n");
printf("\t\t\t| 4.玩法说明 |\n");
printf("\t\t\t|_______________________|\n");
printf("\t\t\t| 5.退出游戏 |\n");
printf("\t\t\t|_______________________|\n");
printf("\t\t\t| 6.开发人员 |\n");
printf("\t\t\t|_______________________|\n");
printf("\t\t\t请选择:->");
}
菜单函数运行效果如图
(2) 皮卡丘函数 void PiKaQiu(char color_control)
我们的游戏叫皮卡丘猜数字,那怎么能没有皮卡丘呢,我们做一个皮卡丘函数PiKaQiu用来展示进入游戏时的皮卡丘动画展示,我们的游戏设计是黄色皮卡丘出现在游戏开场动画里,红色皮卡丘出现在游戏失败进入关机惩罚的动画里,但我们总不能做两个皮卡丘函数吧,那样代码太臃肿了,所以这里我们给皮卡丘函数带上参数,char color_control 用于接受传过来的参数,如果传过来的是’y’,代表黄色yellow,如果传过来的是’r’,代表红色red,皮卡丘图案是printf函数一行一行打印出来的,我们在每行打印结束的后面加上Sleep(100);这是一个Windows Api 可以实现延迟效果,设置延迟为100ms,每行最后都加一个Sleep(100);这样就可以实现动态效果了。
皮卡丘函数中的PlaySound(TEXT(“pikaqiu.wav”), NULL, SND_FILENAME | SND_ASYNC);Sleep(3000);这行代码是用来控制音效的,红色皮卡丘释放十万伏特会发出声音的哦,这在后面会详细介绍。
//皮卡丘函数,打印开始界面的皮卡丘图案
void PiKaQiu(char color_control) {
if (color_control == 'y')//yellow ,控制皮卡丘颜色
{
system("color 0E");//黑底黄字
printf("\n 黄色皮卡丘:我可不是摆设哦!!!!\n\n");
}
if (color_control == 'r')//red,控制皮卡丘颜色
{
system("color 04");//黑底红字
PlaySound(TEXT("pikaqiu.wav"), NULL, SND_FILENAME | SND_ASYNC);
Sleep(3000);
printf("\n 红色皮卡丘:我都说了我不是摆设哦!!!!\n\n");
}
printf(" へ /|\n"); Sleep(100);
printf(" /\ ∠_/\n"); Sleep(100);
printf(" / │ / /\n"); Sleep(100);
printf(" │ L _,< / /`ヽ\n"); Sleep(100);
printf(" │ ヽ / 〉\n"); Sleep(100);
printf(" Y ` / / /\n"); Sleep(100);
printf(" ( ● 、 ● |〈 \n"); Sleep(100);
printf(" () へ | \〈\n"); Sleep(100);
printf(" >- 、_ ィ │ //\n"); Sleep(100);
printf(" / へ / )<| \\\n"); Sleep(100);
printf(" ヽ_) (_/ │//\n"); Sleep(100);
printf(" 7 |/\n"); Sleep(100);
printf(" >―r ̄ ̄`-―_\n\n"); Sleep(100);
}
皮卡丘函数运行效果如图:
(3) 动态字符串函数 void Welcome()
我们的游戏设计是黄色皮卡丘出现在游戏开场动画里,然后出现动态文字,打印欢迎进入 Welcome To Guess_NumberGuess_Number(欢迎来到猜数字游戏),然后才进入游戏菜单,打印数字大家都会,那么如何显示动态文字,这里我们做一个欢迎函数Welcome用来动态展示字符。
函数体内部创建一个字符数组用于存放我们要打印的字符串,利用strlen(arr1) - 1求出数组的右下标,然后创建一个循环来遍历数组,打印数组里的每个字符,每打印一个字符设置75ms延迟,Sleep(75);来实现动态效果,打印完字符串后,我们要进入菜单界面了,所以在这里我们设置一个system(“pause”);和system(“cls”);用来实现控制台停留和清屏
//显示欢迎进入猜数字游戏的字符串函数
void Welcome()
{
char arr1[] = " Welcome To Guess_Number!!! ";//设置一些空格,控制和皮卡丘图案对齐。
int left = 0;
int right = strlen(arr1) - 1;//字符数组最右边下标
while (left <= right)//循环遍历字符数组
{
Sleep(75);//设置休眠函数,以实现动态打印效果
printf("%c", arr1[left]);
left++;
}
system("pause");//控制台停留
system("cls");//清屏
}
(4) 心形图案函数 void heart()
游戏里的地狱模式惩罚里会倒计时并强制给玩家关机,没有其他方式阻止,所以我们设计一个心形函数heart(),当玩家愤怒的开机归来,程序就显示红色爱心来降低玩家怒气值。程序里的地狱模式的关机惩罚里采用的是休眠但不终断进程的方式关机,所以重启电脑后还是会显示程序关机前正在运行的界面。心型函数的实现如下,采用了笛卡尔心型曲线为数学基础,通过坐标来判断如何打印心型图案。
//心形图案函数
void heart()
{
printf(" 刚开机回来吧,我一直都在 @_@\n");
system("color 04");//黑底红字
for (float y = 1.5f; y > -1.0f; y -= 0.1f) {
for (float x = -2.0f; x < 2.0f; x += 0.05f) {
float a = x * x + y * y - 1;
putchar(a * a * a - x * x * y * y * y <= 0.0f ? '*' : ' ');
}
Sleep(30);
putchar('\n');
}
}
心形图案函数运行效果如图:
(5) 背景音乐函数 void BackgroundMusic(int num)
我们的游戏是带有背景音乐的,所以这里我们创建一个背景音乐函数 BackgroundMusic,通过调用windows api 来实现音乐的播放和音效的实现,“lihuaxiangA.wav”,引号内部的内容为音频文件的名称(音频文件必须是wav格式的,音频文件放在代码对应的release文件底下程序才能有声音),在这里给 BackgroundMusic函数设置了参数num,通过参数用来控制音乐的打开或关闭。传参数0时音乐停止,音频文件我会放到本文的最后。
//背景音乐函数
void BackgroundMusic(int num)
{
PlaySound(TEXT("lihuaxiangA.wav"), NULL, SND_FILENAME | SND_LOOP | SND_ASYNC);//播放音频文件,循环播放,异步播放
if (num == 0)
{
PlaySound(NULL, NULL, SND_PURGE); // 停止所有声音
}
}
如图:音频文件和.exe文件放在一个目录下,音频文件必须是wav格式的
(6) 游戏难度等级函数 void game_class(int class)
这里的game_class函数和下面的game函数是程序的重点部分,game_class函数的参数class用来接收玩家在游戏菜单选择的难度等级,1,2,3分别对应普通模式,困难模式和地狱模式,将不同难度产生的随机数值 random_num ,玩家游戏次数count和关机惩罚等级shutdown_class三个参数传给game函数进行处理。game_class函数和game函数本为一体,但考虑到游戏内容的增多,和函数应该保持高内聚低耦合的性质,所以拆分成了两个函数,方便修改和维护。
//game_class函数对玩家选择的模式进行处理,并将难度对应的参数传给game函数
void game_class(int class) //class=1,2,3分别对应普通困难地狱三种模式
{
if (class == 1)
{
//rand函数能返回随机数的最大值。
int random_num = rand() % 100 + 1;//将随机数模100产生0~99之间的数字。+1随机数变成0~100
int count = 10;//玩家猜测数字的总次数
int shutdown_class = 1;//猜错后关机程序对应的等级
printf("\t\t\t普通模式->电脑已经生成了一个1到100之间的随机数,你猜猜数字是多少 ?\n");
game_class(random_num, count, shutdown_class);
}
if (class == 2)
{
//rand函数能返回随机数的最大值。
int random_num = rand() % 1000 + 1;//将随机数模1000产生0~999之间的数字。+1随机数变成0~1000
int count = 10;//玩家猜测数字的总次数
int shutdown_class = 2;//猜错后关机程序对应的等级
printf("\t\t\t困难模式->电脑已经生成了一个1到1000之间的随机数,你猜猜数字是多少 ?\n");
game_class(random_num, count, shutdown_class);
}if (class == 3)
{
//rand函数能返回随机数的最大值。
int random_num = rand() % 10000 + 1;//将随机数模100产生0~9999之间的数字。+1随机数变成0~10000
int count = 10;//玩家猜测数字的总次数
int shutdown_class = 3;//猜错后关机程序对应的等级
printf("\t\t\t地狱模式->电脑已经生成了一个1到10000之间的随机数,你猜猜数字是多少 ?\n");
game_class(random_num, count, shutdown_class);
}
}
(7) 游戏主体函数 void game(int random_num, int count, int shutdown)
game函数接收game_class函数传过来的参数并进行处理,对随机数值 random_num 和玩家输入的数字进行比较,以此来缩小玩家判断程序产生的随机数的范围,game函数调用PrintFunction函数并为其传参n,参数n的四个数值对应PrintFunction函数里的四种情况的打印形式,程序以此来判断应该打印哪种形式的提示框
//game函数对应的三个参数分别为game_class函数传过来的随机数,猜测次数,和关机指令等级