贪吃蛇程序简单贪吃蛇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(); }
spinservers怎么样?spinservers大硬盘服务器。Spinservers刚刚在美国圣何塞机房补货120台独立服务器,CPU都是双E5系列,64-512GB DDR4内存,超大SSD或NVMe存储,数量有限,机器都是预部署好的,下单即可上架,无需人工干预,有需要的朋友抓紧下单哦。Spinservers是Majestic Hosting Solutions,LLC旗下站点,主营美国独立...
CloudCone 商家在以前的篇幅中也有多次介绍到,这个商家也蛮有意思的。以前一直只有洛杉矶MC机房,而且在功能上和Linode、DO、Vultr一样可以随时删除采用按时计费模式。但是,他们没有学到人家的精华部分,要这样的小时计费,一定要机房多才有优势,否则压根没有多大用途。这不最近CloudCone商家有点小变化,有新人洛杉矶优化线路,具体是什么优化的等会我测试看看线路。内存CPU硬盘流量价格...
妮妮云的知名度应该也不用多介绍了,妮妮云旗下的云产品提供商,相比起他家其他的产品,云产品还是非常良心的,经常出了一些优惠活动,前段时间的八折活动推出了很多优质产品,近期商家秒杀活动又上线了,秒杀产品比较全面,除了ECS和轻量云,还有一些免费空间、增值代购、云数据库等,如果你是刚入行安稳做站的朋友,可以先入手一个119/元季付的ECS来起步,非常稳定。官网地址:www.niniyun.com活动专区...
贪吃蛇程序为你推荐
莱特币挖矿莱特币110矿机一天能挖几个币?3g安全网3G购彩通安全吗?华为技术上海华为技术有限公司怎么样?亚网谁知道什么是软式网球?广西网站建设公司广西网络策划公司csol进不去急!急!为什么反恐精英online进不去游戏,到输入帐号之前的地方就无响应了?无线监控系统方案什么才叫无线监控wosignoscp 是什么证书顶尖设计网国内有哪些顶尖设计师三江学院图书馆三江东校区怎么样?
过期已备案域名 美国主机评测 koss 宕机监控 贵州电信宽带测速 debian7 国内加速器 牛人与腾讯客服对话 qingyun anylink 百兆独享 中国电信测网速 谷歌台湾 免费php空间 测速电信 七十九刀 聚惠网 phpinfo forwarder 最新优惠 更多