贪吃蛇 (自我修改添加)
#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;
}
//-----------------字符串输入家检验-----------------//********************************************自定义函数代码********************************************
贪吃蛇 (自我修改添加)相关推荐
- Pygame实战项目:用300行代码写出贪吃蛇小游戏
贪吃蛇是一款逻辑清晰.操作简单.老少咸宜.备受欢迎的休闲小游戏. 下面就给大家介绍一下贪吃蛇游戏的基本原理,以及实现贪吃蛇所需要的相关方法. 一.主要思路 我们的贪吃蛇游戏将主要包括三个核心模块,分别 ...
- 用python做贪吃蛇
手把手带你用python做小游戏 此篇建议小白反复食用 每当你女神或者女友看着电视里的程序员痴迷发呆时,你是不是也捶胸顿足,暗自发狠,噢!为什么我怎么不能像电视里的程序员一样自信.一样帅气.一样-不好 ...
- 贪吃蛇003(添加背景音乐,网格线背景,绘制网格线)
import random import sysimport pygame#窗口变量 windows_width = 800 windows_height = 480 cell_size = 20 # ...
- 狂神GUI贪吃蛇免费图片资源加代码(其中逻辑有修改)
狂神GUI贪吃蛇记录 首先做一个总结:我是看完Java基础部分开始这部分学习的,当看到各种类与类之间的调用之后才发现自己的Java基础其实并没有学到什么,真的就是学会了int and for,所以只要 ...
- c语言贪吃蛇添加排行榜,c语言贪吃蛇排行榜_...12年4月编程语言排行榜 C语言荣归宝座...
12年4月编程语言排行榜 C语言荣归宝座 JPG,902x531,131KB,424_250 C语言在目前的编程语言排行榜上占据头名的位置-全屏显示课程章节 JPG,500x267,232KB,467 ...
- 蘑菇云「行空板Python入门教程」第六课:贪吃蛇小游戏
在很久很久以前,手机屏幕都还是黑白的年代,有一款叫做"贪吃蛇"的游戏风靡了大街小巷,在那分辨率极低的屏幕上,几条扭扭曲曲的弧线似乎穿越了整个童年. 这节课上,就让我们用行空板来实现 ...
- Win32小游戏--贪吃蛇
近日里学习了关于win32编程的相关知识,利用这些知识制作了一款贪吃蛇小游戏,具体细节还是分模块来叙述 前期准备:在网上找到一些贪吃蛇的游戏素材图片,以及具体的逻辑框图 在正式写功能之前,先把一系列环 ...
- Win32 游戏开发:贪吃蛇 下篇
因为个人原因更新来晚了,向各位关注的读者道个歉... 前排提示: 文章非常的长!!!(如有不懂的请在文章下方评论) 6)开始码代码啦 经过上面的前期工作,我们应该更清楚我们要做怎么做了(至少有一个方向 ...
- C语言贪吃蛇课程设计实验报告(包含贪吃蛇项目源码)
文末有贪吃蛇代码全览,代码有十分细致的注释!!! 文末有贪吃蛇代码全览,代码有十分细致的注释!!! 文末有贪吃蛇代码全览,代码有十分细致的注释!!! 码文不易,给个免费的小星星和免费的赞吧,关注也行呀 ...
- 用 Python 写个贪吃蛇,保姆级教程
本文基于 Windows 环境开发,适合 Python 新手 下面我们就一起用 Python 实现一个简单有趣的命令行贪吃蛇小游戏,启动命令: .私信小编01即可获取大量Python学习教程 git ...
最新文章
- Mac MySQL 数据库配置(关系型数据库管理系统)
- 魅族员工哀叹把青春献给了公司,当年如果选择小米,人生会不一样
- CentOS 5.5 手动安装 GCC4.6.2
- CPU 空闲时在干嘛?
- python语言入门m-Python入门基础三-函数
- postman发送json请求,使用案例
- Java EE,Gradle和集成测试
- es集群搭建_滴滴Elasticsearch 集群跨版本升级与平台重构之路
- 深度学习-CNN提取图像特征
- ×××须避开的高薪杀手
- Confluence 6 匿名访问远程 API
- root权限执行java_执行具有root权限的java代码(一)
- 服务器 'server_1' 上的 MSDTC 不可用
- 使用Qt框架开发http服务器问题的记录
- CF1169(div2)题解报告
- share 接口的使用
- matlab索引超出数组边界且不提示数组边界的一种处理办法
- 史上最全!!收藏了!3D建模软件大全
- pyecharts中文手册
- vmware15安装黑苹果懒人版教程