贪吃蛇程序简单贪吃蛇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(); }

ZJI:520元/月香港服务器-2*E5-2630L/32GB/480G SSD/30M带宽/2IP

ZJI发布了一款7月份特别促销独立服务器:香港邦联四型,提供65折优惠码,限量30台(每用户限购1台),优惠后每月520元起。ZJI是原来Wordpress圈知名主机商家:维翔主机,成立于2011年,2018年9月启用新域名ZJI,提供中国香港、台湾、日本、美国独立服务器(自营/数据中心直营)租用及VDS、虚拟主机空间、域名注册等业务。下面列出这款服务器的配置信息。香港邦联四型CPU:2*E5-2...

piayun(pia云)240元/季起云服务器,香港限时季付活动,cn2线路,4核4G15M

pia云怎么样?pia云是一家2018的开办的国人商家,原名叫哔哔云,目前整合到了魔方云平台上,商家主要销售VPS服务,采用KVM虚拟架构 ,机房有美国洛杉矶、中国香港和深圳地区,洛杉矶为crea机房,三网回程CN2 GIA,带20G防御。目前,Pia云优惠促销,年付全场8折起,香港超极速CN2季付活动,4核4G15M云服务器仅240元/季起,香港CN2、美国三网CN2深圳BGP优质云服务器超高性...

Spinservers美国圣何塞服务器$111/月流量10TB

Spinservers是Majestic Hosting Solutions,LLC旗下站点,主营美国独立服务器租用和Hybrid Dedicated等,数据中心位于美国德克萨斯州达拉斯和加利福尼亚圣何塞机房。TheServerStore.com,自 1994 年以来,它是一家成熟的企业 IT 设备供应商,专门从事二手服务器和工作站业务,在德克萨斯州拥有 40,000 平方英尺的仓库,库存中始终有...

贪吃蛇程序为你推荐
十进制转换成二进制十进制转二进制的转换方法。。。信息系统等级测评什么是信息安全等级保护,评测标准??湖北文理学院地址湖北文理学院怎么样啊剑灵服务器剑灵大区和服务器什么意思数据挖掘的应用机器学习在数据挖掘中的应用宾馆客房管理系统什么是酒店客房智能控制系统 ???无线监控方案近距离无线监控方案优势?无线监控系统方案什么才叫无线监控web移动端开发web移动端开发要具备哪些知识?postgresql安装怎么将postgresql安装目录bin加入到环境变量中的"path"变量中,具体点,谢谢
ipage 香港机房 网通服务器ip 工信部icp备案号 asp免费空间申请 北京双线 1元域名 lamp架构 摩尔庄园注册 免费个人网页 北京主机托管 中国电信宽带测速 阿里云邮箱怎么注册 restart 傲盾代理 达拉斯 rewrite规则 电脑显示屏不亮但是主机已开机 长沙服务器托管 web服务器安全配置 更多