百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

小伙仅用200行C++代码,实现贪吃蛇小游戏(附源码)

ztj100 2024-10-29 18:21 31 浏览 0 评论



小编是一个有着6年工作经验的工程师,关于C++编程,自己有做材料的整合,一个完整的C++编程学习路线,学习资料和工具,能够进我的群10048,-83029收取,免费送给大家,希望你也能凭着自己的努力,成为下一个优秀的程序员

#include<stdio.h> #include<process.h> #include<windows.h> #include<conio.h> #include<time.h> #include<stdlib.h> #define WIDTH 40 #define HEIGH 12 enum direction{//方向 LEFT, RIGHT, UP, DOWN }; struct Food{//食物 int x; int y; }; struct Node{//画蛇身 int x; int y; struct Node *next; }; struct Snake{//蛇属性 int lenth;//长度 enum direction dir;//方向 }; struct Food *food; //食物 struct Snake *snake;//蛇属性 struct Node *snode,*tail;//蛇身 int SPEECH=200; int score=0;//分数 int smark=0;//吃食物标记 int times=0; int STOP=0; void Initfood();//产生食物 void Initsnake();//构造snake void Eatfood();//头部前进 void Addnode(int x, int y);//增加蛇身 void display(struct Node *shead);//显示蛇身坐标 void move();//蛇移动 void draw();//画蛇 void Homepage();//主页 void keybordhit();//监控键盘按键 void Addtail();//吃到食物 void gotoxy(int x, int y)//定位光标 { COORD pos; pos.X = x - 1; pos.Y = y - 1; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos); } void Initsnake()//构造snake { int i; snake=(struct Snake*)malloc(sizeof(struct Snake)); tail=(struct Node*)malloc(sizeof(struct Node)); food = (struct Food*)malloc(sizeof(struct Food)); snake->lenth=5;//初始长度 5 snake->dir=RIGHT;//初始蛇头方向 右 for(i=2;i<=snake->lenth+2;i++)//增加 5 个结点 { Addnode(i,2); } } void Initfood()//产生食物 { struct Node *p=snode; int mark=1;



srand((unsigned)time(NULL));//以时间为种子产生随机数 while(1) { food->x=rand()%(WIDTH-2)+2;//食物X坐标 food->y=rand()%(HEIGH-2)+2;//食物Y坐标 while(p!=NULL) { if((food->x==p->x)&&(food->y==p->y))//如果食物产生在蛇身上 {//则重新生成食物 mark=0;//食物生成无效 break; } p=p->next; } if(mark==1)//如果食物不在蛇身上,生成食物,否则重新生成食物 { gotoxy(food->x,food->y); printf("%c",3); break; } mark=1; p=snode; } } void move()//移动 { struct Node *q, *p=snode; if(snake->dir==RIGHT) { Addnode(p->x+1,p->y); if(smark==0) { while(p->next!=NULL) { q=p; p=p->next; } q->next=NULL; free(p); } } if(snake->dir==LEFT) { Addnode(p->x-1,p->y); if(smark==0) { while(p->next!=NULL) { q=p; p=p->next; } q->next=NULL; free(p); } } if(snake->dir==UP) { Addnode(p->x,p->y-1); if(smark==0) { while(p->next!=NULL) { q=p; p=p->next; } q->next=NULL; free(p); } } if(snake->dir==DOWN) { Addnode(p->x,p->y+1); if(smark==0) { while(p->next!=NULL) { q=p; p=p->next; } q->next=NULL; free(p); } } } void Addnode(int x, int y)//增加蛇身 { struct Node *newnode=(struct Node *)malloc(sizeof(struct Node)); struct Node *p=snode; newnode->next=snode; newnode->x=x; newnode->y=y; snode=newnode;//结点加到蛇头 if(x<2||x>=WIDTH||y<2||y>=HEIGH)//碰到边界 { STOP=1; gotoxy(10,19); printf("撞墙,游戏结束,任意键退出!\n");//失败 _getch(); free(snode);//释放内存 free(snake); exit(0); } while(p!=NULL)//碰到自身 { if(p->next!=NULL) if((p->x==x)&&(p->y==y)) { STOP=1; gotoxy(10,19); printf("撞到自身,游戏结束,任意键退出!\n");//失败 _getch(); free(snode);//释放内存 free(snake); exit(0); } p=p->next; } } void Eatfood()//吃到食物 { Addtail(); score++; } void Addtail()//增加蛇尾 { struct Node *newnode=(struct Node *)malloc(sizeof(struct Node)); struct Node *p=snode; tail->next=newnode; newnode->x=50; newnode->y=20; newnode->next=NULL;//结点加到蛇头 tail=newnode;//新的蛇尾 } void draw()//画蛇 { struct Node *p=snode; int i,j; while(p!=NULL) { gotoxy(p->x,p->y); printf("%c",2); tail=p; p=p->next; } if(snode->x==food->x&&snode->y==food->y)//蛇头坐标等于食物坐标 { smark=1; Eatfood();//增加结点 Initfood();//产生食物 } if(smark==0) { gotoxy(tail->x,tail->y);//没吃到食物清除之前的尾结点 printf("%c",' ');//如果吃到食物,不清楚尾结点 } else { times=1; } if((smark==1)&&(times==1)) { gotoxy(tail->x,tail->y);//没吃到食物清除之前的尾结点 printf("%c",' ');//如果吃到食物,不清楚尾结点 smark=0; } gotoxy(50,12); printf("食物: %d,%d",food->x,food->y); gotoxy(50,5); printf("分数: %d",score); gotoxy(50,7); printf("速度: %d",SPEECH); gotoxy(15,14); printf("按o键加速"); gotoxy(15,15); printf("按p键减速"); gotoxy(15,16); printf("按空格键暂停"); } void HideCursor()//隐藏光标 { CONSOLE_CURSOR_INFO cursor_info = {1, 0}; SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info); } void Homepage()//绘主页 { int x,y; HideCursor();//隐藏光标 printf("----------------------------------------\n"); printf("|\t\t\t\t |\n"); printf("|\t\t\t\t |\n"); printf("|\t\t\t\t |\n"); printf("|\t\t\t\t |\n"); printf("|\t\t\t\t |\n"); printf("|\t\t\t\t |\n"); printf("|\t\t\t\t |\n"); printf("|\t\t\t\t |\n"); printf("|\t\t\t\t |\n"); printf("|\t\t\t\t |\n"); printf("----------------------------------------\n"); gotoxy(5,13); printf("任意键开始游戏!按W.A.S.D控制方向"); _getch(); Initsnake(); Initfood(); gotoxy(5,13); printf(" "); } void keybordhit()//监控键盘 { char ch; if(_kbhit()) { ch=getch(); switch(ch) { case 'W': case 'w':if(snake->dir==DOWN)//如果本来方向是下,而按相反方向无效 { break; } else snake->dir=UP;break; case 'A': case 'a':if(snake->dir==RIGHT)//如果本来方向是右,而按相反方向无效 { break; } else snake->dir=LEFT;break; case 'S': case 's':if(snake->dir==UP)//如果本来方向是上,而按相反方向无效 { break; } else snake->dir=DOWN;break; case 'D': case 'd':if(snake->dir==LEFT)//如果本来方向是左,而按相反方向无效 { break; } else snake->dir=RIGHT;break; case 'O': case 'o': if(SPEECH>=150)//速度加快 { SPEECH=SPEECH-50; } break; case 'P': case 'p': if(SPEECH<=400)//速度减慢 { SPEECH=SPEECH+50; } break; case ' '://暂停 gotoxy(15,18); printf("游戏已暂停,按任意键恢复游戏"); system("pause>nul"); gotoxy(15,18); printf(" "); break; default:break; } } } int main(void)//程序入口 { Homepage(); while(!STOP) { keybordhit();//监控键盘按键 move();//蛇的坐标变化 draw();//蛇的重绘 Sleep(SPEECH);//暂时挂起线程 } return 0; }

初学编程的同学可以参考 联系我学习



相关推荐

离谱!写了5年Vue,还不会自动化测试?

前言大家好,我是倔强青铜三。是一名热情的软件工程师,我热衷于分享和传播IT技术,致力于通过我的知识和技能推动技术交流与创新,欢迎关注我,微信公众号:倔强青铜三。Playwright是一个功能强大的端到...

package.json 与 package-lock.json 的关系

模块化开发在前端越来越流行,使用node和npm可以很方便的下载管理项目所需的依赖模块。package.json用来描述项目及项目所依赖的模块信息。那package-lock.json和...

Github 标星35k 的 SpringBoot整合acvtiviti开源分享,看完献上膝盖

前言activiti是目前比较流行的工作流框架,但是activiti学起来还是费劲,还是有点难度的,如何整合在线编辑器,如何和业务表单绑定,如何和系统权限绑定,这些问题都是要考虑到的,不是说纯粹的把a...

Vue3 + TypeScript 前端研发模板仓库

我们把这个Vue3+TypeScript前端研发模板仓库的初始化脚本一次性补全到可直接运行的状态,包括:完整的目录结构所有配置文件研发规范文档示例功能模块(ExampleFeature)...

Vue 2迁移Vue 3:从响应式到性能优化

小伙伴们注意啦!Vue2已经在2023年底正式停止维护,再不升级就要面临安全漏洞没人管的风险啦!而且Vue3带来的性能提升可不是一点点——渲染速度快40%,内存占用少一半,更新速度直接翻倍!还在...

VUE学习笔记:声明式渲染详解,对比WEB与VUE

声明式渲染是指使用简洁的模板语法,声明式的方式将数据渲染进DOM系统。声明式是相对于编程式而言,声明式是面向对象的,告诉框架做什么,具体操作由框架完成。编程式是面向过程思想,需要手动编写代码完成具...

苏州web前端培训班, 苏州哪里有web前端工程师培训

前端+HTML5德学习内容:第一阶段:前端页面重构:PC端网站布局、HTML5+CSS3基础项目、WebAPP页面布局;第二阶段:高级程序设计:原生交互功能开发、面向对象开发与ES5/ES6、工具库...

跟我一起开发微信小程序——扩展组件的代码提示补全

用户自定义代码块步骤:1.HBuilderX中工具栏:工具-代码块设置-vue代码块2.通过“1”步骤打开设置文件...

JimuReport 积木报表 v1.9.3发布,免费可视化报表

项目介绍积木报表JimuReport,是一款免费的数据可视化报表,含报表、大屏和仪表盘,像搭建积木一样完全在线设计!功能涵盖:数据报表、打印设计、图表报表、门户设计、大屏设计等!...

软开企服开源的无忧企业文档(V2.1.3)产品说明书

目录1....

一款面向 AI 的下一代富文本编辑器,已开源

简介AiEditor是一个面向AI的下一代富文本编辑器。开箱即用、支持所有前端框架、支持Markdown书写模式什么是AiEditor?AiEditor是一个面向AI的下一代富文本编辑...

玩转Markdown(2)——抽象语法树的提取与操纵

上一篇玩转Markdown——数据的分离存储与组件的原生渲染发布,转眼已经鸽了大半年了。最近在操纵mdast生成md文件的时候,心血来潮,把玩转Markdown(2)给补上了。...

DeepseekR1+ollama+dify1.0.0搭建企业/个人知识库(入门避坑版)

找了网上的视频和相关文档看了之后,可能由于版本不对或文档格式不对,很容易走弯路,看完这一章,可以让你少踩三天的坑。步骤和注意事项我一一列出来:1,前提条件是在你的电脑上已配置好ollama,dify1...

升级JDK17的理由,核心是降低GC时间

升级前后对比升级方法...

一个vsCode格式化插件_vscode格式化插件缩进量

ESlint...

取消回复欢迎 发表评论: