#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<string.h>
#include<time.h>
#include<string.h>
#include<conio.h>//********************************************按键控制********************************************
#define up 'w'
#define down 's'
#define left 'a'
#define right 'd'
#define stop 'p'
//********************************************按键控制********************************************//********************************************自定义函数********************************************
void welcome();//开始界面
void Finish();//结束界面
void creatgraph();//打印围墙
void gotoxy(int x,int y);//坐标打印
void gotoprint(int x,int y);//配合坐标指定打印
void gotodelete(int x,int y);//配合坐标指定删除
void creatfood();//随机产生的食物链
int ClickControl();//以此获取键盘信号
int Judge();//游戏结束的信号
void MovingBody();//游戏中蛇的移动
void Eating();//蛇吃到东西后的操作(变长)
void ChangeBody(int a,int b);//蛇的坐标变换,后一个复制前一个STRUCT,a,b为head之前的坐标
char *s_get(char *st,int n);//字符串输入
//********************************************自定义函数********************************************//********************************************全局变量+预处理********************************
typedef struct Snake{int x;int y;struct Snake *next;
}snake;//蛇身的每一个坐标点snake *head,*tail;//蛇的头跟尾部struct Food{int x;int y;
}food;//蛇的食物呀!!!char name[20];//用户登录贪吃蛇游戏名字
int score=0;//计算游戏时总的分数
char click=1;//用来获取用户控制游戏的信息
int speak;//每次的缓冲时间
//********************************************全局变量+预处理********************************//********************************************主体函数********************************************
int main()
{system("color 0B");welcome();//开始的界面 第64行开始的代码creatgraph();//打印出围墙(游戏范围) 第105行代码开始creatfood();//用于产生贪吃蛇粮食的函数 第179行代码开始if(ClickControl()==0)//获取键盘信号 第205行代码开始Finish();//返回结束界面return 0;
}
//********************************************主体函数********************************************//********************************************自定义函数代码********************************************//-----------------游戏开始界面-----------------
void welcome()//开始界面
{//注意了改距离是我经过试验后所得,可以根据实际情况更改gotoxy(10,6);printf("*****************************************");gotoxy(10,20);printf("*****************************************");gotoxy(10,8);printf("欢迎来到整修版贪吃蛇!!!");gotoxy(10,13);printf("控制wsad四键,暂停为p,q为退出!");gotoxy(10,18);printf("输入将要生成的贪吃蛇名字吧:");s_get(name,20);gotoxy(10,21);system("pause");system("cls");}
//-----------------游戏开始界面-----------------//-----------------游戏结束界面-----------------
void Finish()//结束界面
{system("cls");//清除前面所有的内容(俗称清屏)gotoxy(10,6);printf("*****************************************");gotoxy(10,20);printf("*****************************************");gotoxy(10,8);printf("游戏结束了!!!");gotoxy(10,13);printf("友情提示:YOU GAME OVER!!!!");gotoxy(10,18);printf("游戏总得分:%d",score);gotoxy(10,21);free(head);//这里我们需要释放掉一直存在内存free(tail);//从136行代码开始看system("pause");
}
//-----------------游戏结束界面-----------------//-----------------打印游戏范围和一开始的蛇-----------------
void creatgraph()//打印围墙
{int i;for(i=0;i<48;i+=2)//此处为打印上下部分的围墙{//因为打印的每一个方块都是两个字节所以这里需要+2来平衡,//另外48既是从左到右一共有48个字节,比喻:人要走48小步才到达终点gotoprint(i,0);//gotoprint(i,20);//请自行决定数值也可以}for(i=0;i<21;i++)//此处为了打印左右部分的围墙{gotoprint(0,i);gotoprint(48,i);}//上面的坐标点可以参考x、y轴这种思考办法gotoxy(51,6);//我们将输出光标移动一下位置printf("欢迎来到贪吃蛇2.0改:%s。",name);//这个是你的名字gotoxy(51,10);//为了美观我劝你还是照办得好(对齐)printf("呵呵,这是你现有的分数:%d",score);gotoxy(51,14);printf("该游戏是萌新兔改进抄袭2.0版!");//好吧!上面这一部分无关紧要head=(snake *)malloc(sizeof(snake));head->x=20;head->y=17;tail=(snake *)malloc(sizeof(snake));snake *p=(snake *)malloc(sizeof(snake));snake *q=(snake *)malloc(sizeof(snake));snake *a;(*p).x=18;p->y=17;q->x=16;q->y=17;//这一部分是蛇一开始的坐标位置,一开始蛇就三节head->next=p;//蛇头后的一节p->next=q;//好吧,到这里是一开始三块中间块后面的尾巴(就是最后一块)q->next=tail;//好吧,这里是尾巴了,我这个NULL是不是很惊喜tail->next=NULL;a=head;while(a->next!=NULL){gotoprint(a->x,a->y);a=a->next;}}
//-----------------打印游戏范围和一开始的蛇-----------------//-----------------给定坐标后再屏幕某坐标打印函数-----------------
void gotoxy(int x,int y)//坐标打印
{COORD loc={x,y};//用户指定的某个坐标点HANDLE houpt=GetStdHandle(STD_OUTPUT_HANDLE);//固定的函数,里面的output是标准输出SetConsoleCursorPosition(houpt,loc);//固定函数,意思是将改坐标点输入到屏幕某点
}
//-----------------给定坐标后再屏幕某坐标打印函数-----------------//-----------------输出打印小方块-----------------
void gotoprint(int x,int y)//配合坐标指定打印
{gotoxy(x,y);printf("■");
}
//-----------------输出打印小方块-----------------//-----------------用于清空的函数-----------------
void gotodelete(int x,int y)//配合坐标指定删除
{gotoxy(x,y);printf("  ");//注意这里是两个空格,因为一个空格一个字节
}
//-----------------用于清空的函数-----------------//-----------------用于产生贪吃蛇粮食的函数-----------------
void creatfood()//随机产生的食物链
{srand((int)time(NULL));lable://标签,与下面的goto一起用哦,goto回到这里food.x=rand()%44+2;//我的地图可是48宽,第47和48还有0,1是墙food.y=rand()%19+1;//高度为21哦,0和21我不用明说if(food.x%2!=0)food.x+=1;//因为输入的方块可是两个字节的,所以必须是双数snake *judge=head;//这个是蛇头的,也就是头部的方块while(1){if(judge->next==NULL) break;//蛇头返回是空的if(food.x==(*judge).x&&food.y==(*judge).y)//如果蛇与食物一开始就出现在同一个位置{goto lable;//返回上面的lable位置继续循环}judge=judge->next;}gotoxy(food.x,food.y);printf("★");
}
//-----------------用于产生贪吃蛇粮食的函数-----------------//-----------------方向键控制输入-----------------
int ClickControl()//以此获取键盘信号
{int i=1;char as;while(1){if(Judge()==0) return 0;if(kbhit())//按键输入的函数,会读取键盘按键的信息{as=getch();switch(as){case up://如果输入的是上if(click!=2)//那么就要杜绝掉下,以防止出现掉头//这里的click保留的是上一个,打比方就是如果上一个是向下//那么click就不能等于向上,杜绝掉头,所以必须保证click上一个操作不是下//那么这次的click操作向上可以成立click=1;break;case down://同上if(click!=1)click=2;break;case left://同上if(click!=4)click=3;break;case right://同上if(click!=3)click=4;break;case stop:click=5;break;case 'q':Finish();}}if(i==1){click=4;i--;}MovingBody();//蛇的移动操作等功能Eating();//蛇吃到东西后的操作(变长) 第292行代码开始}return 1;
}
//-----------------方向键控制输入-----------------//-----------------蛇的防撞解析-----------------
int Judge()//游戏结束的信号(吃自己(撞墙)还不结束)
{if(head->x==0||head->x==46||head->y==0||head->y==20)//都直接撞墙了{return 0;//这里是我以防万一的设置}snake *p=head->next;//将蛇的链表节点接入while(p!=NULL)//最后都等于清空了,还怎么玩{if(head->x==p->x&&head->y==p->y){return 0.;}//这里是保持头依旧是头的坐标,如果是蛇身上任意一点的话,呵呵p=p->next;//这里的节点必须进入下一个}return 1;//恭喜你,这里是保证你吃自己活着撞墙了
}
//-----------------蛇的防撞解析-----------------//-----------------蛇每次吃到食物后的操作以及蛇的移动算法(蛇的打印)-----------------
void MovingBody()//游戏中蛇的移动
{int count=0;//这个是用来计分的,放心往下看你就知道了int a=head->x,b=head->y;//蛇头的坐标点snake *p=head;//整条蛇的结构while(p->next!=NULL){gotodelete(p->x,p->y);//每次移动后都得删减p=p->next;}p=head->next;switch(click)//键盘每次敲击输入的数{case 1:       head->y-=1;  ChangeBody(a,b);  break;//第302行为蛇的坐标移动case 2:  head->y+=1;   ChangeBody(a,b);  break;//上下是一个字节case 3:      head->x-=2;    ChangeBody(a,b);  break;case 4:    head->x+=2;   ChangeBody(a,b);  break;//左右时两个字节//这里的十字坐标轴区翻翻看你就明白了case 5: getch(); break;//getchar()本身就是暂停呀!!!!!case 6:  Finish();  break;}p=head;//这个是把头给这个指针while(p->next!=NULL)//每一次敲击键盘后上面数据更新这里就打印一次{gotoprint(p->x,p->y);//将每一个节点打印出来count++;//计分每次加1p=p->next;}p=head;//同上 第257行gotoxy(0,24);if(count<=30) speak=200;else if(count>30&&count<=60) speak=150;else if(count>60&&count<=90) speak=100;else speak=50;Sleep(speak);//每次你吃掉了食物后增加的速度也就是这个刷新了}
//-----------------蛇每次吃到食物后的操作以及蛇的移动算法(蛇的打印)-----------------//-----------------蛇长大的操作-----------------
void Eating()//蛇吃到东西后的操作(变长)
{if(head->x==food.x&&head->y==food.y){creatfood();//每次吃到食物后腰刷新出来snake *knew=(snake *)malloc(sizeof(snake));//定义一个新的结构变量snake *p;//没错,又是我p=head;//一开始就等于头while(p->next->next!=NULL)//尾巴没有到最后{p=p->next;//就给我一直冲}p->next=knew;knew->next=tail;//第148行设置了tail->next为NULLscore+=10;//计分器gotoxy(75,10);printf("%d",score);}
}
//-----------------蛇长大的操作-----------------//-----------------蛇移动的坐标转换-----------------
void ChangeBody(int a,int b)//蛇的坐标变换
{snake *p=head->next;//直接进入链表里面int mix1,miy1,mix2,miy2;mix1=p->x;miy1=p->y;//将坐标给予while(p->next->next!=NULL)//参考冒泡排序即可{//坐标交换mix2=p->next->x;miy2=p->next->y;p->next->x=mix1;p->next->y=miy1;mix1=mix2;miy1=miy2;p=p->next;//这个相当于for()里面最后的++循环}//将第一个(x,y)坐标丢给第二个(x,y)坐标,第二个的坐标保留//依次将会一直推下去,知道NULLp=head->next;{//这里就等于将开头给出的坐标丢到第二个节点了,就是第二节蛇身p->x=a;p->y=b;}
}
//-----------------蛇移动的坐标转换-----------------//-----------------字符串输入家检验-----------------
char *s_get(char *st,int n)//字符串输入
{char *find,*as;as=fgets(st,n,stdin);if(as){find=strchr(st,'\n');if(find) *find='\0';else while(getchar()!='\n') continue;}return as;
}
//-----------------字符串输入家检验-----------------//********************************************自定义函数代码********************************************

贪吃蛇 (自我修改添加)相关推荐

  1. Pygame实战项目:用300行代码写出贪吃蛇小游戏

    贪吃蛇是一款逻辑清晰.操作简单.老少咸宜.备受欢迎的休闲小游戏. 下面就给大家介绍一下贪吃蛇游戏的基本原理,以及实现贪吃蛇所需要的相关方法. 一.主要思路 我们的贪吃蛇游戏将主要包括三个核心模块,分别 ...

  2. 用python做贪吃蛇

    手把手带你用python做小游戏 此篇建议小白反复食用 每当你女神或者女友看着电视里的程序员痴迷发呆时,你是不是也捶胸顿足,暗自发狠,噢!为什么我怎么不能像电视里的程序员一样自信.一样帅气.一样-不好 ...

  3. 贪吃蛇003(添加背景音乐,网格线背景,绘制网格线)

    import random import sysimport pygame#窗口变量 windows_width = 800 windows_height = 480 cell_size = 20 # ...

  4. 狂神GUI贪吃蛇免费图片资源加代码(其中逻辑有修改)

    狂神GUI贪吃蛇记录 首先做一个总结:我是看完Java基础部分开始这部分学习的,当看到各种类与类之间的调用之后才发现自己的Java基础其实并没有学到什么,真的就是学会了int and for,所以只要 ...

  5. c语言贪吃蛇添加排行榜,c语言贪吃蛇排行榜_...12年4月编程语言排行榜 C语言荣归宝座...

    12年4月编程语言排行榜 C语言荣归宝座 JPG,902x531,131KB,424_250 C语言在目前的编程语言排行榜上占据头名的位置-全屏显示课程章节 JPG,500x267,232KB,467 ...

  6. 蘑菇云「行空板Python入门教程」第六课:贪吃蛇小游戏

    在很久很久以前,手机屏幕都还是黑白的年代,有一款叫做"贪吃蛇"的游戏风靡了大街小巷,在那分辨率极低的屏幕上,几条扭扭曲曲的弧线似乎穿越了整个童年. 这节课上,就让我们用行空板来实现 ...

  7. Win32小游戏--贪吃蛇

    近日里学习了关于win32编程的相关知识,利用这些知识制作了一款贪吃蛇小游戏,具体细节还是分模块来叙述 前期准备:在网上找到一些贪吃蛇的游戏素材图片,以及具体的逻辑框图 在正式写功能之前,先把一系列环 ...

  8. Win32 游戏开发:贪吃蛇 下篇

    因为个人原因更新来晚了,向各位关注的读者道个歉... 前排提示: 文章非常的长!!!(如有不懂的请在文章下方评论) 6)开始码代码啦 经过上面的前期工作,我们应该更清楚我们要做怎么做了(至少有一个方向 ...

  9. C语言贪吃蛇课程设计实验报告(包含贪吃蛇项目源码)

    文末有贪吃蛇代码全览,代码有十分细致的注释!!! 文末有贪吃蛇代码全览,代码有十分细致的注释!!! 文末有贪吃蛇代码全览,代码有十分细致的注释!!! 码文不易,给个免费的小星星和免费的赞吧,关注也行呀 ...

  10. 用 Python 写个贪吃蛇,保姆级教程

    本文基于 Windows 环境开发,适合 Python 新手 下面我们就一起用 Python 实现一个简单有趣的命令行贪吃蛇小游戏,启动命令: .私信小编01即可获取大量Python学习教程 git ...

最新文章

  1. Mac MySQL 数据库配置(关系型数据库管理系统)
  2. 魅族员工哀叹把青春献给了公司,当年如果选择小米,人生会不一样
  3. CentOS 5.5 手动安装 GCC4.6.2
  4. CPU 空闲时在干嘛?
  5. python语言入门m-Python入门基础三-函数
  6. postman发送json请求,使用案例
  7. Java EE,Gradle和集成测试
  8. es集群搭建_滴滴Elasticsearch 集群跨版本升级与平台重构之路
  9. 深度学习-CNN提取图像特征
  10. ×××须避开的高薪杀手
  11. Confluence 6 匿名访问远程 API
  12. root权限执行java_执行具有root权限的java代码(一)
  13. 服务器 'server_1' 上的 MSDTC 不可用
  14. 使用Qt框架开发http服务器问题的记录
  15. CF1169(div2)题解报告
  16. share 接口的使用
  17. matlab索引超出数组边界且不提示数组边界的一种处理办法
  18. 史上最全!!收藏了!3D建模软件大全
  19. pyecharts中文手册
  20. vmware15安装黑苹果懒人版教程

热门文章

  1. 针孔相机畸变成像详解
  2. 记一次菜鸟网络电话面试
  3. Mybatis 从入门到入魔
  4. 怎么清除U盘病毒的简单步骤
  5. 彻底禁用win10自动更新功能及其powershell代码
  6. php eval()函数
  7. 周易内核与计算机原理,周易原理之我说(一)
  8. Mysql 事务锁等待时间超时
  9. APISpace 手机号码归属地API 方便好用
  10. 六、定语从句和关系代词