签到

05月05日
尚未签到

共有回帖数 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();
    }

    楼主 2015-07-15 13:17 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知