这个游戏是我大一上学期弄出来,刚学C语言,学了循环和选择结构。那时候数据结构都不太会,但是按捺不住自己的想法,总想用现有的东西做点什么。

就连窗体程序都不会,没有任何的图片,全是ASCII字符的一个游戏,我为什么敢说是史上最牛?我感觉牛不在算法上,牛不在精美的界面,而是你仅仅用这样的条件,能创造出什么?

C语言和控制台,大概是程序员最熟悉,最早接触的东西了吧。说到C语言控制台游戏,你可能想到的是,贪吃蛇?RPG游戏?俄罗斯方块?我之前见过的比较牛的,也就一个打飞机游戏了。有人会说,毕竟是C语言控制台,做出来的东西也就只能是这样了吧,黑白的界面(也有彩色的,不过很少呐),光标一闪一闪,然后输入个数字按回车执行……我总觉得不甘心,我感觉还能做得更好。想了挺久,不如做个音游吧。于是三天之后,有了这个Rhythm Slasher!(我命名为节奏斩击者,不要吐槽我英语渣,中二什么的,哈哈)。下面先附上界面图:

光标呢?序号呢?我只想说,按上下选择,回车确定。还会变颜色,有没有很炫酷的感觉~

这游戏主要就是按你的喜好,录制出任意曲目的节奏,保存起来。之后就可以像节奏大师那样玩了。简而言之,就是可以用任何你喜欢的音乐,DIY你自己喜欢的任意节奏谱的简易版节奏大师。

介绍一下游戏方法:

1. 首先将任意一首音乐,放入到游戏本体目录所在的文件夹中。

2. 第一步先选择Record。选择你喜欢的音乐,然后听着音乐,录入节奏。就是根据节奏,按你的喜好敲击askl四个按键,录制你喜欢的节奏谱。

3. 之后,你就可以选择Slash,演奏你录制过节奏谱的音乐。游戏会按照你录制节奏谱时候的节奏,生成音符。你根据音符,配合节奏,在适当的时机敲击相应音符的按键,就可以演奏该乐曲,最后会统计你的分数。

ps:四个按键是可以设置的,Record只需要一次,之后你可以任意次Slash,即使关掉游戏,也不会丢失数据。音乐仅支持wav文件,因为使用的是C语言自带的播放音乐函数。

下面附上源代码,代码的注释还是比较详细的:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#pragma comment(lib, "winmm.lib")  //播放音乐所用头文件
#include <windows.h>//函数声明
void Print_rhythm(char p,int v);//输出节奏音符
void Hide_cursor();//隐藏光标
int Choice_menus();//选择菜单,返回选项的编号(0,1,2,3)
void Cursor_goto_xy(int x,int y);//定位光标位置到指定坐标
void Selection(int n);//进入对应选项
void Record();//记录节奏
void Slash();//斩击节奏
void Setting();//设置按键
void Operate();//游戏说明//全局变量定义
int n,i,start_music,good,miss,end,Select,SM;
char p,q,w,key1='a',key2='s',key3='k',key4='l';
char name[20][1000];//主函数
int main()
{Hide_cursor();//隐藏光标system("mode con cols=66 lines=40 ");//控制台大小system("color 19");//前景色,后景色system("title Rhythm Slasher!");//窗口标题end=1;printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\tRhythm Slasher!\n\n\n\t\tPress any key to continue...");getch();while(end){n=Choice_menus();//选择菜单,返回选项的编号(0,1,2,3)system("cls");Selection(n);//进入对应选项}return 0;
}int Choice_menus()//选择菜单,返回选项的编号(0,1,2,3,4)
{char number,select;number=0;system("cls");printf("\n\n\n\n\n\n\n\n\n\t\t\t   Record!\n\n\n\n\t\t\t   Slash!\n\n\n\n\t\t\t   Setting!\n\n\n\n\t\t\t   Operate!\n\n\n\n\t\t\t   Exit!");while(1){switch(number){case 0:Cursor_goto_xy(21,9);//定位光标位置到指定坐标system("color 6e");//前景色,后景色break;case 1:Cursor_goto_xy(21,13);//定位光标位置到指定坐标system("color 5d");//前景色,后景色break;case 2:Cursor_goto_xy(21,17);//定位光标位置到指定坐标system("color 4c");//前景色,后景色break;case 3:Cursor_goto_xy(21,21);//定位光标位置到指定坐标system("color 2a");//前景色,后景色break;case 4:Cursor_goto_xy(21,25);//定位光标位置到指定坐标system("color 3b");//前景色,后景色break;}printf(">>>>");select=getch();if(select==72)//方向键,上{number--;}else if(select==80)//方向键,下{number++;}else if(select==13)//回车{return number;}number=(number+5)%5;printf("\b\b\b\b    ");}
}void Selection(int n)//进入对应选项
{if(n==0){Record();//记录节奏}else if(n==1){Slash();//斩击节奏}else if(n==2){Setting();//设置}else if(n==3){Operate();//说明}else{end=0;//退出}
}void Operate()//游戏说明
{printf("\n\n\n\n\n\t制作人 :   Lulu\n\n\n\t操作说明  :\n\n\tRecord! :\n");printf("\t根据音乐节奏按下按键,由左到右依次按键为a,s,k,l。\n");printf("\t系统将记录下你的按键,作为歌曲的节奏谱。\n");printf("\t按键可以在设置中调整。\n");printf("\n\tSlash! :\n");printf("\t使用上一次Record!制成的节奏谱,生成节奏音符。\n");printf("\t由左往右依次按键为a,s,k,l。随音乐节奏击破!\n");printf("\t按键可以在设置中调整。\n");printf("\n\tSetting! :\n");printf("\t设置游戏按键。\n");printf("\n\tOperate! :\n");printf("\t游戏说明。\n");printf("\n\tExit! :\n");printf("\t退出。\n");printf("\n\t\t\t按任意键返回。\n");getch();
}void Setting()//设置按键
{printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\tkey1 :    ");key1=getch();printf("%c",key1);Sleep(1000);system("cls");printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\tkey2 :    ");key2=getch();printf("%c",key2);Sleep(1000);system("cls");printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\tkey3 :    ");key3=getch();printf("%c",key3);Sleep(1000);system("cls");printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\tkey4 :    ");key4=getch();printf("%c",key4);Sleep(1000);system("cls");printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\t\t\tSetting succeeded!");printf("\n\n\t\t   Press any key to continue...");getch();
}
int Select_music()//选择音乐
{int i,n;FILE *fp = NULL;system("dir /b *.wav>> buf.Ock");//将目录导出到buf.Ockfp = fopen("buf.Ock","rb");i=0;while (!feof(fp)){fgets(name[i],1000,fp);name[i][strlen(name[i])-6]='\0';i++;}n=i;fclose(fp);system("del /Q buf.Ock");  //删除D:目录下buf.Ock文件char number=0,select;Select=0;system("cls");for(i=0; i<n-1; i++){printf("\n\t%d. %s\n",i+1,name[i]);}while(1){Cursor_goto_xy(2,2*number+1);//定位光标位置到指定坐标if(number%2==0)system("color 6e");//前景色,后景色elsesystem("color 5d");//前景色,后景色printf(">>>>");select=getch();if(select==72)//方向键,上{number--;}else if(select==80)//方向键,下{number++;}else if(select==13)//回车{return number;}number=(number+n-1)%(n-1);printf("\b\b\b\b    ");}
}
void Record()//记录节奏
{char musicNamer[100],musicNamew[100],musicName[100],musicNamev[100];int v;SM=Select_music();//选择音乐system("cls");FILE *fp1;//定义文件指针FILE *fp2;//定义文件指针FILE *fp3;//定义文件指针strcpy(musicNamer,name[SM]);strcpy(musicNamew,name[SM]);strcpy(musicName,name[SM]);strcpy(musicNamev,name[SM]);strcat(musicNamer,"r.txt");strcat(musicNamew,"w.txt");strcat(musicNamev,"v.txt");strcat(musicName,".wav");fp1=fopen(musicNamer,"w");//以写入模式(w)打开文件fp2=fopen(musicNamew,"w");fp3=fopen(musicNamev,"w");printf("Set the velocity of this song(20 to 70):");scanf("%d",&v);fprintf(fp3,"%d",v);fclose(fp3);printf("\n\tReady?");for(i=39; i>0; i--){printf("\n  !      !      !      !  ");}fprintf(fp2,"00000000");getch();PlaySound(musicName,NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);//播放音乐while(1){if(kbhit())//kbhit(),监测当前是否有按键按下,有返回非零值,无,返回零{p=getch();while(kbhit()) //实际上,亲测发现,只要缓冲区有数据存在,都视为有按键按下。故可以用它清空缓冲区{getch();//当缓冲区有数据时,用getch()提取数据,直至缓冲区空}if(p==key1){p='1';}else if(p==key2){p='2';}else if(p==key3){p='3';}else if(p==key4){p='4';}else{fprintf(fp1,"00000000");PlaySound(NULL, NULL, SND_PURGE) ;//停止播放音乐fprintf(fp1,"5");//写入到文件函数fprintf(fp2,"5");fclose(fp1);//关闭文件fclose(fp2);break;}}else{p='0';}fprintf(fp1,"%c",p);fprintf(fp2,"%c",p);Print_rhythm(p,v);//生成节奏音符}printf("\n\tComplete!\n");printf("Press any key to continue...");getch();system("cls");
}void Slash()//斩击节奏
{char musicNamer[100],musicNamew[100],musicName[100],musicNamev[100];int v;good=0;miss=0;FILE *fin1;FILE *fin2;FILE *fin3;SM=Select_music();//选择音乐system("cls");strcpy(musicNamer,name[SM]);strcpy(musicNamew,name[SM]);strcpy(musicName,name[SM]);strcpy(musicNamev,name[SM]);strcat(musicNamer,"r.txt");strcat(musicNamew,"w.txt");strcat(musicNamev,"v.txt");strcat(musicName,".wav");fin1=fopen(musicNamer,"r");//以读取模式(r)打开文件fin2=fopen(musicNamew,"r");fin3=fopen(musicNamev,"r");fscanf(fin3,"%d",&v);fclose(fin3);printf("The velocity of this music is %d\n",v);printf("\tReady?");for(i=39; i>0; i--){printf("\n  !      !      !      !  ");}start_music=0;getch();while(1){if(start_music==10)//延迟播放音乐{PlaySound(musicName,NULL,SND_FILENAME|SND_ASYNC|SND_LOOP);//播放音乐}start_music++;fscanf(fin1,"%c",&p);//读取文件函数fscanf(fin2,"%c",&w);if(p=='5'){PlaySound(NULL, NULL, SND_PURGE) ;fclose(fin1);fclose(fin2);break;}Print_rhythm(p,v);//生成节奏音符if(kbhit()){q=getch();while(kbhit()){getch();}if(q==key1){q='1';}else if(q==key2){q='2';}else if(q==key3){q='3';}else if(q==key4){q='4';}}else{q='0';}if(q==w){//system("color 20");printf("Good!");//正确提示good++;}else{//system("color 40");printf("Miss!!!!!!!!!!!!!!!!!!!!!!");//错误提示miss++;}}printf("\n\tFinish play!\n");printf("Total:%d   Good:%d   Miss:%d\n",good+miss,good,miss);printf("Press any key to continue...");getch();system("cls");
}void Cursor_goto_xy(int x,int y)//定位光标位置到指定坐标
{HANDLE hOut;hOut = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos= {x,y};SetConsoleCursorPosition(hOut,pos);
}void Hide_cursor()//隐藏光标
{CONSOLE_CURSOR_INFO cursor_info = {1, 0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}void Print_rhythm(char p,int v)//生成节奏音符
{if(p=='0'){printf("\n  !      !      !      !  ");Sleep(v);printf("\n  !      !      !      !  ");Sleep(v);printf("\n  !      !      !      !  ");Sleep(v);printf("\n  !      !      !      !  ");Sleep(v);printf("\n  !      !      !      !  ");Sleep(v);}else if(p=='1'){printf("\n  !      !      !      !  ");Sleep(v);printf("\n 888     !      !      !  ");Sleep(v);printf("\n 888     !      !      !  ");Sleep(v);printf("\n 888     !      !      !  ");Sleep(v);printf("\n  !      !      !      !  ");Sleep(v);}else if(p=='2'){printf("\n  !      !      !      !  ");Sleep(v);printf("\n  !     888     !      !  ");Sleep(v);printf("\n  !     888     !      !  ");Sleep(v);printf("\n  !     888     !      !  ");Sleep(v);printf("\n  !      !      !      !  ");Sleep(v);}else if(p=='3'){printf("\n  !      !      !      !  ");Sleep(v);printf("\n  !      !     888     !  ");Sleep(v);printf("\n  !      !     888     !  ");Sleep(v);printf("\n  !      !     888     !  ");Sleep(v);printf("\n  !      !      !      !  ");Sleep(v);}else if(p=='4'){printf("\n  !      !      !      !  ");Sleep(v);printf("\n  !      !      !     888 ");Sleep(v);printf("\n  !      !      !     888 ");Sleep(v);printf("\n  !      !      !     888 ");Sleep(v);printf("\n  !      !      !      !  ");Sleep(v);}
}

代码只用了循环和判断,还有文件读写,理解起来应该不难。

本渣渣能力有限,代码可能显得累赘而且程序功能不全,有bug。欢迎各位大佬指出更正。

代码和游戏本体,我一并上传到百度云:

我是链接君,点我下载游戏源码和本体

我是后记:

即使现在学了很多算法,学了很多语言,很多东西,也再没做出来什么有趣的东西了。最近决定重拾心情做点什么,哈哈~不管结果如何也算是一个尝试,一番经历~

最后,欢迎各位大佬来扰~

史上最牛C语言控制台游戏!C语言控制台音游——Rhythm Slasher! 附上源代码供交流学习相关推荐

  1. [Perl] Python 与 Perl 合并,打造史上最牛语言 Parrot

    本文链接: http://www.php-oa.com/2010/04/01/python-perl-parrot.html 据Perl官方网站的消息,Perl之父Larry Wall和Python之 ...

  2. 最难游戏2计算机5关,史上最牛的游戏2攻略 史上最牛的游戏1~5关攻略

    史上最牛得的游戏是一系列有趣和激动人心的小游戏,测量您的反应时间(豪秒)和分辨力!!听名字就知道不简单,小编这里给大家奉上史上最牛的游戏1~5关的攻略 史上最牛的游戏2攻略第1关 第一关,其实就是挠脚 ...

  3. 史上最牛独立开发者:花20美元狂赚100万美元

    史上最牛独立开发者:花20美元狂赚100万美元 摘要:一般的独立开发者年平均收入在1万美金左右,但有一个人,开发的所有游戏,没有广告.没有应用内购买,痴迷一种跨平台开发工具Corona SDK,只花2 ...

  4. 史上最牛研究生已成院士,给出“维持科研创新能力”的秘诀

    科研人员, 如何维持强大的科研创新能力? 美国的Ronald D. Vale做出了榜样. 读研究生的1985年, 年仅26岁的Ronald D. Vale, 以第一作者在Cell杂志发表了4篇论文! ...

  5. 我的世界刷猪人塔java版_我的世界速攻猪人塔详解 史上最牛的经验塔

    我的世界速攻猪人塔详解 史上最牛的经验塔.那下面给大家分享的这个是一个可以让所有经验塔自叹不如的速攻猪人塔哦~那到底这个塔是什么呢?那下面就给大家详细的介绍一下吧!有感兴趣的玩家不妨进来看看哦~希望大 ...

  6. 史上最牛最强的linux学习笔记 10.shell基础

    史上最牛最强的linux学习笔记 10.shell基础 写在最前面: 本文是基于某站的视频学习所得,第一个链接如下: https://www.bilibili.com/video/BV1mW411i7 ...

  7. 史上最牛女秘书 邮件内容

    如果你今天还不知道"史上最牛女秘书"是谁,或者你还没收到那封在网络上引起轩然大波的邮件,只能说明你不是那些著名外企中的一员.最近一周,从北京.上海到成都.广州.南京--全国所有知名 ...

  8. 淘宝秒杀活动18亿人次参加:成史上最牛促销

    互联网的力量再次创造出奇迹--9月25日至9月30日在淘宝网举行的秒杀促销活动,有18亿人次参加,平均每天参加秒杀活动的人数达到3亿.这一数字等于平均每位中国人都参加了至少1次秒杀促销活动.同时按照中 ...

  9. 哈哈哈!史上最牛叉的程序员!

    ‍ ‍ 程序员的幽默(ID:humor1024)整理 0.史上最牛叉的程序员 1.没事,我已经全部注释掉了 2.客户需求 VS 客户预算 VS 最终实现 3.多线程编程的理论和现实 4.维护遗留代码 ...

最新文章

  1. IIS 日志文件位置
  2. webpack 的webpack.config文件配置css-loader,style-loader注意的问题
  3. linux 磁盘监控,9个在Linux中监视Linux磁盘分区和用法的工具
  4. python数据存储系列教程——xls文件的读写、追加(xlwt、xlwt、xlutils)
  5. ASP.net C# EVal关于前端绑定
  6. 基于HLW8112的直流测量原理及校准方法
  7. 算法设计和分析 ② 分治和递归
  8. P2123 皇后游戏 (贪心+公式推导)
  9. 25、网络必备知识:Ping命令的7个基础用法,掌握了贼厉害
  10. HAZOP到LOPA和SIL验算软件-歌略RiskCloud
  11. win10如何删除microsoft账户并免密登录
  12. OneNote 与 OneNote 2016 有什么区别?
  13. Debezium系列之:安装部署debezium2.0以上版本的详细步骤
  14. 献给那些浮躁的职场人(转)
  15. Git基本应用<一>:Git安装及GitHub连接
  16. 欢迎进入半颗心脏博客导航一站式搜索(所有博客的汇总帖)
  17. 关于EF多线程更新数据的一个报错
  18. 计算机实战项目之 [含论文+答辩PPT+源码等]基于javaweb+mysql的促销秒杀竞拍商城|电商购物
  19. 有关防爆知识(防爆标识格式解释)
  20. 计算几何----极角排序

热门文章

  1. ie js html 压缩,H5图片裁剪-压缩-上传-神奇的Croppie.js
  2. 智能电视 android,智能电视:Android真的是期盼已久的免费午餐?
  3. Jmeter书中不会教你的(90)——JSONObject not found in namespace
  4. Android天气预报软件
  5. 使用Android模拟器调试linux内核
  6. iOS阿里云对象存储 OSS文件的上传/下载的实现
  7. 【离散数学期复习系列】一、命题逻辑
  8. python内置函数与闭包_Python进阶(五)----内置函数Ⅱ 和 闭包
  9. 使用PlayWright技术实现Boss直聘爬虫
  10. 蒲公英java后台上传_Jenkins自动化打包(Gitlab)并上传蒲公英