C语言小游戏源代码《贪吃蛇》.docx_第1页
C语言小游戏源代码《贪吃蛇》.docx_第2页
C语言小游戏源代码《贪吃蛇》.docx_第3页
C语言小游戏源代码《贪吃蛇》.docx_第4页
C语言小游戏源代码《贪吃蛇》.docx_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言小游戏源代码贪吃蛇#define N 200/*定义全局常量*/ #define m 25 #include #include #include #include #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4800 #define Esc 0x011b int i,j,key,k; struct Food/*构造食物结构体*/ int x; int y; int yes; food; struct Goods/*构造宝贝结构体*/ int x; int y; int yes; goods; struct Block/*构造障碍物结构体*/ int xm; int ym; int yes; block; struct Snake/*构造蛇结构体*/ int xN; int yN; int node; int direction; int life; snake; struct Game/*构建游戏级别参数体*/ int score; int level; int speed; game; /*定义函数*/ void init(void);/*定义图形驱动*/ void close(void);/*定义关闭函数*/ void drawk(void);/*定义界面函数*/ void gameover(void);/*定义游戏结束函数*/ void gameplay(void);/*定义游戏主函数*/ void prscore(void);/*定义得分函数*/ void main(void)/*主函数体,调用以下四个函数*/ init(); setbkcolor(7); drawk(); gameplay(); close(); void init(void)/*构建图形驱动函数*/ int gd=DETECT,gm; initgraph(&gd,&gm,); cleardevice(); void drawk(void)/*构建游戏界面函数*/ /*setbkcolor(LIGHTGREEN);*/ char str350; setfillstyle(SOLID_FILL,BLUE);/*条型边框,显示版本信息*/ bar3d(48,9,610,38,1,45); setcolor(YELLOW);/*版本信息*/ sprintf(str3,Version:5.01,Powerwing Studio); outtextxy(330,20,str3); setfillstyle(LTSLASH_FILL,YELLOW);/*设定墙边的填充形式*/ bar3d(48,48,58,462,0,0);/*设定墙边*/ bar3d(48,39,611,48,0,0); bar3d(48,452,611,462,0,0); bar3d(602,39,611,462,0,0); void gameplay(void)/*构建游戏主函数*/ /*初始化游戏角色*/ randomize();/*随机数发生器*/ goods.yes=1; block.yes=1; food.yes=1;/*场景中需建立新的食物*/ snake.life=1;/*初始化蛇生命值*/ snake.direction=1;/*蛇起始的移动方向定义为向右*/ snake.x0=100;snake.y0=100;/*蛇头的位置坐标初始化*/ snake.x1=110;snake.y1=100; snake.node=2;/*蛇初始化节数,共两节只有蛇头*/ /*初始化障碍物的数组*/ block.x0=170;block.y0=270;/*level 1*/ block.x1=410;block.y1=310; block.x2=300;block.y2=200; block.x3=320;block.y3=420; block.x4=250;block.y4=350; block.x5=220;block.y5=320;/*level 2*/ block.x6=310;block.y6=410; block.x7=400;block.y7=500; block.x8=230;block.y8=230; block.x9=280;block.y9=280; block.x10=170;block.y10=280;/*level 3*/ block.x11=420;block.y11=310; block.x12=310;block.y12=200; block.x13=320;block.y13=400; block.x14=250;block.y14=260;/*level 4*/ block.x15=220;block.y15=330; block.x16=130;block.y16=410; block.x17=310;block.y17=510; block.x18=230;block.y18=340; block.x19=280;block.y19=380; block.x20=270;block.y20=170;/*level 5*/ block.x21=410;block.y21=450; block.x22=190;block.y22=200; block.x23=150;block.y23=320; block.x24=270;block.y24=350; block.x25=340;block.y25=320; game.score=0; game.speed=50000; game.level=1; prscore();/*得分初始化*/ while(1)/*判断为真可以按Esc退出循环结束游戏*/ while(!kbhit()/*无按键按下时,蛇自己移动身体*/ if(game.level=1)/*画出障碍物*/ for(j=0;j5;j+) setcolor(5);/*/ rectangle(block.xj,block.yj,block.xj+10,block.yj-10); block.yes=0; if(game.level=2)/*画出障碍物*/ for(j=0;j9;j+) setcolor(5);/*/ rectangle(block.xj,block.yj,block.xj+10,block.yj-10); block.yes=0; if(game.level=3)/*画出障碍物*/ for(j=0;j14;j+) setcolor(5);/*/ rectangle(block.xj,block.yj,block.xj+10,block.yj-10); block.yes=0; if(game.level=4)/*画出障碍物*/ for(j=0;j19;j+) setcolor(5);/*/ rectangle(block.xj,block.yj,block.xj+10,block.yj-10); block.yes=0; if(game.level=5)/*画出障碍物*/ for(j=0;j25;j+) setcolor(5);/*/ rectangle(block.xj,block.yj,block.xj+10,block.yj-10); block.yes=0; if(food.yes=1)/*需要画出新的食物*/ food.x=rand()%400+60;/*获得间隔60的随机数食物坐标值*/ food.y=rand()%350+60; while(food.x%10!=0)/*判断坐标值是否满足被10整除,否,自动增加*/ food.x+; while(food.y%10!=0) food.y+; food.yes=0;/*新的食物已经产生*/ if(goods.yes=1)/*需要画出新的宝物*/ goods.x=rand()%380+60;/*获得间隔60的随机数宝贝坐标值*/ goods.y=rand()%320+80; while(goods.x%10!=0)/*判断坐标值是否满足被10整除,否,自动增加*/ goods.x+; while(goods.y%10!=0) goods.y+; goods.yes=0;/*新的宝贝已经产生*/ if(goods.yes=0)/*新宝贝产生,应显示出来*/ setcolor(0);/*擦除*/ rectangle(goods.x,goods.y,goods.x+10,goods.y-10); delay(50);/*延时*/ setcolor(YELLOW); goods.x=goods.x+random(10)-random(20);/*随机数增量*/ goods.y=goods.y+random(10)-random(20); while(goods.x%10!=0)/*判断变化后的坐标值是否满足被10整除,否,自动增加*/ goods.x+; while(goods.y%10!=0) goods.y+; rectangle(goods.x,goods.y,goods.x+10,goods.y-10);/*重画出宝贝*/ if(goods.x585|goods.y445)/*判定宝贝是否越界*/ setcolor(0);/*擦除越界的宝贝*/ rectangle(goods.x,goods.y,goods.x+10,goods.y-10); goods.yes=1;/*越界后重新生成宝贝*/ if(food.yes=0)/*新食物产生,应显示出来*/ setcolor(GREEN); setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设定当前线型*/ rectangle(food.x,food.y,food.x+10,food.y-10); for(i=snake.node-1;i0;i-)/*取得需重画的蛇的节数*/ snake.xi=snake.xi-1;/*最后一节的坐标值等于倒数第二节的坐标值*/ snake.yi=snake.yi-1; switch(snake.direction)/*判断蛇头的移动方向*/ case 1:snake.x0+=10;break;/*向右*/ case 2:snake.x0-=10;break;/*向左*/ case 3:snake.y0-=10;break;/*向上*/ case 4:snake.y0+=10;break;/*向下*/ for(i=3;isnake.node;i+)/*超过4节后,判断蛇自身碰撞*/ if(snake.xi=snake.x0&snake.yi=snake.y0)/*即自身的任一节坐标值与蛇头坐标相等*/ for(i=1;isnake.node-1;i+)/*擦除自己碰撞后位置蛇的身子*/ setcolor(0); rectangle(snake.xi,snake.yi,snake.xi+10,snake.yi-10); rectangle(snake.xsnake.node-1,snake.ysnake.node-1, snake.xsnake.node-1+10,snake.ysnake.node-1-10); snake.life-=1;/*生命值减少一*/ snake.node-=5; prscore();/*输出结果*/ if(snake.life=0)/*判断生命值是否为0*/ gameover();/*游戏结束*/ break;/*退出内循环*/ if(snake.x0595|snake.y0455)/*判断蛇是否与墙体碰撞*/ for(i=1;isnake.node-1;i+)/*擦除撞墙后位置蛇的身子*/ setcolor(0); rectangle(snake.xi,snake.yi,snake.xi+10,snake.yi-10); rectangle(snake.xsnake.node-1,snake.ysnake.node-1, snake.xsnake.node-1+10,snake.ysnake.node-1-10); snake.x0=100;snake.y0=100;/*蛇头的位置坐标重新初始化*/ snake.x1=110;snake.y1=100; snake.direction=1;/*蛇起始的移动方向定义为向右*/ snake.life-=1;/*生命值减少一*/ snake.node-=5;/*相应节数减少5节*/ prscore(); if(snake.life=0) gameover(); break; /*判断蛇与障碍物碰撞,食物是否与障碍物重叠*/ if(game.level=1)/*判断级别,并设定相应的障碍物数量,即数组个数*/ k=5; else if(game.level=2) k=9; else if(game.level=3) k=14; else if(game.level=4) k=19; else if(game.level=5) k=25; for(j=0;jk;j+) if(snake.x0=block.xj&snake.y0=block.yj) for(i=1;i2)/*当节数每增加5节生命值增加一*/ snake.life=1+fabs(snake.node-2)/5); food.yes=1;/*场景需要增加食物*/ game.score+=20;/*加分*/ prscore();/*输出得分*/ if(snake.x0=goods.x&snake.y0=goods.y)/*判定蛇是否得到宝贝*/ setcolor(0);/*设定宝贝的颜色为背景色,即擦除*/ rectangle(goods.x,goods.y,goods.x+10,goods.y-10); goods.yes=1;/*场景需要增加新的宝贝*/ game.score+=100;/*得到宝贝后加100分*/ prscore();/*输出得分*/ if(game.score=500&game.score=1000&game.score=1500&game.score=5000) game.level=5; game.speed=10000; setcolor(4);/*画出移动的蛇*/ setlinestyle(SOLID_LINE,0,THICK_WIDTH);/*设定当前线型*/ for(i=0;isnake.node;i+) rectangle(snake.xi,snake.yi,snake.xi+10,snake.yi-10); delay(game.speed); setcolor(0);/*用背景色擦去最后一节*/ rectangle(snake.xsnake.node-1,snake.ysnake.node-1, snake.xsnake.node-1+10,snake.ysnake.node-1-10); /*endwhile(! kbhit) */ if(snake.life=0)/*判断循环结束条件:蛇死或者检测到Esc按键*/ break; key=bioskey(0);/*判断按键*/ if(key=Esc) break; /*判断蛇头接收到的用户按键响应的移动方向*/ else if(key=UP&snake.direction!=4) snake.direction=3; else if(key=RIGHT&snake.direction!=2) snake.direction=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论