//
次函数返回 (100 - 一共花费的步数)
int __stdcall IsRightKey(PBYTE buf, int iLength)
{
int iCountStep = 0;
//
棋盘
BYTE bChessBoard[MAX_I][MAX_J] =
{
{STONE, STONE, STONE, EMPTY, EMPTY, EMPTY, STONE},
{STONE, STONE, STONE, BOX, BOX, BOX, STONE},
{STONE, STONE, STONE, EMPTY, EMPTY, EMPTY, STONE},
{EMPTY, EMPTY, EMPTY, EMPTY, EMPTY, BOX, STONE},
{EMPTY, BOX, EMPTY, BOX, EMPTY, EMPTY, EMPTY},
{EMPTY, EMPTY, STONE, EMPTY, STONE, EMPTY, STONE}
};
//
当前小孩的位置
int iChild_i = 0;
int iChild_j = 4;
int iPos = 0;
PBYTE pCur = buf;
//
遍历取得每一个字节,然后解析每个字节的4小步
while
(iPos < iLength)
{
BYTE bTemp = *(pCur + iPos);
//
分解成4小步
BYTE b4[4] = {0,0,0,0};
b4[0] = (bTemp>>6) & 0x03;
b4[1] = (bTemp>>4) & 0x03;
b4[2] = (bTemp>>2) & 0x03;
b4[3] = bTemp & 0x03;
//
一共是4步
for
(int i=0; i<4; i++)
{
switch(b4[i])
{
case
UP:
//
先判断是否越界
if
(iChild_i == 0)
{
return
0;
}
//
如果是石头
if
(bChessBoard[iChild_i-1][iChild_j] == STONE)
{
return
0;
}
//
如果是空地
if
(bChessBoard[iChild_i-1][iChild_j] == EMPTY)
{
iChild_i--;
break
;
}
//
现在肯定是箱子了
//
判断箱子上面是否是边界
if
(iChild_i-1 == 0)
{
return
0;
}
//
判断箱子上方是否有空位置
if
(bChessBoard[iChild_i-2][iChild_j] != EMPTY)
{
return
0;
}
else
{
bChessBoard[iChild_i-2][iChild_j] = BOX;
bChessBoard[iChild_i-1][iChild_j] = EMPTY;
iChild_i--;
break
;
}
__asm int 3;
break
;
case
DOWN:
//
先判断是否越界
if
(iChild_i == MAX_I-1)
{
return
0;
}
//
如果是石头
if
(bChessBoard[iChild_i+1][iChild_j] == STONE)
{
return
0;
}
//
如果是空地
if
(bChessBoard[iChild_i+1][iChild_j] == EMPTY)
{
iChild_i++;
break
;
}
//
现在肯定是箱子了
//
判断箱子下面是否是边界
if
(iChild_i+1 == MAX_I-1)
{
return
0;
}
//
判断箱子下方是否有空位置
if
(bChessBoard[iChild_i+2][iChild_j] != EMPTY)
{
return
0;
}
else
{
bChessBoard[iChild_i+2][iChild_j] = BOX;
bChessBoard[iChild_i+1][iChild_j] = EMPTY;
iChild_i++;
break
;
}
__asm int 3;
break
;
case
LEFT:
//
先判断是否越界
if
(iChild_j == 0)
{
return
0;
}
//
如果是石头
if
(bChessBoard[iChild_i][iChild_j-1] == STONE)
{
return
0;
}
//
如果是空地
if
(bChessBoard[iChild_i][iChild_j-1] == EMPTY)
{
iChild_j--;
break
;
}
//
现在肯定是箱子了
//
判断箱子左面是否是边界
if
(iChild_j-1 == 0)
{
return
0;
}
//
判断箱子左方是否有空位置
if
(bChessBoard[iChild_i][iChild_j-2] != EMPTY)
{
return
0;
}
else
{
bChessBoard[iChild_i][iChild_j-2] = BOX;
bChessBoard[iChild_i][iChild_j-1] = EMPTY;
iChild_j--;
break
;
}
__asm int 3;
break
;
case
RIGHT:
//
先判断是否越界
if
(iChild_j == MAX_J-1)
{
return
0;
}
//
如果是石头
if
(bChessBoard[iChild_i][iChild_j+1] == STONE)
{
return
0;
}
//
如果是空地
if
(bChessBoard[iChild_i][iChild_j+1] == EMPTY)
{
iChild_j++;
break
;
}
//
现在肯定是箱子了
//
判断箱子右面是否是边界
if
(iChild_j+1 == MAX_J-1)
{
return
0;
}
//
判断箱子右方是否有空位置
if
(bChessBoard[iChild_i][iChild_j+2] != EMPTY)
{
return
0;
}
else
{
bChessBoard[iChild_i][iChild_j+2] = BOX;
bChessBoard[iChild_i][iChild_j+1] = EMPTY;
iChild_j++;
break
;
}
__asm int 3;
break
;
default:
__asm int 3;
break
;
}
//
检测是否OK了
iCountStep++;
if
(bChessBoard[3][3] == BOX &&
bChessBoard[4][2] == BOX &&
bChessBoard[4][4] == BOX &&
bChessBoard[4][6] == BOX &&
bChessBoard[5][3] == BOX &&
bChessBoard[5][5] == BOX)
{
for
(int j=i+1; j<4; j++)
{
if
(b4[j] != 0)
{
return
0;
}
}
if
(iLength == iPos+1)
{
return
100-iCountStep;
}
else
return
0;
}
}
iPos++;
}
return
0;
}