本文为原创文章,转载请注明出处。

以下为主要核心代码,想查看详细代码可下载源码。int main(int argc, char *argv[])

{

start:

system("cls");

Init();/*初始化*/

PrintNotice_XY("贪吃蛇",_CENTER_X(6),_CENTER_Y-2);

PrintNotice("Press Enter to start!");

int key;/*为获取按键*/

while(1)

{

if(kbhit())

{

key=getch();

break;

}

Sleep(1000);

}

if(key==0xA||key==0xD)/*Enter:0xA和0xD是为兼容不同系统*/

{

/*清字幕*/

PrintNotice_XY("      ",_CENTER_X(6),_CENTER_Y-2);

PrintNotice("                                 ");

StartGame();/*开始游戏*/

}

if(key==0x1b) /*Esc*/

{

exit(0);

}

goto start;

return 0;

}

/*初始化*/

void Init()

{

i_Point=0;//初始化分数

HideCursor();/*隐藏光标*/

PrintUI();/*打印背景*/

}

/*初始化蛇*/

void InitSnake()

{

snakeHead=(Node *)malloc(sizeof(Node));

snakeEnd=(Node *)malloc(sizeof(Node));

snakeHead->nodeX=_COL_NUM+_COL_START-(_SNAKE_INIT_LEN);

snakeHead->nodeY=_ROW_NUM/2+_ROW_START;

snakeHead->direction=_LEFT;/*向左移动*/

snakeEnd->nodeX=snakeHead->nodeX+2;

snakeEnd->nodeY=snakeHead->nodeY;

snakeEnd->direction=snakeHead->direction;

snakeHead->next=snakeEnd;

snakeEnd->next=NULL;

}

/*打印蛇*/

void PrintSnake(Node *node)

{

GotoXy(node->nodeX,node->nodeY);

printf(_Node_CHAR);

if(node->next!=NULL)

{

PrintSnake(node->next);

}

}

/*显示食物*/

void PrintFood()

{

food=(Food *)malloc(sizeof(Food));

srand(_SEED);/*设置随机种子*/

while(1)

{

/*用rand()生成范围(x,y)的随机数,公式:x+rand()%(y-x+1)*/

food->foodX=_COL_START+2+rand()%((_COL_NUM*2-2-2)-1);/*(_COL_NUM*2-2-2):偏移量+宽*2-右边框宽度-圆点宽度*/

food->foodY=_ROW_START+1+rand()%(_ROW_NUM-2);

if(food->foodX%2)/*此段代码是为防止食物X坐标是单数而加*/

{

if(food->foodX>_COL_NUM+_COL_START)/*在屏幕中心的右边,则-1,否则+1*/

{

food->foodX=food->foodX-1;

}

else

{

food->foodX=food->foodX+1;

}

}

int flag=IsOccupied(snakeHead,food->foodX,food->foodY);

if(flag==0)

{

GotoXy(food->foodX,food->foodY);

printf("●");

break;

}

}

}

/*指示坐标是否被蛇占用*/

int IsOccupied(Node *head,char x,char y)

{

if((head->nodeX==x && head->nodeY==y)||(head->nodeX+1==x && head->nodeY==y))

{

return 1;

}

if(head->next!=NULL)

{

IsOccupied(head->next,x,y);

}

else

{

return 0;

}

}

/*开始游戏*/

void StartGame()

{

InitSnake();/*初始化蛇参数*/

PrintSnake(snakeHead);/*打印蛇*/

PrintFood();/*打印食物*/

short speed=_INIT_SPEED;

int isSuccess=1;

char key;/*按键*/

while(1)

{

if(kbhit())

{

key=getch();

if(key==0x20)/*空格*/

{

PrintNotice(" PAUSE ");

getch();

PrintNotice("     ");

GotoXy(food->foodX,food->foodY);

printf("●");

}

if(key==0x1b) /*Esc*/

{

char ques[]=" Do you want to exit? ";

char ansYes[]=" [Y]:Yes ";

char ansNo[]=" [Any key]:No ";

short len=strlen(ques);

PrintNotice_XY(ques,_CENTER_X(len),_CENTER_Y-1);

len=strlen(ansYes);

PrintNotice_XY(ansYes,_CENTER_X(len),_CENTER_Y);

len=strlen(ansNo);

PrintNotice_XY(ansNo,_CENTER_X(len),_CENTER_Y+1);

key=getch();

if(key=='Y' || key=='y')

{

exit(0);

}

/*重新打印背景和食物*/

PrintUI();

GotoXy(food->foodX,food->foodY);

printf("●");

}

/*处理方向键和大写锁定*/

switch(key)

{

case 'W':

case 72:

key=_UP;

break;

case 'A':

case 75:

key=_LEFT;

break;

case 'D':

case 77:

key=_RIGHT;

break;

case 'S':

case 80:

key=_DOWN;

break;

}

/*避免蛇逆向移动*/

if(key==_UP||key==_LEFT||key==_DOWN||key==_RIGHT)

{

switch(snakeHead->direction)

{

case _UP:

case _DOWN:

if(key==_DOWN||key==_UP)

{

continue;

}

break;

case _LEFT:

case _RIGHT:

if(key==_LEFT||key==_RIGHT)

{

continue;

}

break;

}

snakeHead->direction=key;

}

}

GotoXy(_COL_START+(_COL_NUM*2)+1,_ROW_START+1);/*行1*/

printf("[蛇]   X:%i Y:%i ",snakeHead->nodeX,snakeHead->nodeY);

GotoXy(_COL_START+(_COL_NUM*2)+1,_ROW_START+2);/*行2*/

printf("[食物] X:%i Y:%i ",food->foodX,food->foodY);

GotoXy(_COL_START+(_COL_NUM*2)+1,_ROW_START+3);/*行3*/

printf("[速度] %i ",speed);

GotoXy(_COL_START+(_COL_NUM*2)+1,_ROW_START+4);/*行4*/

printf("[得分] %i ",i_Point);

GotoXy(_COL_START+(_COL_NUM*2)+1,_ROW_START+5);/*行5*/

printf("SPACE 暂停");

isSuccess=MoveSnake();/*移动蛇*/

if(isSuccess==0)

{

char notice[] ="GAME OVER";

PrintNotice(notice);

break;

}

/*变速*/

speed=(_INIT_SPEED-i_Point*_SPEED_UP)<=1?1:(_INIT_SPEED-i_Point*_SPEED_UP);

Sleep(speed);

}

getch();

}

/*移动蛇*/

int MoveSnake()

{

int isPrintFood=0;

char emptyX=snakeEnd->nodeX;

char emptyY=snakeEnd->nodeY;

switch(snakeHead->direction)

{

case _UP:

if(IsBiteBody(snakeHead,snakeHead->nodeX,snakeHead->nodeY-1))

{

return 0;

}

if((snakeHead->nodeY-1)<=_ROW_START)

{

return 0;

}

if(food->foodX==snakeHead->nodeX&&food->foodY==snakeHead->nodeY-1)

{

/*将新的节点加到蛇尾巴*/

Node *newNode=(Node *)malloc(sizeof(Node));

newNode->next=NULL;

snakeEnd->next=newNode;

snakeEnd=newNode;

isPrintFood=1;

}

/*将头部数据往下更新*/

UpdataNode(snakeHead,snakeHead->nodeX,snakeHead->nodeY-1,snakeHead->direction);

break;

case _LEFT:

if(IsBiteBody(snakeHead,snakeHead->nodeX-2,snakeHead->nodeY))

{

return 0;

}

if(snakeHead->nodeX<=_COL_START+2)

{

return 0;

}

if(food->foodX==snakeHead->nodeX-2 && food->foodY==snakeHead->nodeY)

{

Node *newNode=(Node *)malloc(sizeof(Node));

newNode->next=NULL;

snakeEnd->next=newNode;

snakeEnd=newNode;

isPrintFood=1;

}

/*将头部数据往下更新*/

UpdataNode(snakeHead,snakeHead->nodeX-2,snakeHead->nodeY,snakeHead->direction);

break;

case _DOWN:

if(IsBiteBody(snakeHead,snakeHead->nodeX,snakeHead->nodeY+1))

{

return 0;

}

if(snakeHead->nodeY+2>=_ROW_START+_ROW_NUM)

{

return 0;

}

if(food->foodX==snakeHead->nodeX&&food->foodY==snakeHead->nodeY+1)

{

Node *newNode=(Node *)malloc(sizeof(Node));

newNode->next=NULL;

snakeEnd->next=newNode;

snakeEnd=newNode;

isPrintFood=1;

}

/*将头部数据往下更新*/

UpdataNode(snakeHead,snakeHead->nodeX,snakeHead->nodeY+1,snakeHead->direction);

break;

break;

case _RIGHT:

if(IsBiteBody(snakeHead,snakeHead->nodeX+2,snakeHead->nodeY))

{

return 0;

}

if(snakeHead->nodeX+2+2>=_COL_START+_COL_NUM*2)

{

return 0;

}

if(food->foodX==snakeHead->nodeX+2 && food->foodY==snakeHead->nodeY)

{

Node *newNode=(Node *)malloc(sizeof(Node));

newNode->next=NULL;

snakeEnd->next=newNode;

snakeEnd=newNode;

isPrintFood=1;

}

/*将头部数据往下更新*/

UpdataNode(snakeHead,snakeHead->nodeX+2,snakeHead->nodeY,snakeHead->direction);

break;

}

PrintSnake(snakeHead);

if(isPrintFood)

{

i_Point++;

emptyX=snakeEnd->nodeX;

emptyY=snakeEnd->nodeY;

PrintFood();

}

GotoXy(emptyX,emptyY);

printf(_EMPTY_CHAR);

return 1;

}

/*递归更新节点*/

void UpdataNode(Node *node,char x,char y,char dir)

{

char c_X=node->nodeX;

char c_Y=node->nodeY;

char c_Dir=node->direction;

node->nodeX=x;

node->nodeY=y;

node->direction=dir;

if(node->next!=NULL)

{

UpdataNode(node->next,c_X,c_Y,c_Dir);

}

}

/*判断是否咬到身体*/

int IsBiteBody(Node *node,char headX,char headY)

{

while (node->next!=NULL)

{

if(node->nodeX==headX && node->nodeY==headY)

{

return 1;

}

node=node->next;

}

return 0;

}

来源:时间去哪儿了博客(微信/QQ号:903918446),转载请保留出处和链接!

C语言贪吃蛇游戏主要功能,C语言游戏-贪吃蛇相关推荐

  1. c语言程序中的基本功能,c语言程序中的基本功能模块为什么?

    c语言程序中的基本功能模块为"函数".一个C语言程序可以由一个主函数和若干个函数构成:一个大的应用程序一般应该分为多个程序模块,每一个模块用来实现一个功能,而模块的功能是由函数完成 ...

  2. c语言扫雷游戏计时功能_C语言实现扫雷游戏(可以自动展开)

    前言 本篇博客主要介绍如何使用C语言实现扫雷游戏. 一.游戏规则 在一张ROW行COL列的地图上存在MINE_COUNT个地雷.玩家输入坐标翻开格子,若没有踩雷,则计算此格子周围8个格子的地雷总数,并 ...

  3. c语言扫雷游戏计时功能_做游戏,学编程(C语言) 20 扫雷

    应 @姑娘的衣扣 同学的要求,分享16级同学大一上学期实现的扫雷游戏.分步骤代码.可执行程序.录屏效果可以从百度网盘下载:http://pan.baidu.com/s/1gf6AHKv 开局画面: 胜 ...

  4. c语言作业做出金山打字功能,C语言小游戏之金山打字

    //动态内存分配头文件 #include//加入音乐的头文件 #pragma comment(lib,"winmm.lib")//加入音乐的库 //主函数-->程序入口 in ...

  5. c语言程序 实现简单计算器功能,C语言实现简单计算器小项目

    昨天刚安装上devc++,半夜想着练练C语言吧 于是就看到实验楼有一个计算器的项目 之前做过一次,这次写的主要是思路 首先我们先从原理思考jia,实现简单的计算器就要具备加减乘除这些,看普通的计算器也 ...

  6. C语言在计算机专业的功能,C语言程序设计在高职院校计算机专业教学中重要作用.pdf...

    C语言程序设计在高职院校计算机专业教学中重要作用.pdf C语言程序设计在高职院校计算机专业教学中重要作用 韩迎红 山西警官职业学院信息工程系.太原030006 hyhhzwl12@163.tom [ ...

  7. 荣耀路由器3pro虚拟服务器,荣耀路由器Pro游戏加速功能怎么用

    荣耀路由器Pro游戏加速功能怎么用 游戏加速功能是荣耀路由器针对年轻人中的玩家群体特意推出的智能功能,通过识别正在运行的游戏对网络进行调控,那么如何开启或关闭荣耀路由Pro游戏版的游戏加速功能?下面就 ...

  8. 腾讯游戏平台下载|腾讯游戏平台使用体验

    菜鸟比较多,地图库好玩,还能ban图,简直是菜鸟乐园.但是平台开图的人好多,以前都不相信,有天有个orc上来就报我点位(TM四人图),还直接说我就是开图打怎么了.最后他赢了还要推销一波全图软件,想卖给 ...

  9. 腾讯游戏平台下载|腾讯游戏平台下载

    腾讯Wegame平台是原腾讯游戏平台TGP换名字的游戏客户端, 就在目前已经正式推出了体验版, 本次更名我想最主要的原因是与之前的微信wechat一样, 腾讯想要进军国外游戏市场, 与steam等游戏 ...

最新文章

  1. Gulp:插件编写入门
  2. Git命令集之八——提交命令
  3. #翻译NO.5# --- Spring Integration Framework
  4. 转jpg java源程序_将pdf文件转成图片并删除java源代码
  5. ADO编程中ATL所遇到的定义问题
  6. Transformer组件很重要Attention is all you need
  7. 强悍的 Linux —— Linux 中 TTY 是什么意思
  8. anroid Remote Service 使用注意事项
  9. 用正则表达式改变或清除页面超链接标签url内容
  10. 在Windows NT上装还原卡
  11. 设置页数自增页眉/页脚——Word中page域代码的使用
  12. 紫光输入法linux,紫光拼音输入法
  13. CAD交互绘制虚线(网页版)
  14. 希捷硬盘无法安全弹出如何解决?
  15. 解决默认浏览器被劫持
  16. HBuilderXHBuilder连接雷电模拟器
  17. 狂热之下被遗忘的指标—快充倍率
  18. 【Linux进程间通信】一、什么是IPC
  19. pdf裁边app_Paper for Kindle
  20. 如何操作 WebOffice.ocx

热门文章

  1. 游戏里的小哥哥小姐姐都是怎么来的?
  2. 最近在B站重新看学习视频小结
  3. 模仿微信更改头像,图片局部放大
  4. 实验四:继承性和派生类 建一个楼房Building为基类,建立住宅类House继承Building,存储房号和面积,建立办公室类Office继承Building,存储办公室名称和电话
  5. tyvj 火焰巨魔的惆怅
  6. 普乐蛙大型5d动感影院4d影院设备价格4d动感影院座椅
  7. APK安装包如何安装到安卓手机上
  8. 字节跳动取消大小周;淘宝、支付宝等阿里系App取消开屏广告;Python 3.10 beta 4发布
  9. python手机编程软件-盘点几个在手机上可以用来学习编程的软件
  10. 渗透测试-不死马的创建和查杀