郑州网站设计 公司,厦门市同安区建设局公开网站,网站建设的ci设计指的是什么,wordpress媒体库外链感谢大佬的光临各位#xff0c;希望和大家一起进步#xff0c;望得到你的三连#xff0c;互三支持#xff0c;一起进步 个人主页#xff1a;LaNzikinh-CSDN博客 文章目录 前言一.蛇和食物的打印二.游戏的运行逻辑三.结束游戏 #xff08;善后工作#xff09;四.游戏的测… 感谢大佬的光临各位希望和大家一起进步望得到你的三连互三支持一起进步 个人主页LaNzikinh-CSDN博客 文章目录 前言一.蛇和食物的打印二.游戏的运行逻辑三.结束游戏 善后工作四.游戏的测试逻辑总结总代码 前言
我们前面讲解Win API的知识和贪吃蛇初始化和地图的绘制这次来完结贪吃蛇把他项目实现讲解 shack - Microsoft Visual Studio 2024-05-05 12-56-52 一.蛇和食物的打印 我们前面讲了关于地图的绘制在实现项目之前我们还需要把蛇和食物也打印下来 首先我肯定是要先创建一个贪吃蛇的结构体变量然后我要初始化游戏设置游戏的相关信息运行游戏最后就是结束工作以及善后 void test()
{int ch 0;do{system(cls);//创建贪吃蛇Snake snake { 0 };//初始化游戏//1. 打印环境界面//2. 功能介绍//3. 绘制地图//4. 创建蛇//5. 创建食物//6. 设置游戏的相关信息GameStart(snake);//运行游戏GameRun(snake);//结束游戏 - 善后工作GameEnd(snake);} while ();} 关于初始化游戏前面我们只定义了贪吃蛇需要的一些初始化变量还有绘制的地图介绍了游戏和功能我们还剩了一些创建蛇和创建食物的功能所以我们先来写一个初始化游戏的函数利用前面所学的Win API知识我没有将光标先隐藏了之后再设置 void GameStart(pSnake ps)
{//0. 先设置窗口的大小再光标隐藏system(mode con cols100 lines30);system(title 贪吃蛇);HANDLE houtput GetStdHandle(STD_OUTPUT_HANDLE);//影藏光标操作CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(houtput, CursorInfo);//获取控制台光标信息CursorInfo.bVisible false; //隐藏控制台光标SetConsoleCursorInfo(houtput, CursorInfo);//设置控制台光标状态//1. 打印环境界面和功能介绍WelcomeToGame();//2. 绘制地图CreateMap();//3. 创建蛇InitSnake(ps);//4. 创建食物CreateFood(ps);
}
然后我们现在来创建蛇和食物
蛇的创建 初始化蛇身我首先肯定要传一个贪吃蛇的结构体来初始化的蛇我定义的是五个节点位于控制台的中间所以我就创造五个节点再将每个节点中的坐标负值利用头插法插入再把它们打印下来就可以了结束的时候再设置一下当前初始情况下贪吃蛇的默认属性 void InitSnake(pSnake ps)
{int i 0;pSnakeNode cur NULL;for (i 0; i 5; i){cur (pSnakeNode)malloc(sizeof(SnakeNode));/*if (cur NULL){perror(InitSnake()::malloc());return;}*/assert(cur);cur-next NULL;cur-x POS_X 2 * i;cur-y POS_Y;//头插法插入链表if (ps-_pSnake NULL) //空链表{ps-_pSnake cur;}else //非空{cur-next ps-_pSnake;ps-_pSnake cur;}}cur ps-_pSnake;while (cur){SetPos(cur-x, cur-y);wprintf(L%lc, BODY);cur cur-next;}//设置贪吃蛇的属性ps-_dir RIGHT;//默认向右ps-_score 0;ps-_food_weight 10;ps-_sleep_time 200;//单位是毫秒ps-_status OK;}
注意贪吃蛇是插入是这样插的 查找完之后我们来创建食物食物的创建肯定是要生成随机数我们在很久之前的数字游戏中已经了解到了随机数是如何生成的但是在这里的随机数要注意2点第一点就是食物首先肯定不能越出墙外也不可能和蛇的身体冲突然后就是坐标的差异横的是竖的两倍所以X 2Y 1 #includetime.h,srand((unsigned int)time(NULL));随机数
void CreateFood(pSnake ps)
{int x 0;int y 0;//生成x是2的倍数//x2~54//y: 1~25
again:do{x rand() % 53 2;y rand() % 25 1;} while (x % 2 ! 0);//x和y的坐标不能和蛇的身体坐标冲突pSnakeNode cur ps-_pSnake;while (cur){if (x cur-x y cur-y){goto again;}cur cur-next;}//创建食物的节点pSnakeNode pFood (pSnakeNode)malloc(sizeof(SnakeNode));/*if (pFood NULL){perror(CreateFood()::malloc());return;}*/assert(pFood);pFood-x x;pFood-y y;pFood-next NULL;SetPos(x, y);//定位位置wprintf(L%lc, FOOD);ps-_pFood pFood;
} 二.游戏的运行逻辑 我们现在进行的是游戏的运行逻辑首先我们肯定要跟上面一样写一个总的运行逻辑然后再不断地完成他的分支在游戏开始的时候我们肯定要先打印一个帮助信息来记录分数还有一些规则的提醒然后就是一些按键的规则如果你按上的时候要有反应的话那么目前蛇就不能往下走剩下左右都是这个道理那如何判断我之前按的什么键呢就有我们之前讲的Win API的知识#define KEY_PRESS(vk) ((GetAsyncKeyState(vk)1)?1:0)那个宏定义规定完按键之后呢就是蛇走一步的过程我们在游戏运行的时候蛇必须动然后蛇没走一步之后还有休息这样子才能看到蛇移动的过程游戏用do while循环来实现判断条件就是状态只要是正常就可以一直继续 void GameRun(pSnake ps)
{//打印帮助信息PrintHelpInfo();do{//打印总分数和食物的分值SetPos(64, 10);printf(总分数:%d\n, ps-_score);SetPos(64, 11);printf(当前食物的分数:%2d\n, ps-_food_weight);//按上键时如果要有反应还有就是蛇不能是向下走的if (KEY_PRESS(VK_UP) ps-_dir ! DOWN){ps-_dir UP;}else if (KEY_PRESS(VK_DOWN) ps-_dir ! UP){ps-_dir DOWN;}else if (KEY_PRESS(VK_LEFT) ps-_dir ! RIGHT){ps-_dir LEFT;}else if (KEY_PRESS(VK_RIGHT) ps-_dir ! LEFT){ps-_dir RIGHT;}else if (KEY_PRESS(VK_SPACE)){Pause();}else if (KEY_PRESS(VK_ESCAPE)){//正常退出游戏ps-_status END_NORMAL;}else if (KEY_PRESS(VK_F3)){//加速}else if (KEY_PRESS(VK_F4)){//减速}SnakeMove(ps);//蛇走一步的过程Sleep(ps-_sleep_time);} while (ps-_status OK);
}
然后现在我们先来打印一下帮助信息
打印帮助信息
void PrintHelpInfo()
{SetPos(64, 14);wprintf(L%ls, L不能穿墙不能咬到自己);SetPos(64, 15);wprintf(L%ls, L用 ↑. ↓ . ← . → 来控制蛇的移动);SetPos(64, 16);wprintf(L%ls, L按F3加速F4减速);SetPos(64, 17);wprintf(L%ls, L按ESC退出游戏按空格暂停游戏);}
注意这些坐标不是用眼睛看出来的是通过不断地尝试和严格的定义定位到的自己写的时候不要直接照抄坐标要自己去尝试
然后上面其实还有一些功能就是加速减速功能的实现以及暂停退出游戏的实现
暂停和退出游戏 退出游戏很简单把状态改为退出就可以了暂停的话就直接让他不断地睡眠就可以了 void Pause()
{while (1){Sleep(200);//如果点了接触暂停就退出if (KEY_PRESS(VK_SPACE)){break;}}
}
加速减速功能 我们前面定义蛇的时候说了休息时间时间越短速度越快时间越长速度越慢 如果你点了F3就加速如果你点了F4就减速加速的话就是让睡眠时间减少然后分数增加减速的话同理但是你不能一直加速所以我要规定减到80就不减了减速也是一样食物分数肯定不能减到零
else if (KEY_PRESS(VK_F3))
{//加速if (ps-_sleep_time 80){ps-_sleep_time - 30;ps-_food_weight 2;}
}
else if (KEY_PRESS(VK_F4))
{//减速if (ps-_food_weight 2){ps-_sleep_time 30;ps-_food_weight - 2;}
}
蛇走一步的过程
最复杂的就是蛇走一步的过程他又要分好几点很多项目就是这样子的就是分岔路口一样一个实现又需要好多个节点就像一棵树 然后我们来看看蛇走一步需要干什么我们要创造一个节点表示即将到的下一个节点贪吃蛇移动的思想注意他并不是五个节点往前移动而是增加前面节点销毁后面那个节点所以我先用一个选择语句来看我的方向如果向上走就往上移向下走就往下移注意坐标关系然后我就要判断是否遇到食物如果遇到的的话怎么样没有遇到怎么样然后还要判断退出条件我是撞墙了还是撞到自己了 void SnakeMove(pSnake ps)
{//创建一个结点表示蛇即将到的下一个节点pSnakeNode pNextNode (pSnakeNode)malloc(sizeof(SnakeNode));if (pNextNode NULL){perror(SnakeMove()::malloc());return;}switch (ps-_dir){case UP:pNextNode-x ps-_pSnake-x;pNextNode-y ps-_pSnake-y - 1;break;case DOWN:pNextNode-x ps-_pSnake-x;pNextNode-y ps-_pSnake-y 1;break;case LEFT:pNextNode-x ps-_pSnake-x - 2;pNextNode-y ps-_pSnake-y;break;case RIGHT:pNextNode-x ps-_pSnake-x 2;pNextNode-y ps-_pSnake-y;break;}//检测下一个坐标处是否是食物if (NextIsFood(pNextNode, ps)){EatFood(pNextNode, ps);}else{NoFood(pNextNode, ps);}//检测蛇是否撞墙KillByWall(ps);//检测蛇是否撞到自己KillBySelf(ps);
}
判断下一个坐标是不是食物
int NextIsFood(pSnakeNode pn, pSnake ps)
{return (ps-_pFood-x pn-x ps-_pFood-y pn-y);
}
是食物 如果是食物的话我就继续用头插法将食物变成贪吃蛇的节点然后我要释放原来的食物节点然后再重新把蛇打印出来就可以了最后在次创建食物 void EatFood(pSnakeNode pn, pSnake ps)
{//头插法ps-_pFood-next ps-_pSnake;ps-_pSnake ps-_pFood;//释放下一个位置的节点free(pn);pn NULL;pSnakeNode cur ps-_pSnake;//打印蛇while (cur){SetPos(cur-x, cur-y);wprintf(L%lc, BODY);cur cur-next;}ps-_score ps-_food_weight;//重新创建食物CreateFood(ps);
}
不是食物 如果不是食物的话我们把下一个节点头插到蛇上然后找到最后一个节点是放掉并且把最后一个节点打印成空格再把倒数第二个节点指为空 void NoFood(pSnakeNode pn, pSnake ps)
{//头插法pn-next ps-_pSnake;ps-_pSnake pn;pSnakeNode cur ps-_pSnake;while (cur-next-next ! NULL){SetPos(cur-x, cur-y);wprintf(L%lc, BODY);cur cur-next;}//把最后一个结点打印成空格SetPos(cur-next-x, cur-next-y);printf( );//释放最后一个结点free(cur-next);//把倒数第二个节点的地址置为NULLcur-next NULL;
}
检测蛇是否撞墙 下一个节点坐标不能等于墙坐标如果等于的话就把状态改为out void KillByWall(pSnake ps)
{if (ps-_pSnake-x 0 || ps-_pSnake-x 56 ||ps-_pSnake-y 0 || ps-_pSnake-y 26){ps-_status KILL_BY_WALL;}
}
检测蛇是否撞到自己 撞到自己也是同理的下一个坐标不能等于自己的坐标 void KillBySelf(pSnake ps)
{pSnakeNode cur ps-_pSnake-next;while (cur){if (cur-x ps-_pSnake-x cur-y ps-_pSnake-y){ps-_status KILL_BY_SELF;break;}cur cur-next;}
}
三.结束游戏 善后工作 这个也是最轻松的结束游戏善后工作了状态的判断我们前面写了很多种退出游戏的状态接下来就依依的收尾了根据每个退出状态写出对应的状态就可以了然后再把蛇身的所有列表释放就结束了 void GameEnd(pSnake ps)
{SetPos(24, 12);switch (ps-_status){case END_NORMAL:wprintf(L您主动结束游戏\n);break;case KILL_BY_WALL:wprintf(L您撞到墙上游戏结束\n);break;case KILL_BY_SELF:wprintf(L您撞到了自己游戏结束\n);break;}//释放蛇身的链表pSnakeNode cur ps-_pSnake;while (cur){pSnakeNode del cur;cur cur-next;free(del);}
}
四.游戏的测试逻辑 因为你结束了之后可能还要再玩一局如果你要玩的话就输入Y不玩的话就输入N字符获取函数来接收一下。这个在总逻辑上改 void test()
{int ch 0;do{system(cls);//创建贪吃蛇Snake snake { 0 };//初始化游戏//1. 打印环境界面//2. 功能介绍//3. 绘制地图//4. 创建蛇//5. 创建食物//6. 设置游戏的相关信息GameStart(snake);//运行游戏GameRun(snake);//结束游戏 - 善后工作GameEnd(snake);SetPos(20, 15);printf(再来一局吗?(Y/N):);ch getchar(); } while (ch Y || ch y);SetPos(0, 27);
} 总结
贪吃蛇游戏把C语言学过的很多知识都全部运用上了甚至还讲起了一些设置台控制的一些知识完整的写出来还是能收获到不少的东西的 总代码
shack.h#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include windows.h
#include stdbool.h
#include stdlib.h
#include stdio.h
#include time.h
#includeassert.h#define POS_X 24
#define POS_Y 5#define WALL L□
#define BODY L●
#define FOOD L★//类型的声明//蛇的方向
enum DIRECTION
{UP 1,DOWN,LEFT,RIGHT
};//蛇的状态
//正常、撞墙、撞到自己、正常退出
enum GAME_STATUS
{OK, //正常KILL_BY_WALL, //撞墙KILL_BY_SELF, //撞到自己END_NORMAL //正常退出
};//蛇身的节点类型
typedef struct SnakeNode
{//坐标int x;int y;//指向下一个节点的指针struct SnakeNode* next;
}SnakeNode, * pSnakeNode;//typedef struct SnakeNode* pSnakeNode;//贪吃蛇
typedef struct Snake
{pSnakeNode _pSnake;//指向蛇头的指针pSnakeNode _pFood;//指向食物节点的指针enum DIRECTION _dir;//蛇的方向enum GAME_STATUS _status;//游戏的状态int _food_weight;//一个食物的分数int _score; //总成绩int _sleep_time; //休息时间时间越短速度越快时间越长速度越慢
}Snake, * pSnake;//函数的声明//定位光标位置
void SetPos(short x, short y);//游戏的初始化
void GameStart(pSnake ps);//欢迎界面的打印
void WelcomeToGame();//创建地图
void CreateMap();//初始化蛇身
void InitSnake(pSnake ps);//创建食物
void CreateFood(pSnake ps);//游戏运行的逻辑
void GameRun(pSnake ps);//蛇的移动-走一步
void SnakeMove(pSnake ps);//判断下一个坐标是否是食物
int NextIsFood(pSnakeNode pn, pSnake ps);//下一个位置是食物就吃掉食物
void EatFood(pSnakeNode pn, pSnake ps);//下一个位置不是食物
void NoFood(pSnakeNode pn, pSnake ps);//检测蛇是否撞墙
void KillByWall(pSnake ps);//检测蛇是否撞到自己
void KillBySelf(pSnake ps);//游戏善后的工作
void GameEnd(pSnake ps);shack.c#define _CRT_SECURE_NO_WARNINGS 1
#include shack.h
void SetPos(short x, short y)
{//获得标准输出设备的句柄HANDLE houtput NULL;houtput GetStdHandle(STD_OUTPUT_HANDLE);//定位光标的位置COORD pos { x, y };SetConsoleCursorPosition(houtput, pos);
}void WelcomeToGame()
{SetPos(40, 14);wprintf(L欢迎来到贪吃蛇小游戏\n);SetPos(42, 20);system(pause);system(cls);SetPos(25, 14);wprintf(L用 ↑. ↓ . ← . → 来控制蛇的移动按F3加速F4减速\n);SetPos(25, 15);wprintf(L加速能够得到更高的分数\n);SetPos(42, 20);system(pause);system(cls);
}void CreateMap()
{//上int i 0;for (i 0; i 29; i){wprintf(L%lc , WALL);}//下SetPos(0, 26);for (i 0; i 29; i){wprintf(L%lc , WALL);}//左for (i 1; i 25; i){SetPos(0, i);wprintf(L%lc, WALL);}//右for (i 1; i 25; i){SetPos(56, i);wprintf(L%lc, WALL);}}void InitSnake(pSnake ps)
{int i 0;pSnakeNode cur NULL;for (i 0; i 5; i){cur (pSnakeNode)malloc(sizeof(SnakeNode));/*if (cur NULL){perror(InitSnake()::malloc());return;}*/assert(cur);cur-next NULL;cur-x POS_X 2 * i;cur-y POS_Y;//头插法插入链表if (ps-_pSnake NULL) //空链表{ps-_pSnake cur;}else //非空{cur-next ps-_pSnake;ps-_pSnake cur;}}cur ps-_pSnake;while (cur){SetPos(cur-x, cur-y);wprintf(L%lc, BODY);cur cur-next;}//设置贪吃蛇的属性ps-_dir RIGHT;//默认向右ps-_score 0;ps-_food_weight 10;ps-_sleep_time 200;//单位是毫秒ps-_status OK;}void CreateFood(pSnake ps)
{int x 0;int y 0;//生成x是2的倍数//x2~54//y: 1~25
again:do{x rand() % 53 2;y rand() % 25 1;} while (x % 2 ! 0);//x和y的坐标不能和蛇的身体坐标冲突pSnakeNode cur ps-_pSnake;while (cur){if (x cur-x y cur-y){goto again;}cur cur-next;}//创建食物的节点pSnakeNode pFood (pSnakeNode)malloc(sizeof(SnakeNode));/*if (pFood NULL){perror(CreateFood()::malloc());return;}*/assert(pFood);pFood-x x;pFood-y y;pFood-next NULL;SetPos(x, y);//定位位置wprintf(L%lc, FOOD);ps-_pFood pFood;
}void GameStart(pSnake ps)
{//0. 先设置窗口的大小再光标隐藏system(mode con cols100 lines30);system(title 贪吃蛇);HANDLE houtput GetStdHandle(STD_OUTPUT_HANDLE);//影藏光标操作CONSOLE_CURSOR_INFO CursorInfo;GetConsoleCursorInfo(houtput, CursorInfo);//获取控制台光标信息CursorInfo.bVisible false; //隐藏控制台光标SetConsoleCursorInfo(houtput, CursorInfo);//设置控制台光标状态//1. 打印环境界面和功能介绍WelcomeToGame();//2. 绘制地图CreateMap();//3. 创建蛇InitSnake(ps);//4. 创建食物CreateFood(ps);
}void PrintHelpInfo()
{SetPos(64, 14);wprintf(L%ls, L不能穿墙不能咬到自己);SetPos(64, 15);wprintf(L%ls, L用 ↑. ↓ . ← . → 来控制蛇的移动);SetPos(64, 16);wprintf(L%ls, L按F3加速F4减速);SetPos(64, 17);wprintf(L%ls, L按ESC退出游戏按空格暂停游戏);}#define KEY_PRESS(vk) ((GetAsyncKeyState(vk)1)?1:0)void Pause()
{while (1){Sleep(200);if (KEY_PRESS(VK_SPACE)){break;}}
}//int NextIsFood(pSnakeNode pn, pSnake ps)
//{
// if (ps-_pFood-x pn-x ps-_pFood-y pn-y)
// return 1;
// else
// return 0;
//}int NextIsFood(pSnakeNode pn, pSnake ps)
{return (ps-_pFood-x pn-x ps-_pFood-y pn-y);
}void EatFood(pSnakeNode pn, pSnake ps)
{//头插法ps-_pFood-next ps-_pSnake;ps-_pSnake ps-_pFood;//释放下一个位置的节点free(pn);pn NULL;pSnakeNode cur ps-_pSnake;//打印蛇while (cur){SetPos(cur-x, cur-y);wprintf(L%lc, BODY);cur cur-next;}ps-_score ps-_food_weight;//重新创建食物CreateFood(ps);
}void NoFood(pSnakeNode pn, pSnake ps)
{//头插法pn-next ps-_pSnake;ps-_pSnake pn;pSnakeNode cur ps-_pSnake;while (cur-next-next ! NULL){SetPos(cur-x, cur-y);wprintf(L%lc, BODY);cur cur-next;}//把最后一个结点打印成空格SetPos(cur-next-x, cur-next-y);printf( );//释放最后一个结点free(cur-next);//把倒数第二个节点的地址置为NULLcur-next NULL;
}void KillByWall(pSnake ps)
{if (ps-_pSnake-x 0 || ps-_pSnake-x 56 ||ps-_pSnake-y 0 || ps-_pSnake-y 26){ps-_status KILL_BY_WALL;}
}void KillBySelf(pSnake ps)
{pSnakeNode cur ps-_pSnake-next;while (cur){if (cur-x ps-_pSnake-x cur-y ps-_pSnake-y){ps-_status KILL_BY_SELF;break;}cur cur-next;}
}void SnakeMove(pSnake ps)
{//创建一个结点表示蛇即将到的下一个节点pSnakeNode pNextNode (pSnakeNode)malloc(sizeof(SnakeNode));if (pNextNode NULL){perror(SnakeMove()::malloc());return;}switch (ps-_dir){case UP:pNextNode-x ps-_pSnake-x;pNextNode-y ps-_pSnake-y - 1;break;case DOWN:pNextNode-x ps-_pSnake-x;pNextNode-y ps-_pSnake-y 1;break;case LEFT:pNextNode-x ps-_pSnake-x - 2;pNextNode-y ps-_pSnake-y;break;case RIGHT:pNextNode-x ps-_pSnake-x 2;pNextNode-y ps-_pSnake-y;break;}//检测下一个坐标处是否是食物if (NextIsFood(pNextNode, ps)){EatFood(pNextNode, ps);}else{NoFood(pNextNode, ps);}//检测蛇是否撞墙KillByWall(ps);//检测蛇是否撞到自己KillBySelf(ps);
}void GameRun(pSnake ps)
{//打印帮助信息PrintHelpInfo();do{//打印总分数和食物的分值SetPos(64, 10);printf(总分数:%d\n, ps-_score);SetPos(64, 11);printf(当前食物的分数:%2d\n, ps-_food_weight);//按上键时如果要有反应还有就是蛇不能是向下走的if (KEY_PRESS(VK_UP) ps-_dir ! DOWN){ps-_dir UP;}else if (KEY_PRESS(VK_DOWN) ps-_dir ! UP){ps-_dir DOWN;}else if (KEY_PRESS(VK_LEFT) ps-_dir ! RIGHT){ps-_dir LEFT;}else if (KEY_PRESS(VK_RIGHT) ps-_dir ! LEFT){ps-_dir RIGHT;}else if (KEY_PRESS(VK_SPACE)){Pause();}else if (KEY_PRESS(VK_ESCAPE)){//正常退出游戏ps-_status END_NORMAL;}else if (KEY_PRESS(VK_F3)){//加速if (ps-_sleep_time 80){ps-_sleep_time - 30;ps-_food_weight 2;}}else if (KEY_PRESS(VK_F4)){//减速if (ps-_food_weight 2){ps-_sleep_time 30;ps-_food_weight - 2;}}SnakeMove(ps);//蛇走一步的过程Sleep(ps-_sleep_time);} while (ps-_status OK);
}void GameEnd(pSnake ps)
{SetPos(24, 12);switch (ps-_status){case END_NORMAL:wprintf(L您主动结束游戏\n);break;case KILL_BY_WALL:wprintf(L您撞到墙上游戏结束\n);break;case KILL_BY_SELF:wprintf(L您撞到了自己游戏结束\n);break;}//释放蛇身的链表pSnakeNode cur ps-_pSnake;while (cur){pSnakeNode del cur;cur cur-next;free(del);}
}test.c#include locale.h
#include shack.h
#define _CRT_SECURE_NO_WARNINGS 1
//完成的是游戏的测试逻辑
void test()
{int ch 0;do{system(cls);//创建贪吃蛇Snake snake { 0 };//初始化游戏//1. 打印环境界面//2. 功能介绍//3. 绘制地图//4. 创建蛇//5. 创建食物//6. 设置游戏的相关信息GameStart(snake);//运行游戏GameRun(snake);//结束游戏 - 善后工作GameEnd(snake);SetPos(20, 15);printf(再来一局吗?(Y/N):);ch getchar(); } while (ch Y || ch y);SetPos(0, 27);
}int main()
{//设置适配本地环境setlocale(LC_ALL, );srand((unsigned int)time(NULL));test();return 0;
}