mmiballoon.c

来自「是一个手机功能的模拟程序」· C语言 代码 · 共 2,004 行 · 第 1/5 页

C
2,004
字号
    BalloonTotal * balloontotal=pheader->balloontotal;

    random=rand();
   // random=random%8;
  //要求在前15个当中不能有stop、mul、div这三种气球,
  //并且其它5种气球的总数不能超过3 	
    if(balloontotal->countall<16)
    	{
    	  	random=random%5;
    	  if(balloontotal->btcount[random]<2)
    	  	//如果气球总数超过2,就需要从新找一个类型。
    	  	return random;
    	  else
    	  	{
    	  	  for(i=random+1;i<random+6;i++)
    	  	  	{      	  	  	
    	  	  		j=i%5;  	  	  	  
    	  	  	if(balloontotal->btcount[j]<4)
    	  	  		return j;
    	  	  	}   	  	  	
    	  	}
    	}
//15个之后可以有* / s这三种气球但是只能各有1个
   if(balloontotal->countall>15)
    	{
    		random=random%8;
    	  for(i=random;i<random+8;i++)
    	  	 {
    	  	    j=i%8;
    	  	    
    	  	  	if(j==5)
    	  	  		{
    	  	  		if(balloontotal->btcount[5]==1)
    	  	  	   	   continue;
    	  	  	       else return j;
    	  	  		}
    	  	    if(j==6)
    	  	    	{
    	  	    	if(balloontotal->btcount[6]==1)
    	  	  	       continue;
    	  	  	      else return j;
    	  	    	}
    	  	  	if(j==7)
    	  	  		{
    	  	  		if(balloontotal->btcount[7]==1)
    	  	  	       continue;
    	  	  	      else return j;
    	  	  		}
    	  	  	
    	  	  if(balloontotal->btcount[j]<6)
   //如果气球总数超过6,就需要从新找一个类型。
    	        	return j;
    	            else
    	        	{
    //如果j=4就不能用下面的条件,否则就会创建多个/2的气球
    	          if(j==4)
    	         	continue;
    	  	    	 if(balloontotal->btcount[j+1]<6)
    	  	  	   	return j+1;
    	  	     	}
    	  	}
    	}
    
    return 2;
}

/*************************************************************************************
  函数名:balloonheadinitial
  描述:用于计算气球的总数和对应的每种气球的气球个数
  *************************************************************************************/
void countballoontotal(BalloonItemHeader *pheader)
{
    BalloonItem *lastballoon=pheader->plast;
    BalloonTotal *balloontotal=pheader->balloontotal;

    if(lastballoon->balloontype!=10)
    	{
    	balloontotal->countall++;
    	balloontotal->btcount[lastballoon->balloontype]+=1;
    	}
}

/*************************************************************************************
  函数名:newballoon
  描述:此函数用于判断在什么时候需要创建一个新的气球
         这里涉及到难度设计并且要考虑屏幕上气球的分布情况
***************************************************************************************/
void newballoon(BalloonItemHeader * pheader)
{
     static U16 timelevel;
     short ymin;
     BalloonTotal *balloontotal=pheader->balloontotal;

     if(balloontotal->countall>32)
     	return;
     	
     if(pheader->ballooncount<18)
     	{
        if(pheader->ballooncount==0)
        	{
     	       addballoonitem(pheader);  
              return;
        	}
        
        //取得气球当中y的最大值
        ymin=getballoonymin(pheader);
        
        #ifdef BALLOONDEBUG
        zgzTraceDataFunc("newballoon ymin", (U16)ymin);
        #endif
        
        //如果气球总数不是0,并且最后一个气球离现在创建的位置
        //至少要有9个象素的距离
        ymin=CURSORYMAX-ymin;
         if((ymin>=36)&&(ymin<160))
    	  addballoonitem(pheader);
    	}
}

/*************************************************************************************
  函数名:balloonheadinitial
  描述:此函数用于返回气球的最小ymin,如果没有气球就返回120
  *************************************************************************************/
U16 getballoonymin(BalloonItemHeader * pheader)
{
   U16 ymin=CURSORYMIN;
   BalloonItem * tempballoon=pheader->pfirst;

   if(pheader->ballooncount==0)
   	return CURSORYMAX-ymin;

   while(tempballoon)
   	{
    tempballoon=tempballoon->balloonnext;
    if(tempballoon)
    	{
         if(ymin<tempballoon->yposition)
   	      ymin=tempballoon->yposition;
   	    }
   	}
   return ymin;
}

/*************************************************************************************
  函数名:balloonheadinitial
  描述:此函数调用创建新的元素并且调用balloonrise,并刷新lcd 。
         如果击中了stop的气球就不用上升或者创建新的气球
  注意:这里有一个timelevel的的参数这个主要是为了难度设计用的       
  *************************************************************************************/
void ypositionadd(BalloonItemHeader * pheader,char *pscreenbuffer)
{
   static U16 calculagraph;
   U16 timelevel;
      calculagraph++;
      timelevel=settimelevel();

      if(pheader->fireflag&&timestoped)                              /* if 's' is hit and other balloon is hit				*/
    	{      	
     	gameinterfaceshow(pheader,pscreenbuffer);
     	pheader->fireflag=0;
     	}
     	
      if(pheader->ballooncount==0)                                     /*  there is no balloon on screen 					*/
      	timelevel=0;
      
      if(calculagraph>timelevel)							
      	calculagraph=0;
      
      if(calculagraph==timelevel)
    	{
    	timestoped=0;   	
      	calculagraph=0;   
        gameinterfaceshow(pheader,pscreenbuffer);	
     	}     
      
        if(calculagraph==0)
      	{
      	newballoon(pheader);	
      	}
      	
      
}

/*************************************************************************************
  函数名:balloonheadinitial
  描述: 此游戏总共9个级别
          如果是奇数那么就是说,每次进入timercb所有的气球都需要
          上升,如果是偶数那么平均两次进入timercb所有的气球上升
          一次
  *************************************************************************************/
U16 settimelevel(void)
{
    if(timestoped==1)
    	return 100;
    	
    	return 1;
}

/*************************************************************************************
  函数名:balloonheadinitial
  描述:
  *************************************************************************************/
void movecursorquik(BalloonItemHeader * pheader)
{
  static U8 bmtimecount;
  
  movecursor(pheader);
  if(bmtimecount==pheader->keycode+1)
    movecursor(pheader);
  else
	bmtimecount=pheader->keycode+1;

}

/*************************************************************************************
  函数名:balloonheadinitial
  描述:此函数移动光标每次移动5个象素
  *************************************************************************************/
void movecursor(BalloonItemHeader * pheader)
{
   switch(pheader->keycode)
   	{
   	case 0:
   		break;
   	case 1:
   		if(cursor.xposition>CURSORXMIN+CURSORSIZE)
   		cursor.xposition=cursor.xposition-CURSORSPEED;
   		break;
   	case 2:
   		if(cursor.xposition<CURSORXMAX-CURSORSIZE)
   		cursor.xposition=cursor.xposition+CURSORSPEED;
   		break;
   	case 3:	
   		if(cursor.yposition>CURSORYMIN+CURSORSIZE)
   		cursor.yposition=cursor.yposition-CURSORSPEED;
   		break;
   	case 4:
   		if(cursor.yposition<CURSORYMAX-CURSORSIZE)
   	    cursor.yposition=cursor.yposition+CURSORSPEED;
   		break;	
   	case 5:
   	default:
   		break;
   		
   	}
}

/*************************************************************************************
* 函数名:balloonheadinitial
* 描述:此函数用于逐个调用shortinside函数,并且调用countscore
         计算积分
*************************************************************************************/
int gunshort(BalloonItemHeader *pheader)
{
    BalloonItem *tempballoon;
    U8 scoreflag=0;
        
  // TRACE_EVENT ("gunshort()");

    tempballoon=pheader->pfirst;
   
    while(tempballoon->balloonnext)
    	{
    	tempballoon=tempballoon->balloonnext;
    	if(tempballoon){
    	shortinside(tempballoon); 
    	
    	if(tempballoon->flag==1)
    		{
    		scoreflag++;
    		countscore(pheader, tempballoon,scoreflag);
    		}
    	}
    	}
    return scoreflag;
}

/*************************************************************************************
  函数名:balloonheadinitial
  描述:此函数用于判断是否击中气球,判断的方式是以圆来作为
         判断的方法的
  *************************************************************************************/
int shortinside(BalloonItem *balloon)
{
    U16 width,height,radius;
    Balloon_Property tempballoon;
    
    #ifdef BALLOONDEBUG
    TRACE_EVENT ("shorinside()");
    #endif
    
    if(balloon->flag==2)
    	return;

    tempballoon=balloonproperty[balloon->balloontype];
    radius=tempballoon.height;
    
    width=abs(cursor.xposition-(balloon->xposition+radius));
    height=abs(cursor.yposition-(balloon->yposition+radius));

    if(radius*radius>(width*width+height*height))
    	{
        	balloon->flag=1;
        	
    	}
 
}

/*************************************************************************************
  函数名:balloonheadinitial
  描述:此函数用于逐个判断气球是不是移出界外
  *************************************************************************************/
int moveoutside(BalloonItemHeader *pheader)
{
 int moveout;
 BalloonItem *tempballoon;

 tempballoon=pheader->pfirst;
 moveout=0;
 
 while(tempballoon->balloonnext)
 	{
 	tempballoon=tempballoon->balloonnext;
 	#ifdef BALLOONDEBUG
 	zgzTraceDataFunc("moveoutside yposition", (U16)tempballoon->yposition);
 	#endif
 	if(judgeoutside(tempballoon))
 		moveout++;
 	}
 return moveout;
}

/*************************************************************************************
  函数名:judgeoutside
  描述:用于判断气球是不是已经移出界外,如果纵坐标小于0
         或者大于140 那就是说气球已经出界了,设定标志flag为2
  注意:由于yposition是usigned 型,如果yposition小于0,其实判断的时候
         他将大于140 而不是小于0
  *************************************************************************************/
int judgeoutside(BalloonItem *balloon)
{
   U8 balloonsize;

   balloonsize=balloonproperty[balloon->balloontype].height*2;
   
   if((balloon->yposition+balloonsize)<=CURSORYMIN)
   	{
   	balloon->flag=2;
   	return 1;
   	}
   return 0;
}

/*************************************************************************************
  函数名:judgeoutside
  描述:用于计算当局的得分
  *************************************************************************************/
void countscore(BalloonItemHeader *pheader,BalloonItem *tempballoon,U8 scoreflag)
{

U32 score;


score=pheader->score;
if(tempballoon->balloontype==7)
{//击中stop的气球
    pheader->hitcount[7]=1;
    timestoped=1;
    return;
}
if(tempballoon->balloontype==6)
	//击中除2的气球
{
  pheader->hitcount[6]=1;
  pheader->score=score/2;
  return;
}
if(tempballoon->balloontype==5)
{//击中乘2 的气球
  pheader->hitcount[5]=1;
  pheader->score=score*2;
  return;
}
if(scoreflag==1)
{
//击中一般的气球
 pheader->score =score+balloonproperty[tempballoon->balloontype].score;
 pheader->hitcount[tempballoon->balloontype]++;
}
if(scoreflag>1)
{
//一枪命中两个
  pheader->score =score+balloonproperty[tempballoon->balloontype].score+10;
}
}

/*************************************************************************************
  函数名:get_freshsize
  描述:对于气球被击中还有气球刷新的时候计算光标和气球重合
         的区域需要刷

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?