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&×toped) /* 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 + -
显示快捷键?