TurboLiu2 2022-12-19 14:29 采纳率: 0%
浏览 115
已结题

基于c语言贪吃蛇程序,游戏中增加一个天使,天使会随机出现,蛇碰到天使时会自动减少2节身体。

我改了很多次代码但都不行,比如增加了以下代码但一直不行,主要bug是蛇吃天使之后身体的两节不会消失。

    if(snake.x[0]==angel.x&&snake.y[0]==angel.y)
    {
        setcolor(0);
        rectangle(angel.x,angel.y,angel.x+10,angel.y+10);
        snake.node=snake.node-2;
        angel.flag=1;
    }
    setcolor(4);


所以请教各位基于c语言贪吃蛇程序,游戏中增加一个天使,天使会随机出现,蛇碰到天使时会自动减少2节身体这个功能怎么实现,最好给出解释谢谢
以下是我写的代码,请教大师改一下

#include <graphics.h>
#include <stdlib.h>
#include <dos.h>
#include<conio.h>
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define DOWN 0x5000
#define UP 0x4800
#define ESC 0x011b
#define N 100/*贪吃蛇的最大长度*/
int i,key;
int speed;/*游戏速度*/


struct FOOD
{
   int x;/*食物的横坐标*/
   int y;/*食物的纵坐标*/
   int flag;/*标志是否要出现食物*/
}food;


struct BOOM
{
   int x;/*炸弹的横坐标*/
   int y;/*炸弹的纵坐标*/
   int flag;/*标志是否要出现炸弹*/
}boom;


struct Angel
{
   int x;/*天使的横坐标*/
   int y;/*天使的纵坐标*/
   int flag;/*标志是否要出现天使*/
}angel;


struct DEVIL
{
   int x;/*恶魔的横坐标*/
   int y;/*恶魔的纵坐标*/
   int flag;/*标志是否要出现恶魔*/
}devil;


struct Snake
{
   int x[N];
   int y[N];
   int node;/*蛇的节数*/
   int dir;/*蛇移动方向*/
   int life;/*标志是死是活*/
}snake;
void GameOver();/*结束游戏*/
void Play();/*玩游戏过程*/
void dwall();/*画墙*/
void wall(int x,int y);/*画组成墙的砖*/
int Speed();/*选择贪吃蛇的速度*/

main()
{
  int gdriver=DETECT,gmode;
   /*registerbgidriver(EGAVGA_driver);*/
   initgraph(&gdriver,&gmode,"C:\\TC20\\BGI");
   speed=Speed();/*将函数返回值赋给speed*/
   cleardevice();/*清屏*/
   dwall();/*开始画墙*/
   Play();/*开始完游戏*/
   getch();
   closegraph();/*退出图形界面*/
}

void wall(int x,int y)
{
 int sizx=9;
 int sizy=9;
/************************************************************************************************************************************************************************************/
 /*//考试要求1:添加代码,利用setcolor函数完成黄色画砖的上边和左边                                                           
 //函数功能:设置前景颜色                                                                                                                                                            
 //函数原型:void setcolor(int color);                                                                                                                                               
 //参数:0 - BLACK 黑   1 - BLUE 兰   2 - GREEN 绿   3 - CYAN 青    4 - RED 红    5 - MAGENTA 洋红  6 - BROWN 棕  7 - LIGHTGRAY 深灰                                           
 //      8 - DARKGRAY 淡灰   9 - LIGHTBLUE 淡兰   10 - LIGHTGREEN 淡绿     11 - LIGHTCYAN 淡青   12 - LIGHTRED 淡红   13 - LIGHTMAGENTA 淡洋红  14 - YELLOW 黄   15 - WHITE 白*/
 /************************************************************************************************************************************************************************************/

  setcolor(14);
 line(x,y,x+sizx,y);
 line(x,y+1,x+sizx-1,y+1);
 line(x,y,x,y+sizy);
 line(x+1,y,x+1,y+sizy-1);
 setcolor(4);/*红色画砖的右面和下面*/
 line(x+1,y+sizy,x+sizx,y+sizy);
 line(x+2,y+sizy-1,x+sizx,y+sizy-1);
 line(x+sizx-1,y+2,x+sizx-1,y+sizy-1);
 line(x+sizx,y+1,x+sizx,y+sizy);
 setfillstyle(1,12);/*用淡红色填充砖的中间部分*/
 bar(x+2,y+2,x+sizx-2,y+sizy-2);
}
void dwall()/*用前面画好的砖来画墙*/
{int j;
for(j=50;j<=600;j+=10)
{
    wall(j,40);/*画上面墙*/
    wall(j,451);/*画下面墙*/
}
for(j=40;j<=450;j+=10)
{
wall(50,j);/*画左面墙*/
wall(601,j);/*画右面墙*/
}
}
int Speed()/*选择贪吃蛇运行的速度*/
{           int m;
gotoxy(20,10);
   printf("level1\n");
   gotoxy(20,12);
   printf("level2\n");
   gotoxy(20,14);
   printf("level3\n\t\tplease choose:");
   scanf("%d",&m);
/*******************************************************************************************************/
/*考试要求2:修改代码,将level3的速度增快                                                              */  
/*******************************************************************************************************/
   switch(m)
   {
   case 1:return 1500;
   case 2:return 500;
   case 3:return 100;
   default:
   cleardevice();
   Speed();
   }
}

void Play(void)/*游戏实现过程*/
{
   srand((unsigned long)time(0));
   food.flag=1;/*1表示需出现新食物,0表示食物已存在*/
   boom.flag=1;
   angel.flag=1;/*天使*/
   devil.flag=1;/*恶魔*/
   snake.life=0;/*标志贪吃蛇活着*/
/*******************************************************************************************************/
/*考试要求3:添加代码,利用snake结构体的dir成员变量完成蛇初始方向向下                                  */
/*******************************************************************************************************/
snake.dir=4;

/*******************************************************************************************************/
/*考试要求4:由于修改了蛇头初始方向,增加了蛇身长度,需修改和添加代码,重新定位蛇头初始位置                                                      */
/*******************************************************************************************************/
   snake.x[0]=300;snake.y[0]=240;/*定位蛇头初始位置*/
   snake.x[1]=300;snake.y[1]=240;
   snake.node=3;/*赋值蛇的节数*/

/*******************************************************************************************************/
/*考试要求5:添加代码,使贪食蛇节数为3节                                                               */
/*******************************************************************************************************/


   do
   {
      while(!kbhit())/*在没有按键的情况下,蛇自己移动身体*/
      {
     if(food.flag==1)/*需要出现新食物*/
     do
     {
         food.x=rand()%520+60;
         food.y=rand()%370+60;
        food.flag=0;/*标志已有食物*/
     }while(food.x%10!=0||food.y%10!=0);
     if(food.flag==0)/*画出食物*/
     {
              setcolor(GREEN);
/***********************************************************************************************************************************************************************/
/*//考试要求6:添加代码:利用setlinestyle函数完成加粗点线画食物                                                                                                          
//函数功能:设置当前画线宽度和类型                                                                                                                                     
//函数原型:void setlinestyle(int linestyle, unsigned pattern,int width);                                                                                          
//参数:                                                                                                                                                               
//////linestyle:定义所画直线类型; 0 - SOLID_LINE 实心线    1 - DOTTED_LINE 点线     2 - CENTER_LINE 中心线     3 - DASHED_LINE 断续线     4 - USERBIT_LINE 用户自定义线
//////pattern:使用系统预定义的线型则参数取0值                                                                                                                          
/////width:指定所画直线的粗细;1 - NORM_WIDTH     3 - THICK_WIDTH*/                                                                                                      
/***********************************************************************************************************************************************************************/


              rectangle(food.x,food.y,food.x+10,food.y+10);
     }
     setlinestyle(2,0,3);
      if(boom.flag==1)
     do
     {
         boom.x=rand()%200+60;
         boom.y=rand()%300+60;
        boom.flag=0;
     }while(boom.x%10!=0||boom.y%10!=0);
      if(boom.flag==0)
     {
              setcolor(RED);
              rectangle(boom.x,boom.y,boom.x+10,boom.y+10);
     }
     setlinestyle(2,0,3);



     if(angel.flag==1)
     do
     {
         angel.x=rand()%200+60;
         angel.y=rand()%300+60;
        angel.flag=0;
     }while(angel.x%10!=0||angel.y%10!=0);
      if(angel.flag==0)
     {
              setcolor(15);
              rectangle(angel.x,angel.y,angel.x+10,angel.y+10);
     }
     setlinestyle(2,0,3);

     
     if(devil.flag==1)
     do
     {
         devil.x=rand()%200+60;
         devil.y=rand()%300+60;
        devil.flag=0;
     }while(devil.x%10!=0||devil.y%10!=0);
      if(devil.flag==0)
     {
              setcolor(1);
              rectangle(devil.x,devil.y,devil.x+10,devil.y+10);
     }
     setlinestyle(2,0,3);



         for(i=snake.node-1;i>0;i--)/*实现蛇向前移动*/
         {
            snake.x[i]=snake.x[i-1];
            snake.y[i]=snake.y[i-1];
     }
      
     switch(snake.dir)
     {
        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=1;/*蛇死*/
               break;
        }
        }
    if(snake.x[0]<60||snake.x[0]>590||snake.y[0]<50||
       snake.y[0]>440)/*蛇是否撞到墙壁*/
    {
        GameOver();/*游戏结束*/
/************************************************************************************/
/* 考试要求7:添加代码,利用life成员变量完成蛇死语句                                */
/************************************************************************************/
        snake.life=1;

        break;
    }
     if(snake.x[0]==boom.x&&snake.y[0]==boom.y)
        {
               GameOver();
               snake.life=1;
               break;
        }
    if(snake.x[0]==food.x&&snake.y[0]==food.y)/*判断是否吃到食物*/
    {
           setcolor(0);/*用背景色遮盖调食物*/
           rectangle(food.x,food.y,food.x+10,food.y+10);
/************************************************************************************/
/*考试要求8:添加代码,完成蛇每吃到一次食物的身体长长两节                                           */
/************************************************************************************/
          snake.node=snake.node+2;
         

       food.flag=1;/*需要出现新的食物*/
    }



    if(snake.x[0]==angel.x&&snake.y[0]==angel.y)
    {
        setcolor(0);
        rectangle(angel.x,angel.y,angel.x+10,angel.y+10);
        snake.node=snake.node-2;
        angel.flag=1;
    }
    setcolor(4);

    if(snake.x[0]==devil.x&&snake.y[0]==devil.y)
    {
        setcolor(0);
        rectangle(devil.x,devil.y,devil.x+10,devil.y+10);
        snake.node=snake.node+10;
        devil.flag=1;
    }




    
    for(i=0;i<snake.node;i++)
     {     setlinestyle(0,0,1);

/************************************************************************************/
/*//考试要求9:利用rectangle函数实现画蛇                                             
//函数功能:画一个矩形                                                             
//函数原型:void rectangle(int left, int top, int right, int bottom, int mode);    
//参数:                                                                           
//////(left,top):指定左上角坐标                                                 
//////(right,bottom):指定右下角坐标                                           
////// mode:决定画图方式;0 - 清除方式     1 - 正常方式     2 - 反相方式          */
/************************************************************************************/

        rectangle(snake.x[i],snake.y[i],snake.x[i]+10,snake.y[i]+10);
           }
    ;

    delay(speed);
    setcolor(0);/*用背景色遮盖蛇的的最后一节*/
    rectangle(snake.x[snake.node-1],snake.y[snake.node-1],
    snake.x[snake.node-1]+10,snake.y[snake.node-1]+10);
     }  /*endwhile(!kbhit)*/
    if(snake.life==1)/*如果蛇死就跳出循环*/
        break;
    key=bioskey(0);/*接收按键*/
       if(key==UP&&snake.dir!=4)/*判断是否往相反的方向移动*/
      snake.dir=3;
       else
     if(key==DOWN&&snake.dir!=3)/*判断是否往相反的方向移动*/
           snake.dir=4;
      else
          if(key==RIGHT&&snake.dir!=2)/*判断是否往相反的方向移动*/
         snake.dir=1;
         else
    if(key==LEFT&&snake.dir!=1)/*判断是否往相反的方向移动*/
        snake.dir=2;
   }while(key!=ESC);/*ESC键退出游戏*/
}

void GameOver(void)
{
    cleardevice();
   setcolor(RED);
   settextstyle(0,0,4);

/************************************************************************************/
/*//考试要求10: 添加代码,利用outtextxy函数在屏幕中央实现游戏结束显示you are out!           
//函数功能:指定位置显示一字符串                                                   
//函数原型:void outtextxy(int x, int y, char *textstring);                        
//参数:                                                                           
//////(x,y):指定位置的坐标                                                       
//////textstring:需要显示的字符串                                                 */
/************************************************************************************/
   outtextxy(100, 100, "WLYDSG");
   sleep(3);
}



  • 写回答

3条回答 默认 最新

  • Minuw 2022-12-19 14:32
    关注

    是不是更新一下

    评论

报告相同问题?

问题事件

  • 系统已结题 12月27日
  • 修改了问题 12月19日
  • 创建了问题 12月19日

悬赏问题

  • ¥30 模拟电路 logisim
  • ¥15 PVE8.2.7无法成功使用a5000的vGPU,什么原因
  • ¥15 is not in the mmseg::model registry。报错,模型注册表找不到自定义模块。
  • ¥15 安装quartus II18.1时弹出此error,怎么解决?
  • ¥15 keil官网下载psn序列号在哪
  • ¥15 想用adb命令做一个通话软件,播放录音
  • ¥30 Pytorch深度学习服务器跑不通问题解决?
  • ¥15 部分客户订单定位有误的问题
  • ¥15 如何在maya程序中利用python编写领子和褶裥的模型的方法
  • ¥15 Bug traq 数据包 大概什么价