#include <stdio.h>
#include <time.h>
#include <windows.h>
#include <stdlib.h>#define U 1
#define D 2
#define L 3
#define R 4       //蛇的状态,U:上 ;D:下;L:左 R:右typedef struct SNAKE //蛇身的一个节点
{int x;int y;struct SNAKE* next;
}snake;//全局变量//
int score = 0, add = 10;//总得分与每次吃食物得分。
int status, sleeptime = 200;//每次运行的时间间隔
snake* head, * food;//蛇头指针,食物指针
snake* q;//遍历蛇的时候用到的指针
int endgamestatus = 0; //游戏结束的情况,1:撞到墙;2:咬到自己;3:主动退出游戏。//声明全部函数//
void Pos();
void creatMap();
void initsnake();
int biteself();
void createfood();
void cantcrosswall();
void snakemove();
void pause();
void gamecircle();
void welcometogame();
void endgame();
void gamestart();
void replay();
void choose();void Pos(int x, int y)//设置光标位置
{COORD pos;HANDLE hOutput;pos.X = x;pos.Y = y;hOutput = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOutput, pos);
}void creatMap()//创建地图
{int i;for (i = 0; i < 58; i += 2)//打印上下边框{Pos(i, 0);printf("■");Pos(i, 26);printf("■");}for (i = 1; i < 26; i++)//打印左右边框{Pos(0, i);printf("■");Pos(56, i);printf("■");}
}void initsnake()//初始化蛇身
{snake* tail;int i;tail = (snake*)malloc(sizeof(snake));//从蛇尾开始,头插法,以x,y设定开始的位置//tail->x = 24;tail->y = 5;tail->next = NULL;for (i = 1; i <= 4; i++){head = (snake*)malloc(sizeof(snake));head->next = tail;head->x = 24 + 2 * i;head->y = 5;tail = head;}while (tail != NULL)//从头到尾,输出蛇身{Pos(tail->x, tail->y);printf("■");tail = tail->next;}
}int biteself()//判断是否咬到了自己
{snake* self;self = head->next;while (self != NULL){if (self->x == head->x && self->y == head->y){return 1;}self = self->next;}return 0;
}void createfood()//随机出现食物
{snake* food_1;srand((unsigned)time(NULL));food_1 = (snake*)malloc(sizeof(snake));while ((food_1->x % 2) != 0)    //保证其为偶数,使得食物能与蛇头对其{food_1->x = rand() % 52 + 2;}food_1->y = rand() % 24 + 1;q = head;while (q->next == NULL){if (q->x == food_1->x && q->y == food_1->y) //判断蛇身是否与食物重合{free(food_1);createfood();}q = q->next;}Pos(food_1->x, food_1->y);food = food_1;printf("■");
}void cantcrosswall()//不能穿墙
{if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26){endgamestatus = 1;endgame();}
}
//反复调用此函数
// 函数协作
//说明:无论蛇是否吃到食物 蛇身都会延长
void snakemove()//蛇前进,上U,下D,左L,右R
{snake* nexthead;//定义蛇头下一个位置结构化指针 关联函数:struct snakecantcrosswall();//不能撞墙 关联函数:cantcrosswall()nexthead = (snake*)malloc(sizeof(snake));//为蛇头的下一个位置变量申请内存 使用了window.h的sizeofif (status == U)//向上移动 关联函数:游戏控制 键入w返回值为1{//正常移动nexthead->x = head->x;nexthead->y = head->y - 1;//蛇头的下一个位置y坐标+1 if (nexthead->x == food->x && nexthead->y == food->y)//如果下一个有食物//蛇头时时刻刻在判断前方是否有食物//原理:蛇头的下一个位置坐标与食物的坐标重合{nexthead->next = head;//新的蛇头的下一个位置成为了旧的nexthead的下一个坐标head = nexthead;//旧的nexthead成为了新的蛇头q = head;//蛇头&蛇身的遍及 q指针指向了新蛇头while (q != NULL)//开始打印蛇身 q指针向后指 直到q指针的指向为空 停止打印{Pos(q->x, q->y);//使用了window.h中的posprintf("■");//打印蛇头蛇身q = q->next;}score = score + add;//比分相加 关联函数:游戏控制中的比分createfood();//继续创建食物 关联函数:createfood()}else//如果没有食物{nexthead->next = head;head = nexthead;q = head;//以上程序与前一个原理相同while (q->next->next != NULL)//打印蛇身直到q指针指向为空 停止打印 会多打印一节蛇身//解决方法:将最后一节蛇身打印为空白{Pos(q->x, q->y);printf("■");//打印蛇身q = q->next;}Pos(q->next->x, q->next->y);//指向多打印的一节蛇身printf("  ");//将其打印为空白free(q->next);//释放内存q->next = NULL;//q指针置空}}//以下程序原理与上述相同if (status == D)//向下移动{nexthead->x = head->x;nexthead->y = head->y + 1;if (nexthead->x == food->x && nexthead->y == food->y)  //有食物{nexthead->next = head;head = nexthead;q = head;while (q != NULL){Pos(q->x, q->y);printf("■");q = q->next;}score = score + add;createfood();}else                               //没有食物{nexthead->next = head;head = nexthead;q = head;while (q->next->next != NULL){Pos(q->x, q->y);printf("■");q = q->next;}Pos(q->next->x, q->next->y);printf("  ");free(q->next);q->next = NULL;}}if (status == L)//向左移动{nexthead->x = head->x - 2;//考虑到屏幕宽度 一次移动2个格nexthead->y = head->y;if (nexthead->x == food->x && nexthead->y == food->y)//有食物{nexthead->next = head;head = nexthead;q = head;while (q != NULL){Pos(q->x, q->y);printf("■");q = q->next;}score = score + add;createfood();}else                                //没有食物{nexthead->next = head;head = nexthead;q = head;while (q->next->next != NULL){Pos(q->x, q->y);printf("■");q = q->next;}Pos(q->next->x, q->next->y);printf("  ");free(q->next);q->next = NULL;}}if (status == R)//向右移动{nexthead->x = head->x + 2;nexthead->y = head->y;if (nexthead->x == food->x && nexthead->y == food->y)//有食物{nexthead->next = head;head = nexthead;q = head;while (q != NULL){Pos(q->x, q->y);printf("■");q = q->next;}score = score + add;createfood();}else                                         //没有食物{nexthead->next = head;head = nexthead;q = head;while (q->next->next != NULL){Pos(q->x, q->y);printf("■");q = q->next;}Pos(q->next->x, q->next->y);printf("  ");free(q->next);q->next = NULL;}}if (biteself() == 1)       //判断是否会咬到自己{endgamestatus = 2;//对于游戏死亡结果的判断 关联函数:endcircle();endgame();}
}void pause()//暂停
{while (1){Sleep(300);if (GetAsyncKeyState(VK_SPACE)){break;}}
}void gamecircle()//控制游戏
{Pos(64, 15);printf("不能穿墙,不能咬到自己\n");Pos(64, 16);printf("用↑.↓.←.→分别控制蛇的移动.");Pos(64, 17);printf("F1 为加速,F2 为减速\n");Pos(64, 18);printf("ESC :退出游戏.space:暂停游戏.");status = R;while (1){Pos(64, 10);printf("得分:%d  ", score);Pos(64, 11);printf("每个食物得分:%d分", add);if (GetAsyncKeyState(VK_UP) && status != D){status = U;}else if (GetAsyncKeyState(VK_DOWN) && status != U){status = D;}else if (GetAsyncKeyState(VK_LEFT) && status != R){status = L;}else if (GetAsyncKeyState(VK_RIGHT) && status != L){status = R;}else if (GetAsyncKeyState(VK_SPACE)){pause();}else if (GetAsyncKeyState(VK_ESCAPE)){endgamestatus = 3;break;}else if (GetAsyncKeyState(VK_F1)){if (sleeptime >= 50){sleeptime = sleeptime - 30;add = add + 2;if (sleeptime == 320){add = 2;//防止减到1之后再加回来有错}}}else if (GetAsyncKeyState(VK_F2)){if (sleeptime < 350){sleeptime = sleeptime + 30;add = add - 2;if (sleeptime == 350){add = 1;  //保证最低分为1}}}Sleep(sleeptime);snakemove();}
}void choose()
{printf("*******************************\n");printf("                 \n");printf("          贪吃蛇\n");printf("\n");printf("         1.开始游戏\n");printf("         2.游戏说明\n");printf("         3.开发人员\n");printf("         4.退出游戏\n");printf("\n");printf("*******************************\n");int s;printf("请输入1~4,开始你的游戏:");scanf_s("%d", &s);if (s == 1){system("cls");creatMap();initsnake();createfood();}else if (s == 2){system("cls");printf("*******************************\n");printf("           游戏规则\n");printf("开始的时候你将扮演一条小蛇,通过↑↓←→控制蛇的方向,\n");printf("且不懂沿着相反方向移动,在地图中寻找吃的食物\n");printf("每次吃一口身体就会增长一格,小心不要撞到墙壁!\n");printf("祝你好运!\n");printf("*******************************\n");printf("\n");printf("请输入1,放回主界面:\n");int t;scanf_s("%d", &t);if (t == 1){system("cls");choose();}else{system("cls");printf("error!\n");choose();}}else if (s == 3){system("cls");printf("*******************************\n");printf("       开发人员列表\n");printf("        赵宸\n");printf("*******************************\n");printf("请输入1,放回主界面:\n");int r;scanf_s("%d", &r);if (r == 1){system("cls");choose();}else{system("cls");printf("error!\n");choose();}}else if (s == 4) {exit(0);}else{system("cls");printf("error!\n");choose();}
}void endgame()//结束游戏
{system("cls");Pos(24, 12);if (endgamestatus == 1){printf("对不起,您撞到墙了。游戏结束.");}else if (endgamestatus == 2){printf("对不起,您咬到自己了。游戏结束.");}else if (endgamestatus == 3){printf("您的已经结束了游戏。");}Pos(24, 13);printf("您的得分是%d\n", score);replay();
}void replay() //重新玩的程序
{system("cls");printf("您的得分是%d\n", score);printf("你是否要重新尝试该游戏?\n");printf("输入1:重新开始游戏;输入2:退出游戏\n");printf("请在此输入:");int t;scanf_s("%d", &t);if (t == 1){system("cls");score = 0;sleeptime = 200;status = 0;choose();}else if (t == 2){exit(0);}else {system("cls");printf("error!");replay();}
}
void gamestart()//游戏初始化
{system("mode con cols=100 lines=30");choose();
}int main()
{gamestart();gamecircle();endgame();return 0;
}

【c语言大作业】c语言编写贪吃蛇相关推荐

  1. 合肥学院C语言大作业,C语言实践课程综合大作业..doc

    C语言实践课程综合大作业. 昆明理工大学 <程序设计基础>课程 综合设计实践教学课题报告 课程名称: C语言程序设计综合大作业 课题名称:数学计算工具程序设计 组长:学号 20131040 ...

  2. 日历公历农历C语言大作业,C语言编写一个带农历的万年历

    满意答案 kkdpzl 2013.04.03 采纳率:51%    等级:12 已帮助:9656人 没有农历的如下: #include #include #include #include int l ...

  3. 飞机订票系统c语言大作业,C语言知识学习飞机订票系统

    C语言知识学习飞机订票系统 课程设计 课程:数据结构 专业班级:xx软件工程 xx班 姓名:xx 学号:xxx 姓名:xxx 学号:xxx 设计时间:xxx 指导老师:xxx 课程设计题:飞机订票系统 ...

  4. 飞机订票系统c语言大作业,c语言课程设计---飞机订票系统

    <c语言课程设计---飞机订票系统>由会员分享,可在线阅读,更多相关<c语言课程设计---飞机订票系统(46页珍藏版)>请在皮匠网上搜索. 1.C 语言程序设计课程设计报告设计 ...

  5. 日历公历农历C语言大作业,C语言实验:输入随便一个年份和月份,输出该月份的公历日历...

    C语言实验:输入任意一个年份和月份,输出该月份的公历日历 利用吉姆拉尔森公式,详见初等数论,注意控制格式. 看不懂c++的童鞋,把所有cin理解为scanf,把cout理解为printf,这个程序是小 ...

  6. 火车票售票系统C语言大作业,C语言课程设计--火车票管理系统

    <C语言课程设计--火车票管理系统>由会员分享,可在线阅读,更多相关<C语言课程设计--火车票管理系统(19页珍藏版)>请在人人文库网上搜索. 1.二.设计内容二.设计内容 设 ...

  7. 大一c语言大作业课题大全,昆明理工大学大一C语言大作业题目.doc

    昆明理工大学大一C语言大作业题目 综合性实践排序求平均值(包括将数拆散求最大最小值).函数ReadDat()随机产生100个存放到数组aa中00个jsSort()函数的功能是:进行降序排列.最后调用函 ...

  8. 1008c语言答案,c语言大作业题目01008.doc

    c语言大作业题目01008 一.学生信息管理程序 基本要求: 1.要求实现学生信息的查找.添加.删除.修改.浏览.保存.从文件读取.查看奖学金信息8个功能,每个功能模块均能实现随时从模块中退出,而且可 ...

  9. 2010C语言添加背景图片_2019级C语言大作业 - 火柴人试炼之地

    C语言大作业 - 火柴人试炼之地https://www.zhihu.com/video/1200491618794606592 分享19级同学大一上学期用C语言实现的火柴人试炼之地.分步骤代码.图片音 ...

  10. 2020级C语言大作业 - 丛林大作战

    丛林大作战_C语言大作业 分享20级同学大一上学期用C语言(及少量C++)实现的丛林大作战游戏.由于同学们刚学了三个月的编程,实现还不够完善,工程代码.图片音乐素材可以从百度网盘下载: 链接:http ...

最新文章

  1. 私有5g网络_欧洲通过FUDGE5G的启动来支持工业4.0的云原生私有5G
  2. k8s pod MySQL环境变量,配置 – 在Docker中相当于env-file的Kubernetes
  3. Python - MySQL数据库操作
  4. boost::hana::minus用法的测试程序
  5. Android WebView常见问题及解决方案汇总
  6. Mac下cocos2dx-3.2+Xcode环境配置和项目创建
  7. MySQL修改配置 区分大小写
  8. OSI/RM体系结构
  9. 廖雪峰Python基础练习作业
  10. python-louvain
  11. 查看详细Windows VISTA 或Windows 7激活状态
  12. 上海热门的众创空间平台都有哪些?
  13. 【NRF51822】DFU过程梳理
  14. 进程间的通信(Linux)
  15. SDN概述:简介、工具、环境部署
  16. 《中庸》开宗明义:天命之谓性,率性之谓道,修道之谓教。
  17. Jackson注解:@JsonAlias使用详解
  18. IT孔乙己 (小小说)
  19. 有一种动物叫做 — 狼
  20. ARCGIS中某字段递增赋值,如1,2,3,4,

热门文章

  1. 2017马哥python高级实战班 培训推荐
  2. 模糊综合评价法——解决评价指标模糊、难以量化的问题
  3. 远程数据采集传输---RTU设备
  4. 大数据资料全解析(352个案例+大数据交易白皮书+国内外政策汇篇)
  5. 修改Foxmail日历,让星期一为每周第一天
  6. python安装pyaudio
  7. 【Python】使用Python批量移动文件
  8. html广告清理,谷歌浏览器插件-清除CSDN广告
  9. 西门子plc 用c语言编程,西门子PLC常用指令举例
  10. 矩阵论与计算机英语论文,矩阵论翻译论文.pdf