C语言七彩贪吃蛇源代码---AI自动寻径,分数排行,数据保存,背景音乐难度设置等 控制台小游戏
-------------------------------------------------------------------------------------------
七彩贪吃蛇小游戏V1.0
使用纯C语言编写的控制台贪吃蛇小游戏,可设置游戏难度,有连击分数加成,蛇身颜色自动随机变化,缓冲防闪,数据存储保护,排行榜与音效等功能,VC++与VS编译均通过,只使用VC自带库。
-------------------------------------------------------------------------------------------
纯C语言编写,手感十足。
---目前最高纪录为107400分,0 0 一盘大概玩了半小时。。。。
---实乃无聊时必备解压小游戏之良品~~~
---个人制作,游戏可能会有少许bug,敬请谅解,转载请注明
-------------------------------------------------------------------------------------------
游戏截图:
-----------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------
源代码:
//贪吃蛇彩色版源代码,2018/3/8,仅供互相交流学习#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<conio.h>
#include<math.h>
#include<time.h>
#include "StdAfx.h"
int snakeleng = 4; //全局变量,蛇长度
int last_dir = 'd'; //上一次蛇头和默认朝向
int markmax[101][2]; //存储蛇的坐标信息
int n=1,l=0,g=150,e=30,h=15; //l游戏分数,g游戏速度,n游戏等级,e,h食物坐标
int speedflag; //游戏调速自定义
unsigned char c; //全局接收键盘按键变量
int randcolor();
void checking();
void msg_init();
void gotoxy(int x,int y);
void HideCursor();
void GUI();
void localtime();
void marksort();
void srandcolor(int randcolor);
void keyreceive();
void gamespeedset();
void snakemsg();
void initsnake();
void printmark();
void foodrandom();
void ready_game();
void read_next_coord();
void markrank();
void food_check();
void checking();
void game_opinion();
struct body
{ int x; int y;
};
struct body snake_body[500]; //蛇身的长度结构体,最长500
void msg_init()
{n=1;l=0;g=150;snakeleng = 4;
}void gotoxy(int x,int y)
{COORD c;c.X=x-1;c.Y=y-1;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
void HideCursor()//隐藏光标
{CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}void GUI()
{int j=1,i=0;SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_GREEN);for(i=0;i<24;i++){gotoxy(57,j++);printf("■"); gotoxy(1,j);printf("■");gotoxy(81,j);printf("■");gotoxy(1,25);printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");gotoxy(1,1);printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");}
}void localtime() //载入并刷新系统RTC时间
{ time_t now; struct tm *timenow; char time_end[1024];char time_start[1024];time(&now); timenow = localtime(&now); SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN);strftime(time_end,1024,"%Y年%m月%d日",timenow);strftime(time_start,1024,"%H:%M:%S",timenow);gotoxy(63,17);printf("%s",time_end);gotoxy(63,19);printf("%s",time_start);}void marksort() //分数排序
{int i,x,temp;for(x=0;x<10;x++) //先将排行榜的分数中最小的筛选出来{if(markmax[9][0]>markmax[x][0]){ temp=markmax[9][0];markmax[9][0]=markmax[x][0];markmax[x][0]=temp;temp=markmax[9][1];markmax[9][1]=markmax[x][1];markmax[x][1]=temp;}} if(l>markmax[9][0]) //如果大于最小的才会开始排序{markmax[9][0]=l;markmax[9][1]=snakeleng+1;for(x=0;x<10;x++) //排序并交换排行位置{for(i=x;i<10;i++){if(markmax[x][0]<markmax[i][0]){temp=markmax[x][0];markmax[x][0]=markmax[i][0];markmax[i][0]=temp;temp=markmax[x][1];markmax[x][1]=markmax[i][1];markmax[i][1]=temp;}}}}
}int randcolor()
{int randcolor;srand((int)time(0));randcolor=rand()%10;return randcolor;
}void srandcolor(int randcolor)
{switch(randcolor) //产生随机颜色{case 0:SetConsoleTextAttribute(handle, FOREGROUND_GREEN ); break;case 1:SetConsoleTextAttribute(handle, FOREGROUND_RED ); break;case 2:SetConsoleTextAttribute(handle, FOREGROUND_BLUE ); break;case 3:SetConsoleTextAttribute(handle, FOREGROUND_GREEN | FOREGROUND_RED); break;case 4:SetConsoleTextAttribute(handle, FOREGROUND_GREEN | FOREGROUND_BLUE); break;case 5:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN ); break;case 6:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_RED ); break;case 7:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_BLUE ); break;case 8:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED); break;case 9:SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE); break;}}void keyreceive() //游戏中键盘监听和驱动模块
{if(kbhit())c=getch(); //判断按键模块if((c==75||c=='a'||c=='A')&&last_dir!='d'){snake_body[0].x=snake_body[0].x-2; last_dir = 'a';}else if((c==75||c=='a'||c=='A')&&last_dir=='d'){snake_body[0].x=snake_body[0].x+2; last_dir = 'd';}if((c==77||c=='d'||c=='D')&&last_dir!='a'){last_dir = 'd';snake_body[0].x=snake_body[0].x+2; }else if((c==77||c=='d'||c=='D')&&last_dir=='a'){last_dir = 'a';snake_body[0].x=snake_body[0].x-2; }if((c==80||c=='s'||c=='S')&&last_dir!='w'){snake_body[0].y=snake_body[0].y+1;last_dir = 's';}else if((c==80||c=='s'||c=='S')&&last_dir=='w'){snake_body[0].y=snake_body[0].y-1;last_dir = 'w';}if((c==72||c=='w'||c=='W')&&last_dir!='s'){ snake_body[0].y=snake_body[0].y-1; last_dir = 'w';}else if((c==72||c=='w'||c=='W')&&last_dir=='s'){snake_body[0].y=snake_body[0].y+1; last_dir = 's';}if(c==32) //空格键暂停及设置模块{while(1){gotoxy(11,25);srandcolor(randcolor());printf("游戏暂停中,方向键继续,'i'键进入设置");Sleep(1000);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_GREEN);gotoxy(1,25);printf("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■");//防抖动Sleep(1000);if(kbhit()){c=getch();if(c=='i'||c=='I'){game_opinion(); //设置模块GUI();}break;}}}srandcolor(randcolor());gotoxy(snake_body[0].x,snake_body[0].y); //蛇的关节处变化,更加美观printf("●");
}void gamespeedset() //速度设定模块
{if(speedflag==0){if(l>=1500&&l<=4000){g=120;n=2;}if(l>4000&&l<=6000){g=100;n=3;}if(l>6000&&l<=15000){g=80;n=4;}if(l>15000&&l<=30000){g=50;n=5;}if(l>30000){g=30;n=6;}}if(speedflag==1) //调速则保持速度{switch(n){case 1:g=150;break;case 2:g=120;break;case 3:g=100;break;case 4:g=80;break;case 5:g=50;break;case 6:g=30;break;}}Sleep(g); }void snakemsg() //信息显示模块
{gotoxy(63,4);printf("当前难度等级:%d",n);gotoxy(63,8);printf("游戏分数:%d",l);gotoxy(63,6);printf("蛇身长度:%d",snakeleng+1);gotoxy(63,21);printf("Dz by Yuan");gotoxy(63,12);printf("方向键控制小蛇");gotoxy(63,10);printf("最高记录:%d",markmax[0][0]);gotoxy(63,14);printf("空格键暂停并设置 ");gotoxy(63,23);printf("Defend Your Time");
}void initsnake() //初始化蛇
{ int i,temp=7; system("cls");last_dir = 'd';for(i=0;i<3;i++,temp-=2) { snake_body[i].x=temp; snake_body[i].y=10; srandcolor(randcolor());}
} void printmark() //打印结束游戏分数和评价
{gotoxy(27,11);printf("GAME OVER!");gotoxy(26,14);printf("最终得分:%d\n\n\n\n\n\n",l);if(l<=5000){gotoxy(24,17);printf("评价:有待提高⊙o⊙");}if(l>5000&&l<=30000){gotoxy(24,17);printf("评价:其实还不错!!!");}if(l>30000&&l<=60000){gotoxy(24,17);printf("评价:阁下很厉害!");}if(l>60000){gotoxy(24,17);printf("评价:阁下已经超神了!!!");}while(1){gotoxy(20,20);printf("按方向键继续,M 键查看排行榜");Sleep(800);gotoxy(20,20);printf(" ");Sleep(800);gotoxy(20,20);printf("按方向键继续,M 键查看排行榜");Sleep(200);if(kbhit())break;}}void foodrandom() //随机产生食物坐标
{srand((int)time(0));e=rand()%53+3;h=rand()%22+2;
}void ready_game() //进入游戏前画面
{int k=20;while(!kbhit()){GUI();gotoxy(1,2); printf("■ \n");printf("■ \n");printf("■ \n");printf("■ * * \n");printf("■ * *\n");printf("■* * * \n");printf("■ * * * \n");printf("■ * * * \n");printf("■ * * * \n");printf("■ * * * \n");printf("■ * * *\n");printf("■ * * \n");printf("■ * * \n");printf("■ * * \n");printf("■ \n");printf("■ ■ ■■■ \n");printf("■ ■ ■ ■ ■ \n");printf("■ ■ ■ ■■⊙o⊙■ \n");printf("■ ■ ■ ■■ ■ \n");printf("■ ■ ■ ■ ■ \n");printf("■ ■■■ \n");printf("■ \n");gotoxy(65,15); printf("剩余%d秒",k);gotoxy(64,20);printf("按任意键进入");Sleep(1000);k--;gotoxy(14,22);printf(" 欢 迎 来 到 我 的 贪 吃 蛇 !");gotoxy(65,15);printf("剩余%d秒",k);gotoxy(64,20);printf(" ");Sleep(1000);k--;gotoxy(65,15);printf("剩余%d秒",k);if(k==0)break;}
}void read_next_coord() //读取下一个蛇坐标
{ int i; for(i=snakeleng;i>0;i--) //遍历蛇身{ if(i==snakeleng) //擦除蛇的尾巴{ gotoxy(snake_body[i].x,snake_body[i].y); printf(" "); } snake_body[i].x=snake_body[i-1].x; //坐标给上一段蛇身 snake_body[i].y=snake_body[i-1].y; } srandcolor(randcolor());gotoxy(snake_body[0].x,snake_body[0].y); printf("■");
} void markrank() //分数排行榜UI
{ int i;GUI();while(1){for(i=0;i<10;i++){gotoxy(4,3);printf(" 排名 分数 长度记录");if(i!=9)gotoxy(4,5+(i*2));elsegotoxy(3,5+(i*2));if(markmax[i][0]!=0){printf(" %d %d ",i+1,markmax[i][0]);gotoxy(40,5+(i*2));printf(" %d",markmax[i][1]);}else{printf(" %d **** ",i+1);gotoxy(40,5+(i*2));printf("****");}}gotoxy(62,13);printf("按任意键继续游戏");Sleep(1000);gotoxy(62,13);printf(" ");Sleep(1000);if(kbhit()){ msg_init();system("cls");break;}}
}void food_check()
{int i,flag=1;while(flag) {for(i=snakeleng;i>=0;i--) //遍历蛇身,防止食物生成在蛇身里{ if((abs(snake_body[i].x-e)<2) && (abs(snake_body[i].y-h<2))) { e=rand()%53+3;h=rand()%22+2; flag = 1; //如果生成在蛇身里就再次循环l+=100; //运气不错也能加分} else flag=0; } }flag = 1; //下次循环再次进行判断
}void main()
{HideCursor();system("color 0a");msg_init();initsnake(); foodrandom();ready_game();system("cls");GUI(); checking();
}void game_opinion()
{unsigned char set;system("cls");GUI();SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN );gotoxy(3,3);printf("【设 置】");gotoxy(3,10);printf("【游 戏 说 明】");gotoxy(3,12);printf(" 七彩贪吃蛇小游戏,C语言控制台制作,VC/VS均测试通过");gotoxy(3,14);printf("推荐新手尝试重构代码,如有问题可加QQ:421736951交流,游");gotoxy(3,15);printf("戏制作仓促,作者技术和精力有限,如遇BUG还请见谅!");gotoxy(3,17);printf("可使用右键点击控制台设置默认字体为点阵,可设置窗口大小");gotoxy(3,18);printf("宽度为83,高度为25。");gotoxy(3,22);printf(" -----------coding 2018.3.7");gotoxy(3,20);printf("希望能给编程初学者带来帮助,请勿将源代码用于其他用途!");gotoxy(60,13);printf("方向键设置,回车键确认");while(1){if(kbhit())set = getch();SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED); gotoxy(3,5);printf(" 设置难度等级: %d ",n); //下面代码都是为设置界面显示效果优化gotoxy(3,7);printf(" 设置蛇身长度: %d",snakeleng+1);Sleep(5); //防止屏闪if(set == 72){ gotoxy(3,7);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED);printf(" 设置蛇身长度: %d ",snakeleng+1);while(1){gotoxy(3,5);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN *30| FOREGROUND_GREEN*18);printf(" 设置难度等级: %d ",n);set = getch();speedflag=1;if(set==75){ n-=1;set=72;}if(set==77){n+=1;set=72;}if(set==80){set=80;SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_RED);gotoxy(3,5);printf(" 设置难度等级: %d ",n);break;}if(set==13){ c=77;SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);system("cls");break;}if(n>6||n<1)n=1;}}if(set == 80){ while(1){gotoxy(3,7);SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN *30| FOREGROUND_GREEN*18);if(snakeleng+1<10)printf(" 设置蛇身长度: %d ",snakeleng+1);if((snakeleng+1>9)&&(snakeleng+1<100)) printf(" 设置蛇身长度: %d ",snakeleng+1);if((snakeleng+1>99)&&(snakeleng+1<500))printf(" 设置蛇身长度: %d ",snakeleng+1);set = getch();if(set==75){ snakeleng-=1;set=80;}if(set==77){snakeleng+=1;set=80;}if(set==72){set=72;break;}if(snakeleng>479) //可设置的长度最长为480snakeleng=4;if(snakeleng<4)snakeleng=479;if(set==13)break;}}if(set==13){SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE);system("cls");break;}}c=77;
}void checking() //游戏运行中核心检测模块
{int i,eatflag=0,live;unsigned char score; //接受分数按键while(1){ read_next_coord();keyreceive(); //在循环中没有按键时也需要接收keyreceive(); if(kbhit())keyreceive(); //非阻塞按键并行发生,以此改变蛇关节的外形及颜色for(i=snakeleng;i>=2;i--) //从3蛇身开始才可能头碰撞到尾巴{ if(snake_body[0].x==snake_body[i].x && snake_body[0].y==snake_body[i].y) { eatflag=1; live = 0;} }srandcolor(randcolor()+3);gotoxy(e,h); //产生食物printf("●");if(abs(e-snake_body[0].x)<2&&abs(h-snake_body[0].y)<2){snakeleng+=1;l+=600;gotoxy(e,h); //吃到后迅速擦除食物,并形成蛇身printf(" ");snakemsg();Sleep(120); //吃到了变化颜色刷新闪烁一下分数等信息,并给一定延时减小游戏难度 foodrandom(); //随机升成下一个食物坐标food_check();srandcolor(randcolor()+1);gotoxy(e,h);printf("●");snake_body[snakeleng].x=snake_body[snakeleng-1].x;snake_body[snakeleng].y=snake_body[snakeleng-1].y; }if((snake_body[0].x>=57||snake_body[0].x<=1||snake_body[0].y>=25||snake_body[0].y<=1||eatflag==1)) //如果撞墙或者自杀死亡{GUI();live=0; //游戏结束marksort(); //死亡排行算法 printmark();system("cls");last_dir='d';score=getch();if((score!='m')&&(score!='M')) //如果不查看排行榜,就快速游戏{system("cls"); //清屏msg_init(); //初始化显示信息initsnake(); //初始化蛇身live=1; //让蛇处于存活状态speedflag=0; //默认不调速main(); //*主函数(按方向键将会快速再次开始游戏,其它键进入最初界面)}else //查看排行榜 markrank(); //排行算法main();}localtime();SetConsoleTextAttribute(handle, FOREGROUND_INTENSITY | FOREGROUND_BLUE | FOREGROUND_GREEN);snakemsg();gamespeedset(); //难度等级设定}
}
---------------------
作者:qq_16620025
来源:CSDN
原文:https://blog.csdn.net/qq_16620025/article/details/97148223
版权声明:本文为博主原创文章,转载请附上博文链接!
C语言七彩贪吃蛇源代码---AI自动寻径,分数排行,数据保存,背景音乐难度设置等 控制台小游戏相关推荐
- c语言安卓贪吃蛇代码下载,C语言贪吃蛇代码
c语言编写贪吃蛇源代码,简单易懂,文件为VC源代码.如果你正在学习c语言,就来下载吧.很经典的 C语言贪吃蛇代码部分 #include #include #include#include #defin ...
- 安卓c语言自动补全软件吾爱,C语言实现贪吃蛇小游戏
本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 一.程序实现的原理: 1.构造蛇身:定义一个坐标数组,存放的是蛇的每一节蛇身所在的坐标位置.这样就将移动蛇身的操作转换为 ...
- 简单贪吃蛇c语言代码,一个C语言写简单贪吃蛇源代码.doc
一个C语言写简单贪吃蛇源代码 #include #include #include #include #include #include int grade=5,point=0,life=3; voi ...
- 贪吃蛇统计分数的c语言代码,C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!...
接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...
- 语言写贪吃蛇墙角符号_从零基础到拥抱人工智能,您的孩子可能就差一个贪吃蛇游戏...
去年寒假档,有一部孩子们喜欢的电影上映. 不知道家长们有没有陪孩子一起看过这部<无敌破坏王2:大闹互联网> 在电影中有一个印象深刻的镜头, 吃豆人.泡泡龙.还有贪吃蛇 他们都因为很久没有客 ...
- linux贪吃蛇c程序,Linux环境下C语言实现贪吃蛇游戏
Linux环境下C语言实现贪吃蛇游戏 [liul@test snake]$ more snake.c #include #include #include #include #include #def ...
- c语言-链表-贪吃蛇
1. c语言-链表-贪吃蛇 坐标的结构体-COORD COORD c;c.X = x;c.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_ ...
- C语言实现贪吃蛇代码
C语言实现贪吃蛇,有点难写啊. 我是用VS写的 代码里有注释 我就不多说了 大家也可以直接去下载我的可执行文件 #include<stdio.h> #include<time.h&g ...
- 利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇“自动运行函数”
利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇"自动运行函数" 完整的项目链接: https://github.com/linxinloningg/51_chip ...
最新文章
- AAuto如何设置combobox
- ArrayList和LinkedList区别
- 使用免费虚拟服务器建站并实现域名解析
- 【PAT乙级】1025 反转链表 (25 分)
- oracle01507报错,oracle报错ORA-01507
- 白居易最动人的10句诗
- QT 用QAudio语音库实现音频信号的采集 以及发送到另一台电脑 播放
- 物联网来了,智能城市离我们还有多远?
- MTCNN优化和另类用法
- java调用萤石对讲_海康萤石摄像头SDK Java(一)java本地调用摄像头
- Flutter跑马灯Marquee
- click 简单易用的Python命令行
- 从unity到unreal4 虚幻4学习笔记 一 : ue4与vs studio、vs code开发环境的安装与配置
- android使图片变为圆形
- 【asp.net】MVC中cshtml页面Razor语法大全(综合实例)
- 用python预测小孩的身高_Python+sklearn使用线性回归算法预测儿童身高
- 在线客服系统如何应对移动化市场需求
- DNS毒化攻击及防御
- 什么是DC / AC / OC 机房?
- 深度优先搜索-Python
热门文章
- 适合房产中介使用的房产管理系统源码哪个比较好用?
- 将一个字符串从小到大排序输出
- 从外包程序员到阿里合伙人,新任阿里CTO鲁肃:每一滴为梦想流过的汗水,都是钻石!...
- JS object 添加元素 数组添加对象
- 红米3S解锁_解账号锁刷机包_(2016033-2016036-2016035)线刷包
- vue学习之环境部署及简单使用
- 时间,时间,我很害怕你,我现在只有和你赛跑了。
- 全球及中国文件传输软件行业应用动态及市场调研分析报告2021年版
- 和氟西汀类似的备注_最近“医学生秀备注”风很大,甜到掉渣,你是我的氟西汀!...
- 2020 ICPC 南京站 F Fireworks (概率论+三分)