-------------------------------------------------------------------------------------------

七彩贪吃蛇小游戏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自动寻径,分数排行,数据保存,背景音乐难度设置等 控制台小游戏相关推荐

  1. c语言安卓贪吃蛇代码下载,C语言贪吃蛇代码

    c语言编写贪吃蛇源代码,简单易懂,文件为VC源代码.如果你正在学习c语言,就来下载吧.很经典的 C语言贪吃蛇代码部分 #include #include #include#include #defin ...

  2. 安卓c语言自动补全软件吾爱,C语言实现贪吃蛇小游戏

    本文实例为大家分享了C语言实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 一.程序实现的原理: 1.构造蛇身:定义一个坐标数组,存放的是蛇的每一节蛇身所在的坐标位置.这样就将移动蛇身的操作转换为 ...

  3. 简单贪吃蛇c语言代码,一个C语言写简单贪吃蛇源代码.doc

    一个C语言写简单贪吃蛇源代码 #include #include #include #include #include #include int grade=5,point=0,life=3; voi ...

  4. 贪吃蛇统计分数的c语言代码,C/C++编程笔记:C语言贪吃蛇源代码控制台(二),分数和食物!...

    接上文<C/C++编程笔记:C语言贪吃蛇源代码控制台(一),会动的那种哦!>如果你在学习C语言开发贪吃蛇的话,零基础建议从上一篇开始哦!接下来正式开始吧! 三.蛇的运动 上次我已经教大家画 ...

  5. 语言写贪吃蛇墙角符号_从零基础到拥抱人工智能,您的孩子可能就差一个贪吃蛇游戏...

    去年寒假档,有一部孩子们喜欢的电影上映. 不知道家长们有没有陪孩子一起看过这部<无敌破坏王2:大闹互联网> 在电影中有一个印象深刻的镜头, 吃豆人.泡泡龙.还有贪吃蛇 他们都因为很久没有客 ...

  6. linux贪吃蛇c程序,Linux环境下C语言实现贪吃蛇游戏

    Linux环境下C语言实现贪吃蛇游戏 [liul@test snake]$ more snake.c #include #include #include #include #include #def ...

  7. c语言-链表-贪吃蛇

    1. c语言-链表-贪吃蛇 坐标的结构体-COORD COORD c;c.X = x;c.Y = y;SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_ ...

  8. C语言实现贪吃蛇代码

    C语言实现贪吃蛇,有点难写啊. 我是用VS写的 代码里有注释 我就不多说了 大家也可以直接去下载我的可执行文件 #include<stdio.h> #include<time.h&g ...

  9. 利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇“自动运行函数”

    利用51单片机+hc595芯片配合在led点阵上玩贪吃蛇 第二篇"自动运行函数" 完整的项目链接: https://github.com/linxinloningg/51_chip ...

最新文章

  1. AAuto如何设置combobox
  2. ArrayList和LinkedList区别
  3. 使用免费虚拟服务器建站并实现域名解析
  4. 【PAT乙级】1025 反转链表 (25 分)
  5. oracle01507报错,oracle报错ORA-01507
  6. 白居易最动人的10句诗
  7. QT 用QAudio语音库实现音频信号的采集 以及发送到另一台电脑 播放
  8. 物联网来了,智能城市离我们还有多远?
  9. MTCNN优化和另类用法
  10. java调用萤石对讲_海康萤石摄像头SDK Java(一)java本地调用摄像头
  11. Flutter跑马灯Marquee
  12. click 简单易用的Python命令行
  13. 从unity到unreal4 虚幻4学习笔记 一 : ue4与vs studio、vs code开发环境的安装与配置
  14. android使图片变为圆形
  15. 【asp.net】MVC中cshtml页面Razor语法大全(综合实例)
  16. 用python预测小孩的身高_Python+sklearn使用线性回归算法预测儿童身高
  17. 在线客服系统如何应对移动化市场需求
  18. DNS毒化攻击及防御
  19. 什么是DC / AC / OC 机房?
  20. 深度优先搜索-Python

热门文章

  1. 适合房产中介使用的房产管理系统源码哪个比较好用?
  2. 将一个字符串从小到大排序输出
  3. 从外包程序员到阿里合伙人,新任阿里CTO鲁肃:每一滴为梦想流过的汗水,都是钻石!...
  4. JS object 添加元素 数组添加对象
  5. 红米3S解锁_解账号锁刷机包_(2016033-2016036-2016035)线刷包
  6. vue学习之环境部署及简单使用
  7. 时间,时间,我很害怕你,我现在只有和你赛跑了。
  8. 全球及中国文件传输软件行业应用动态及市场调研分析报告2021年版
  9. 和氟西汀类似的备注_最近“医学生秀备注”风很大,甜到掉渣,你是我的氟西汀!...
  10. 2020 ICPC 南京站 F Fireworks (概率论+三分)