大家好!欢迎大家来预览此文章,今天我们做出自己的“打字游戏”、还配它音乐(7种音符)
》》》》》》》》》》》》》》》》》》》》
演示效果
素材音乐(do re mi fa so la xi)链接:素材(do re mi fa so la xi)
我不多解释啦!直接上代码,代码有注释
/*
程序类型:(命令行)游戏
编写时间:2019年12月8日16:44:58
游戏说明:本游戏为打字游戏,为了训练手速而设计的,容量小,功能简单,方便,游戏规则为 屏幕上方出现字幕慢慢往下流下来 字幕流到屏幕下方是消失
并生命值减一,减到0为止游戏结束,字幕流到屏幕底之前敲键盘上的相应的字幕会消掉次字幕并得分积一分,积分的同时播放音符,每集10分会改变屏幕字符颜色并游戏速度加速一
个单位,按错会语音提示dong~~~~~
作者:Abr(A贝尔)
开发环境:VS2019
运行环境:Windows7 ,Windows8.1 ,Windows10 (x64 x86)
*/
#define _CRT_SECURE_NO_WARNINGS //跳过安全检查
#include "windows.h"
#include "stdio.h"
#include "string.h"
#include<mmsystem.h>
#include "conio.h"//_getch
#pragma comment(lib, "WINMM.LIB")
int playMusic(int nums);//播放素材音符
int chushizhi = 0; //
int speed = 300; //游戏速度
int shengming = 3; //生命
int defen, zifu_x, zifu_y;//输出坐标
char zifu; //输出字符
char color = '3'; //字体颜色
char strcolor[256] = "color 0", strcolorr[256] = "\0";
//play music //播放素材音符
int playMusic(int num)
{
//根据素材序号生成素材名
char fileName[MAX_PATH];
sprintf(fileName, "music\\%d", num);
strcat(fileName, ".mp3");
char shortName[MAX_PATH] = { "\0" };
GetShortPathNameA(fileName, shortName, sizeof(shortName) / sizeof(char));//获取绝对路径
char cmd[MAX_PATH];
sprintf(cmd, "play %s", shortName);//播放命令
mciSendStringA(cmd, NULL, 0, NULL);//播放素材
Sleep(2000 + 50); //这里是防止一播放就结束做的延迟
return 0;
}
void huanhang(int num)//循环换行 改变字符y坐标
{
for (int i = num; i > 0; i--)
{
printf("\r\n");
}
}
void kongge(int num)//循环打印空格 改变字符x坐标
{
for (int i = num; i > 0; i--)
{
printf(" ");
}
}
void gamehead()//游戏头 初始化界面
{
strcpy(strcolorr, strcolor);
strcat(strcolorr, &color);
system(strcolorr);//命令行颜色
kongge(40);
printf("欢迎来到Abr打字游戏!\r\n");
huanhang(2);
kongge(40);
printf("生命:%d", shengming);
kongge(5);
printf("得分:%d\n", defen);
for (int i = 100; i > 0; i--)
printf("-");
}
int main()//主函数
{
CG://重新开始标签
//初始化变量值
color = '3'; //字体颜色
shengming = 3; //生命初始化为3
defen = 0; //得分清零
zifu_y = 0; //字符y坐标清零
int num = 1;
while (TRUE)//死循环
{
system("cls");//清屏
gamehead();//游戏头
huanhang(8);//换行
kongge(40);//空格
printf("请安任意键开始游戏!");//中间位置输出提示
_getch();//按任意键继续
while (TRUE)
{
system("cls");//清屏
gamehead();//游戏头
zifu = 'a' + rand() % 26;//随机输出任意a-z的字符
zifu_x = rand() % 99;//字符输出x轴位置
int NumMusic = 0; //素材序号清零
while (TRUE)
{
//文字往下流代码部分
zifu_y++;
if (zifu_y > 18)//文字留下来的最低点
{
shengming -= 1;
if (shengming == 0)//判断游戏结束
{
system("cls");//清屏
//居中显示游戏结束
huanhang(8);
kongge(40);
printf("游戏结束!\n");
//居中显示游戏得分
kongge(40);
printf("得分:%d\n", defen);
GC://重新输入标签
huanhang(2);
kongge(24);
printf("推出游戏( T )\t\t重新开始( C )\n");
char temp = getchar();
switch (temp)
{
case 'c':
case 'C':
goto CG;//重新开始标签 调到游戏头重新开始
break;
case 't':
case 'T':
exit(0);//结束游戏
break;
default:
{
system("cls");//清屏
kongge(24);
printf("请重新输入正确标签!\n");
goto GC;//按其它键就调到重新输入位置
}
}
exit(0);
}
zifu_y = 0;//初始化字符行位置
break;
}
kongge(zifu_x);//打印空格
printf("%c", zifu);//打印字符
Sleep(speed);//下流速度
printf("\b \n");//消除最后打印的字符并按空格符
if (_kbhit())//判断是否有键盘消息
{
//printf("\a");//有键盘消息就播放系统提示音dong~~~
if (zifu == _getch())//判断是否相同
{
defen += 1;//敲对就得分加1
//把素材从头到尾播放一遍
if (10 == (defen - chushizhi))//每加10分游戏速度加快一个单位
{
color++;
if (color > '9')
{
color = '2';
}
strcpy(strcolorr, strcolor);
strcat(strcolorr, &color);
system(strcolorr);//命令行颜色
chushizhi = defen;
speed -= 20;
CreateThread(NULL, NULL, (unsigned long(__stdcall*)(void*))playMusic, 8, NULL, NULL);//
}
else
{
if (num > 7)
num = 1;
CreateThread(NULL, NULL, (unsigned long(__stdcall*)(void*))playMusic, (void*)num, NULL, NULL);//
num++;
}
zifu_y = 0;//初始化字符行位置
break;//退出本次循环
}
else
{
printf("\a");//打错就播放系统提示音dong~~~
}
}
}
}
}
}