贪吃蛇程序简单贪吃蛇C语言程序

贪吃蛇程序  时间:2022-03-02  阅读:()

简单贪吃蛇C语言程序

#include <graphics.h> #include <stdlib.h> #include <dos.h> #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define ESC 0x011b #define N 200/*蛇的最大长度*/ #define M 3 /*食物数量*/ #define F 2 /*毒花数量*/ int i,j,key; int k=0; int a=0; int map[20][20];/*障碍地图*/ int score=200;/*得分*/ int gamespeed;/*游戏速度自己调整*/ int level=1; /*游戏级别*/ struct Food { int x;/*食物的横坐标*/ int y;/*食物的纵坐标*/ int yes;/*判断是否要出现食物的变量*/ }food[M];/*食物的结构体*/ struct Flower { int x; int y; int yes; }flower[F]; /*毒花的结构体*/ struct Lucky { int x; int y; int yes; }lucky;/*救命稻草结构体*/ struct Snake { int x[N]; int y[N]; int node;/*蛇的节数*/ int direction;/*蛇移动方向*/ int life;/* 蛇的生命,0死亡*/ }snake; void Init(void);/*图形驱动*/ void Close(void);/*图形结束*/ void DrawK(void);/*开始画面*/ void GameOver(void);/*结束游戏*/ void GamePlay(void);/*玩游戏具体过程*/ void PrScore(void);/*输出成绩*/ /*主函数*/ void main(void) { Init();/*图形驱动*/ DrawK();/*开始画面*/ GamePlay();/*玩游戏具体过程*/ Close();/*图形结束*/ } /*图形驱动*/ void Init(void) { int gd=DETECT,gm; initgraph(&gd,&gm,"c:\tc"); cleardevice(); } /*开始画面,左上角坐标为(50,40),右下角坐标为(595,460)的围墙*/ void DrawK(void) { setcolor(RED); rectangle(50,40,595,460); } /*玩游戏具体过程*/ void GamePlay(void) { int ii,jj; randomize(); for(i=0;i<M;i++)/*随机数发生器*/ food[i].yes=1;/*1表示需要出现新食物,0表示已经存在食物*/ for(i=0;i<F;i++) flower[i].yes=1; snake.life=25; snake.direction=1;/*方向往右*/ snake.x[0]=110;snake.y[0]=60; snake.x[1]=100;snake.y[1]=60;/*蛇头*/ snake.node=2;/*节数*/ PrScore();/*输出得分*/ while(1)/*可以重复玩游戏,压ESC键结束*/ { while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/ { /*画地图*/ setcolor(RED); for(i=0;i<20;i++) for(j=0;j<20;j++) { if(map[i][j]) rectangle(200+j*10-5,100+i*10-5,210+j*10-5,110+i*10-5); } for(i=0;i<M;i++) { if(food[i].yes==1)/*需要出现新食物*/ { food[i].x=rand()%400+60; food[i].y=rand()%350+60; while(food[i].x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/ food[i].x++; while(food[i].y%10!=0) food[i].y++; for(ii=0;ii<20;ii++) for(jj=0;jj<20;jj++) if(map[ii][jj]){ while(food[i].x==200+jj*10&&food[i].y==100+ii*10) food[i].x+=10; } /*不让食物在内墙上出现*/ food[i].yes=0;/*画面上有食物了*/ } if(food[i].yes==0)/*画面上有食物了就要显示*/ { setcolor(GREEN); circle(food[i].x,food[i].y,4); } } for(i=0;i<F;i++) { if(flower[i].yes==1) { flower[i].x=rand()%400+60; flower[i].y=rand()%350+60; while(flower[i].x%10!=0) flower[i].x++; while(flower[i].y%10!=0) flower[i].y++; for(ii=0;ii<20;ii++) for(jj=0;jj<20;jj++) if(map[ii][jj]) { if(flower[i].x==200+jj*10&&flower[i].y==100+ii*10) flower[i].x+=10; /*不让毒花在内墙上出现*/ } for(ii=0;ii<M;ii++) { while(flower[i].x==food[ii].x&&flower[i].y==food[ii].y) flower[i].x+=10;/*不让毒花与食物重合*/ } flower[i].yes=0; /*画面上有毒花了*/ } if(flower[i].yes==0) /*画面上有毒花了就要显示*/ { setcolor(WHITE); /*毒花为白色*/ circle(flower[i].x,flower[i].y,4); } } if(level>=3&&a==0) { for(ii=0;ii<20;ii++) for(jj=0;jj<20;jj++) { if(ii==0||ii==9||ii==19) map[ii][jj]=1; } a=1; } if(level>=3&&snake.life<=5&&k==0) lucky.yes=1; if(lucky.yes==1) { lucky.x=rand()%400+60; lucky.y=rand()%350+60; while(lucky.x%10!=0) lucky.x++; while(lucky.y%10!=0) lucky.y++; for(ii=0;ii<20;ii++) for(jj=0;jj<20;jj++) if(map[ii][jj]) { while(lucky.x==200+jj*10&&lucky.y==100+ii*10) lucky.x+=10; /*不让救命稻草在内墙上出现*/ } for(ii=0;ii<M;ii++) { while(lucky.x==food[ii].x&&lucky.y==food[ii].y) lucky.x+=10;/*不让救命稻草与食物重合*/ } for(ii=0;ii<F;ii++) { while(lucky.x==flower[ii].x&&lucky.y==flower[ii].y) lucky.x+=10;/*不让救命稻草与毒花重合*/ } lucky.yes=0; k=1; } if(lucky.yes==0&&k==1) { setcolor(RED); /*救命稻草为红色*/ circle(lucky.x,lucky.y,4); } for(i=snake.node-1;i>0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ { snake.x[i]=snake.x[i-1]; snake.y[i]=snake.y[i-1]; } /*1,2,3,4表示右,左,上,下四个方向,通过这个判断来移动蛇头*/ switch(snake.direction) { case 1:snake.x[0]+=10;break; case 2:snake.x[0]-=10;break; case 3:snake.y[0]-=10;break; case 4:snake.y[0]+=10;break; } for(i=3;i<snake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/ { if(snake.x[i]==snake.x[0]&&snake.y[i]==snake.y[0]) { GameOver();/*显示失败*/ snake.life=0; break; } } if(snake.x[0]<55||snake.x[0]>595||snake.y[0]<45|| snake.y[0]>455)/*蛇是否撞到外墙壁*/ { GameOver();/*本次游戏结束*/ snake.life=0; /*蛇死*/ } for(i=0;i<20;i++) { for(j=0;j<20;j++) { if(map[i][j]) { if(snake.x[0]==(200+j*10)&&snake.y[0]==(100+i*10)) /*蛇是否撞到内墙壁*/ { snake.life--;/*生命值减1*/ score-=10; setcolor(0); rectangle(200+j*10-5,100+i*10-5,210+j*10-5,110+i*10-5);/*去掉被撞掉的砖块*/ map[i][j]=0;/*清地图*/ PrScore(); } } } } if(snake.life==0)/*以上三种判断,如果蛇死就跳出内循环,重新开始*/ break; for(i=0;i<M;i++) { if(snake.x[0]==food[i].x&&snake.y[0]==food[i].y)/*吃到食物以后* { setcolor(0);/*把画面上的食物东西去掉*/ circle(food[i].x,food[i].y,4); snake.x[snake.node]=-20;snake.y[snake.node]=-20; /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/ snake.node++;/*蛇的身体长一节*/ food[i].yes=1;/*画面上需要出现新的食物*/ score+=10*level; PrScore();/*输出新得分*/ } } for(i=0;i<F;i++) { if(snake.x[0]==flower[i].x&&snake.y[0]==flower[i].y)/*吃到毒花后*/ { setcolor(0); circle(flower[i].x,flower[i].y,4); snake.life--; flower[i].yes=1; score-=20; PrScore(); } } if(snake.x[0]==lucky.x&&snake.y[0]==lucky.y)/*吃到救命稻草后*/ { setcolor(0); circle(lucky.x,lucky.y,4); snake.life++; score+=100; PrScore(); k=0; } level=snake.node/10+1; gamespeed=60000-level*5000; for(i=0;i<snake.node;i++) { setcolor(i%15+1); /*画出彩蛇*/ circle(snake.x[i],snake.y[i],5); } delay(gamespeed); setcolor(0);/*用黑色去除蛇的的最后一节*/ circle(snake.x[snake.node-1],snake.y[snake.node-1],5); } /*endwhile(!kbhit)*/ if(snake.life==0)/*如果蛇死就跳出循环*/ break; key=bioskey(0);/*接收按键*/ if(key==ESC)/*按ESC键退出*/ break; else if(key==UP&&snake.direction!=4) /*判断是否往相反的方向移动*/ snake.direction=3; else if(key==RIGHT&&snake.direction!=2) snake.direction=1; else if(key==LEFT&&snake.direction!=1) snake.direction=2; else if(key==DOWN&&snake.direction!=3) snake.direction=4; }/*endwhile(1)*/ } /*游戏结束*/ void GameOver(void) { cleardevice(); PrScore(); setcolor(RED); settextstyle(0,0,4); outtextxy(200,200,"GAME OVER"); getch(); } /*输出成绩*/ void PrScore(void) { char str[10],str1[10]; char str2[10]; setfillstyle(SOLID_FILL,YELLOW); bar(50,15,220,35); setcolor(6); settextstyle(0,0,2); sprintf(str,"score:%d",score); outtextxy(55,20,str); setfillstyle(SOLID_FILL,YELLOW); bar(225,15,350,35); setcolor(1); sprintf(str1,"level:%d",level); outtextxy(230,20,str1); setfillstyle(SOLID_FILL,YELLOW); bar(355,15,470,35); setcolor(7); sprintf(str2,"life:%d",snake.life); outtextxy(360,20,str2); } /*图形结束*/ void Close(void) { closegraph(); }

RackNerd新上圣何塞、芝加哥、达拉斯、亚特兰大INTEL系列,$9.49/年

racknerd怎么样?racknerd商家最近促销三款美国便宜vps,最低只需要9.49美元,可以选择美国圣何塞、西雅图、纽约和芝加哥机房。RackNerd是一家成立于2019年的美国高性价比服务器商家,主要从事美国和荷兰数据中心的便宜vps、独立服务器销售!支持中文工单、支持支付宝和微信以及PayPal付款购买!点击直达:racknerd官方网站INTEL系列可选机房:加利福尼亚州圣何塞、芝加...

木木云35元/月,美国vps服务器优惠,1核1G/500M带宽/1T硬盘/4T流量

木木云怎么样?木木云品牌成立于18年,此为贵州木木云科技有限公司旗下新运营高端的服务器的平台,目前已上线美国中部大盘鸡,母鸡采用E5-267X系列,硬盘全部组成阵列。目前,木木云美国vps进行了优惠促销,1核1G/500M带宽/1T硬盘/4T流量,仅35元/月。点击进入:木木云官方网站地址木木云优惠码:提供了一个您专用的优惠码: yuntue目前我们有如下产品套餐:DV型 1H 1G 500M带宽...

RAKsmart美国洛杉矶独立服务器 E3-1230 16GB内存 限时促销月$76

RAKsmart 商家我们应该较多的熟悉的,主营独立服务器和站群服务器业务。从去年开始有陆续的新增多个机房,包含韩国、日本、中国香港等。虽然他们家也有VPS主机,但是好像不是特别的重视,价格上特价的时候也是比较便宜的1.99美元月付(年中活动有促销)。不过他们的重点还是独立服务器,毕竟在这个产业中利润率较大。正如上面的Megalayer商家的美国服务器活动,这个同学有需要独立服务器,这里我一并整理...

贪吃蛇程序为你推荐
宝安网站制作宝安网站制作哪家公司最好付费电影网站谁有免费电影的网址,给我发个啊?源码哥有报过源码熊的家长吗?他们的课程怎么样?孩子能听懂吗?ibm磁盘阵列ibmds5020磁盘阵列怎么恢复出厂设置或者格式化洛奇英雄传s2洛奇英雄传有办法不交s2的任务,然后反复刷s2的图吗?cmnet设置怎么设置CMNET接入点?web移动端开发web移动端开发要具备哪些知识?wap地带怎样使用WAP、feedback怎么把iPhone的Feedback删除?浙江工业大学图书馆浙江工业大学法学专业怎么样
高防服务器租用qy 网页空间租用 域名服务器是什么 hostgator 香港服务器99idc linode 服务器架设 租空间 福建天翼加速 赞助 gtt 华为云服务登录 四川电信商城 国外的代理服务器 独立主机 阿里云手机官网 国外网页代理 阿里云个人邮箱 石家庄服务器 htaccess 更多