/*===========================================================================
FILE: push.c
===========================================================================*/
/*===============================================================================
INCLUDES AND VARIABLE DEFINITIONS
=============================================================================== */
#include "AEEModGen.h" // Module interface definitions
#include "AEEAppGen.h" // Applet interface definitions
#include "AEEShell.h" // Shell interface definitions
#include "push.bid"
/*-------------------------------------------------------------------
Applet structure. All variables in here are reference via "pMe->"
-------------------------------------------------------------------*/
// create an applet structure that's passed around. All variables in
// here will be able to be referenced as static.
typedef struct _push {
AEEApplet a ; // First element of this structure must be AEEApplet
AEEDeviceInfo DeviceInfo; // always have access to the hardware device information
IDisplay *pIDisplay; // give a standard way to access the Display interface
IShell *pIShell; // give a standard way to access the Shell interface
// add your own variables here...
int pane[10][10];
AEERect workman;
AEERect endpane[4];
int trunk[4];
int count; //记录箱子到终点的情况,每关四个箱子
int barrier; //每一关的标示
} push;
/*-------------------------------------------------------------------
Function Prototypes
-------------------------------------------------------------------*/
static boolean push_HandleEvent(push* pMe, AEEEvent eCode,
uint16 wParam, uint32 dwParam);
boolean push_InitAppData(push* pMe);
void push_FreeAppData(push* pMe);
AEERect blank(push *pApp,int m,int n);
void fillwall(push *pApp,AEERect rc);
void filltrunk(push *pApp,AEERect rc);
void fillworkman(push *pApp,AEERect rc);
void fillend(push *pApp,AEERect rc);
void fillmend(push *pApp,AEERect rc);
void delcolor(push *pApp,AEERect rc);
void goup(push *pApp);
void godown(push *pApp);
void goleft(push *pApp);
void goright(push *pApp);
/*===============================================================================
FUNCTION DEFINITIONS
=============================================================================== */
//定义每一个方框的信息,长,宽,坐标(二维数组,i和j为数组元素下标)
AEERect blank(push *pApp,int m,int n)
{
AEERect rc;
int row;
int line;
row = n*12; //x轴坐标
line = m*12; //y轴坐标
SETAEERECT(&rc,
row,
line,
12,
12);
return rc;
}
// 填充墙所在方框的位置,颜色为灰色
void fillwall(push *pApp,AEERect rc)
{
IDISPLAY_DrawRect(pApp->a.m_pIDisplay,
&rc,
0x80808000,
0x80808000,
IDF_RECT_FILL | IDF_RECT_FRAME);
}
//填充箱子所在方框的位置,颜色为绿色
void filltrunk(push *pApp,AEERect rc)
{
IDISPLAY_DrawRect(pApp->a.m_pIDisplay,
&rc,
0x009f0000,
0x009f0000,
IDF_RECT_FRAME | IDF_RECT_FILL);
}
//填充人所在位置,颜色为红色;
void fillworkman(push *pApp,AEERect rc)
{
IDISPLAY_DrawRect(pApp->a.m_pIDisplay,
&rc,
0x0000ff00,
0x0000ff00,
IDF_RECT_FILL | IDF_RECT_FRAME);
}
//标志终点所在位置,边框为蓝色
void fillend(push *pApp,AEERect rc)
{
IDISPLAY_DrawRect(pApp->a.m_pIDisplay,
&rc,
0xff000000,
0xffffff00,
IDF_RECT_FILL | IDF_RECT_FRAME);
}
//箱子移动到终点所在位置,则填充终点所在位置,边框为蓝色,中间为绿色
void fillsucced(push *pApp,AEERect rc)
{
IDISPLAY_DrawRect(pApp->a.m_pIDisplay,
&rc,
0xff000000,
0x009f0000,
IDF_RECT_FILL | IDF_RECT_FRAME);
}
// 人站在终点所在位置,边框为蓝色,中间为红色
void fillmend(push *pApp,AEERect rc)
{
IDISPLAY_DrawRect(pApp->a.m_pIDisplay,
&rc,
0x00ff0000,
0x0000ff00,
IDF_RECT_FILL | IDF_RECT_FRAME);
}
//删除移动箱子和人所在位置,填充为背景颜色白色
void delcolor(push *pApp,AEERect rc)
{
IDISPLAY_DrawRect(pApp->a.m_pIDisplay,
&rc,
0xffffff00,
0xffffff00,
IDF_RECT_FRAME |IDF_RECT_FILL );
}
//按下up向上移动的情况
void goup(push *pApp)
{
AEERect rc;
int i,j;
j=pApp->workman.x/12;
i=pApp->workman.y/12;
if(pApp->pane[i-1][j]==2 && (pApp->pane[i-2][j]==0 || pApp->pane[i-2][j]==3))
{
rc=blank(pApp,i-1,j);
delcolor(pApp,rc);
pApp->pane[i-1][j]=0;
if((rc.x==pApp->endpane[0].x && rc.y ==pApp->endpane[0].y)
|| (rc.x==pApp->endpane[1].x && rc.y ==pApp->endpane[1].y)
|| (rc.x==pApp->endpane[2].x && rc.y ==pApp->endpane[2].y)
|| (rc.x==pApp->endpane[3].x && rc.y ==pApp->endpane[3].y))
{
pApp->count--;
fillend(pApp,rc);
pApp->pane[i-1][j]=3;
}
rc=blank(pApp,i-2,j);
filltrunk(pApp,rc);
pApp->pane[i-2][j]=2;
if((rc.x==pApp->endpane[0].x && rc.y ==pApp->endpane[0].y)
|| (rc.x==pApp->endpane[1].x && rc.y ==pApp->endpane[1].y)
|| (rc.x==pApp->endpane[2].x && rc.y ==pApp->endpane[2].y)
|| (rc.x==pApp->endpane[3].x && rc.y ==pApp->endpane[3].y))
pApp->count++;
}
if(pApp->pane[i-1][j]==0|| pApp->pane[i-1][j]==3)
{
delcolor(pApp,pApp->workman);
rc=pApp->workman;
if((rc.x==pApp->endpane[0].x && rc.y ==pApp->endpane[0].y)
|| (rc.x==pApp->endpane[1].x && rc.y ==pApp->endpane[1].y)
|| (rc.x==pApp->endpane[2].x && rc.y ==pApp->endpane[2].y)
|| (rc.x==pApp->endpane[3].x && rc.y ==pApp->endpane[3].y))
fillend(pApp,rc);
pApp->workman=blank(pApp,i-1,j);
fillworkman(pApp,pApp->workman);
}
}
//按down键向下移动情况
void godown(push *pApp)
{
AEERect rc;
int i,j;
j=pApp->workman.x/12;
i=pApp->workman.y/12;
if(pApp->pane[i+1][j]==2 && (pApp->pane[i+2][j]==0 || pApp->pane[i+2][j]==3))
{
rc=blank(pApp,i+1,j);
delcolor(pApp,rc);
pApp->pane[i+1][j]=0;
if((rc.x==pApp->endpane[0].x && rc.y ==pApp->endpane[0].y)
|| (rc.x==pApp->endpane[1].x && rc.y ==pApp->endpane[1].y)
|| (rc.x==pApp->endpane[2].x && rc.y ==pApp->endpane[2].y)
|| (rc.x==pApp->endpane[3].x && rc.y ==pApp->endpane[3].y))
{
pApp->count--;
fillend(pApp,rc);
pApp->pane[i+1][j]=3;
}
rc=blank(pApp,i+2,j);
filltrunk(pApp,rc);
pApp->pane[i+2][j]=2;
if((rc.x==pApp->endpane[0].x && rc.y ==pApp->endpane[0].y)
|| (rc.x==pApp->endpane[1].x && rc.y ==pApp->endpane[1].y)
|| (rc.x==pApp->endpane[2].x && rc.y ==pApp->endpane[2].y)
|| (rc.x==pApp->endpane[3].x && rc.y ==pApp->endpane[3].y))
pApp->count++;
}
if(pApp->pane[i+1][j]==0|| pApp->pane[i+1][j]==3)
{
delcolor(pApp,pApp->workman);
rc=pApp->workman;
if((rc.x==pApp->endpane[0].x && rc.y ==pApp->endpane[0].y)
|| (rc.x==pApp->endpane[1].x && rc.y ==pApp->endpane[1].y)
|| (rc.x==pApp->endpane[2].x && rc.y ==pApp->endpane[2].y)
|| (rc.x==pApp->endpane[3].x && rc.y ==pApp->endpane[3].y))
fillend(pApp,rc);
pApp->workman=blank(pApp,i+1,j);
fillworkman(pApp,pApp->workman);
}
}
//按left键向左移动情况
void goleft(push *pApp)
{
AEERect rc;
int i,j;
j=pApp->workman.x/12;
i=pApp->workman.y/12;
if(pApp->pane[i][j-1]==2 && (pApp->pane[i][j-2]==0 || pApp->pane[i][j-2]==3))
{
rc=blank(pApp,i,j-1);
delcolor(pApp,rc);
pApp->pane[i][j-1]=0;
if((rc.x==pApp->endpane[0].x && rc.y ==pApp->endpane[0].y)
|| (rc.x==pApp->endpane[1].x && rc.y ==pApp->endpane[1].y)
|| (rc.x==pApp->endpane[2].x && rc.y ==pApp->endpane[2].y)
|| (rc.x==pApp->endpane[3].x && rc.y ==pApp->endpane[3].y))
{
pApp->count--;
fillend(pApp,rc);
pApp->pane[i][j-1]=3;
}
rc=blank(pApp,i,j-2);
filltrunk(pApp,rc);
pApp->pane[i][j-2]=2;
if((rc.x==pApp->endpane[0].x && rc.y ==pApp->endpane[0].y)