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

CloudCone 新增洛杉矶优化线路 年付17.99美元且简单线路测试

CloudCone 商家在以前的篇幅中也有多次介绍到,这个商家也蛮有意思的。以前一直只有洛杉矶MC机房,而且在功能上和Linode、DO、Vultr一样可以随时删除采用按时计费模式。但是,他们没有学到人家的精华部分,要这样的小时计费,一定要机房多才有优势,否则压根没有多大用途。这不最近CloudCone商家有点小变化,有新人洛杉矶优化线路,具体是什么优化的等会我测试看看线路。内存CPU硬盘流量价格...

PIGYun月付14.4元起,美国洛杉矶/韩国VPS七月6折

PIGYun是成立于2019年的国人商家,提供香港、韩国和美西CUVIP-9929等机房线路基于KVM架构的VPS主机,本月商家针对韩国首尔、美国洛杉矶CUVIP-AS29、GIA回程带防御等多条线路VPS提供6-8.5折优惠码,优惠后韩国首尔CN2混合BGP特惠型/美国洛杉矶GIA回程带10Gbps攻击防御VPS主机最低每月14.4元起。下面列出几款不同机房VPS主机配置信息,请留意不同优惠码。...

wordpress简洁英文主题 wordpress简洁通用型高级外贸主题

wordpress简洁英文主题,wordpress简洁通用大气的网站风格设计 + 更适于欧美国外用户操作体验,完善的外贸企业建站功能模块 + 更好的移动设备特色模块支持,更高效实用的后台自定义设置 + 标准高效的代码程序功能结构,更利于Goolge等国际搜索引擎的SEO搜索优化和站点收录排名。点击进入:wordpress简洁通用型高级外贸主题主题价格:¥3980 特 惠 价:¥1280安装环境:运...

贪吃蛇程序为你推荐
智慧充电桩智能充电桩的工作原理?德国阿尔及利亚德国vs阿尔及利亚角球有多少个?四川大学教务系统怎样登入四川大学教务处啊,谢谢了声源定位产生视觉、听觉产生的部位是(  ) A.视网膜;耳蜗 B.大脑皮层;大脑皮层 C.晶状体;听小骨水晶之刺台服水晶之刺今天怎么那么卡?寻找手机怎么用手机序列号找回手机?杭州工作室杭州哪里的工作室好,到底是影楼好还是工作室好呢,该如何选择啊交通信号灯控制系统交通信号灯控制用PLC如何编写程序?锁云有一部耽美小说,炮灰攻和受是兄弟,攻和受是父子。炮灰攻在攻年幼时就设计杀害了他母亲,也就是受的妻子例外招聘银行校园招聘和合同制柜员有什么区别?
万网域名 我的世界服务器租用 域名空间购买 抗投诉vps主机 idc评测 flashfxp怎么用 site5 godaddy主机 linode代购 紫田 patcha 免费个人博客 php空间申请 什么是服务器托管 服务器干什么用的 东莞主机托管 中国linux 工信部icp备案查询 空间服务器 apnic 更多