贪吃蛇程序简单贪吃蛇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(); }
阿里云香港配置图提速啦是成立于2012年的十分老牌的一个商家这次给大家评测的是 阿里云香港 16核32G 20M 这款产品,单单说价格上就是十分的离谱原价8631元/月的现价只要 999元 而且还有个8折循环优惠。废话不多说直接进入正题。优惠时间 2021年8月20日-2021年9月20日 优惠码 wn789 8折优惠阿里云香港BGP专线 16核32G 10M带宽 优惠购买 399元购买链接阿里云...
racknerd怎么样?racknerd最近发布了一些便宜美国服务器促销,包括大硬盘服务器,提供120G SSD+192TB HDD,有AMD和Intel两个选择,默认32G内存,1Gbps带宽,每个月100TB流量,5个IP地址,月付$599。价格非常便宜,需要存储服务器的朋友可以关注一下。RackNerd主要经营美国圣何塞、洛杉矶、达拉斯、芝加哥、亚特兰大、新泽西机房基于KVM虚拟化的VPS、...
今天父亲节我们有没有陪伴家人一起吃个饭,还是打个电话问候一下。前一段时间同学将网站账户给我说可以有空更新点信息确保他在没有时间的时候还能保持网站有一定的更新内容。不过,他这个网站之前采用的主题也不知道来源哪里,总之各种不合适,文件中很多都是他多年来手工修改的主题拼接的,并非完全适应WordPress已有的函数,有些函数还不兼容最新的PHP版本,于是每次出现问题都要去排查。于是和他商量后,就抽时间把...
贪吃蛇程序为你推荐
飘零网络验证如何在飘零网络验证里面加入成品软件有DLL文件华为开发者联盟华为开发者联盟推出的华为推送有什么优势啊?北方民族大学地址北方民族大学上海长宽上海电信,与长宽有什么区别,现在有几种网络宽带,怎么申请上海长宽上海地铁最小的车宽度有几米?上海长宽上海长宽ftp的网址是多少?长角牛网络监控机ARP网关欺骗攻击软件和IP冲突软件下载地址女网管石家庄女网管怎么啦交通信号灯控制系统求一完成的红绿灯PLC设计,要求有图和简单原理机柜生产厂河北省青县做机箱、机柜的厂子的老板怎么都姓朱呢?
企业主机 美国主机推荐 googleapps 地址大全 hnyd 免空 鲁诺 cloudlink shuang12 帽子云排名 独立主机 测试网速命令 网站加速 ssl加速 空间排行榜 架设代理服务器 apache启动失败 删除域名 hosts文件 在线tracert 更多