共有回帖数  0  个 
	 
	
	
	
     
          
          
               
				
			 
				
					 
 
            
				   - 
						
						
							 
									/*食物为绿色,毒花为白色,救命稻草为红色,蛇是彩色的,随着游戏级别的升高,
蛇的速度加快,游戏级别大于等于3且蛇的生命小于等于5时出现救命稻草,吃下后生
命值加1.游戏级别大于等于3时会在屏幕上出现障碍物,撞到障碍物生命值减1,吃到
毒花生命值也减1.但如果碰到自己或撞到外墙则直接GameOver,这个是我从最简单的
那个贪吃蛇游戏代码那改的,不过也算是一个作品吧,因为毕竟有了自己的东西了,
我是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;iM;i++)/*随机数发生器*/
    food.yes=1;/*1表示需要出现新食物,0表示已经存在食物*/
    for(i=0;iF;i++)
    flower.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;i20;i++)
     for(j=0;j20;j++)
     {
       if(map[j])
       rectangle(200+j*10-5,100+i*10-5,210+j*10-5,110+i*10-5);
      } 
for(i=0;iM;i++)
{
        if(food.yes==1)/*需要出现新食物*/
        {
                 food.x=rand()%400+60;
                 food.y=rand()%350+60;
                 while(food.x%10!=0)/*食物随机出现后必须让食物能够在整格内,这样才可以让蛇吃到*/
                    food.x++;
                 while(food.y%10!=0)
                    food.y++;
                  for(ii=0;ii20;ii++)
                     for(jj=0;jj20;jj++)
                         if(map[ii][jj]){
                            while(food.x==200+jj*10&&food.y==100+ii*10)
                                food.x+=10; } /*不让食物在内墙上出现*/
                  food.yes=0;/*画面上有食物了*/
         }
           if(food.yes==0)/*画面上有食物了就要显示*/
              {
                       setcolor(GREEN);
                       circle(food.x,food.y,4);
             }
}
for(i=0;iF;i++)
{
         if(flower.yes==1)
         {
                 flower.x=rand()%400+60;
                 flower.y=rand()%350+60;
                 while(flower.x%10!=0)
                       flower.x++;
                 while(flower.y%10!=0)
                       flower.y++;
                  for(ii=0;ii20;ii++)
                      for(jj=0;jj20;jj++)
                           if(map[ii][jj])
                           {
                             if(flower.x==200+jj*10&&flower.y==100+ii*10)
                                  flower.x+=10; /*不让毒花在内墙上出现*/
                           }
                 for(ii=0;iiM;ii++)
                 {
                      while(flower.x==food[ii].x&&flower.y==food[ii].y)
                                  flower.x+=10;/*不让毒花与食物重合*/
                 }
             flower.yes=0; /*画面上有毒花了*/
          }
            if(flower.yes==0) /*画面上有毒花了就要显示*/
            {
                  setcolor(WHITE); /*毒花为白色*/
                  circle(flower.x,flower.y,4);
            }
}
if(level=3&&a==0)
{
       for(ii=0;ii20;ii++)
         for(jj=0;jj20;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;ii20;ii++)
                      for(jj=0;jj20;jj++)
                           if(map[ii][jj])
                           {
                            while(lucky.x==200+jj*10&&lucky.y==100+ii*10)
                                 lucky.x+=10; /*不让救命稻草在内墙上出现*/
                           }
                 for(ii=0;iiM;ii++)
                    {
                      while(lucky.x==food[ii].x&&lucky.y==food[ii].y)
                                  lucky.x+=10;/*不让救命稻草与食物重合*/
                    }
                  for(ii=0;iiF;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;i0;i--)/*蛇的每个环节往前移动,也就是贪吃蛇的关键算法*/ 
     { 
             snake.x=snake.x[i-1]; 
             snake.y=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;isnake.node;i++)/*从蛇的第四节开始判断是否撞到自己了,因为蛇头为两节,第三节不可能拐过来*/ 
{ 
     if(snake.x==snake.x[0]&&snake.y==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;i20;i++)
{
    for(j=0;j20;j++)
     {
      if(map[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[j]=0;/*清地图*/
             PrScore();
           }
        }
     }
}
if(snake.life==0)/*以上三种判断,如果蛇死就跳出内循环,重新开始*/
            break;
for(i=0;iM;i++)
{
           if(snake.x[0]==food.x&&snake.y[0]==food.y)/*吃到食物以后*/
          {
            setcolor(0);/*把画面上的食物东西去掉*/ 
            circle(food.x,food.y,4);
            snake.x[snake.node]=-20;snake.y[snake.node]=-20;
             /*新的一节先放在看不见的位置,下次循环就取前一节的位置*/
            snake.node++;/*蛇的身体长一节*/
             food.yes=1;/*画面上需要出现新的食物*/
             score+=10*level;
             PrScore();/*输出新得分*/
              }
}
for(i=0;iF;i++)
{
           if(snake.x[0]==flower.x&&snake.y[0]==flower.y)/*吃到毒花后*/
              {
              setcolor(0);
              circle(flower.x,flower.y,4);
              snake.life--;
              flower.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;isnake.node;i++)
{
setcolor(i%15+1);
   /*画出彩蛇*/
circle(snake.x,snake.y,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(); 
}
							 
							 
							 
							  
							  
							  楼主 2016-04-15 09:27 回复
						 
						 
           
          
          
         
   
         
      
 
   
             
                  
                  
 
 
 
     
	 
  
	Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知