2020-07-08-03

void CPushBoxDlg::MoveDown(int x, int y) {
    if ((x + 1) > 19) {
        return;
    }
    Pos_x = x;
    Pos_y = y;
    switch (map[x + 1][y])//判断下一个位置的物体是什么
    {
    case WALL://墙
        movetype = MOVEDOWN;
        //记录历史记录
        history_d = map[x][y];
        history_d1 = map[x + 1][y];
        history_d2 = map[x + 2][y];
        not_move++;
        break;
    case BOX://下一个是箱子
        if ((x + 2) > 20){//如果下一个目标越界的话
            movetype = MOVEDOWN;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x + 1][y];
            history_d2 = map[x + 2][y];
            not_move++;
            break;
        }
        else if (map[x + 2][y] == LINE)//箱子的下一个如果是路
        {
            if (map[x][y] == MANINAIM) {
                movetype = MOVEDOWN;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x + 1][y];
                history_d2 = map[x + 2][y];
                map[x + 1][y] = MAN;
                map[x + 2][y] = BOX;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }

            movetype = MOVEDOWN;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x + 1][y];
            history_d2 = map[x + 2][y];
            map[x + 1][y] = MAN;
            map[x + 2][y] = BOX;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else if (map[x + 2][y] == AIM)//判断箱子的下下一个如果是目标
        {
            if (map[x][y] == MANINAIM)
            {
                movetype = MOVEDOWN;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x + 1][y];
                history_d2 = map[x + 2][y];

                map[x + 1][y] = MAN;
                map[x + 2][y] = BOXINAIM;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }

            movetype = MOVEDOWN;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x + 1][y];
            history_d2 = map[x + 2][y];

            map[x + 1][y] = MAN;
            map[x + 2][y] = BOXINAIM;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else
        {
            movetype = MOVEDOWN;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x + 1][y];
            history_d2 = map[x + 2][y];
            not_move++;
        }
        break;
    case BOXINAIM://如果下一个是箱子在目标里面
        if (x + 2 > 20)//如果下下一个越界了
            break;
        else if (map[x + 2][y] == LINE)//判断下下一个如果是路
        {
            if (map[x][y] == MANINAIM) {
                movetype = MOVEDOWN;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x + 1][y];
                history_d2 = map[x + 2][y];

                map[x + 1][y] = MAN;
                map[x + 2][y] = BOX;
                map[x][y] = AIM;
                CurrentStep++;
            }
            else {
                movetype = MOVEDOWN;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x + 1][y];
                history_d2 = map[x + 2][y];

                map[x + 1][y] = MANINAIM;
                map[x + 2][y] = BOX;
                map[x][y] = LINE;
                CurrentStep++;
            }
        }
        else if (map[x + 2][y] == AIM)//判断下下一个如果是目标
        {
            if (map[x][y] == MANINAIM) {
                movetype = MOVEDOWN;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x + 1][y];
                history_d2 = map[x + 2][y];

                map[x + 1][y] = MANINAIM;
                map[x + 2][y] = BOXINAIM;
                map[x][y] = AIM;
                CurrentStep++;
            }
            else {
                movetype = MOVEDOWN;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x + 1][y];
                history_d2 = map[x + 2][y];

                map[x + 1][y] = MANINAIM;
                map[x + 2][y] = BOXINAIM;
                map[x][y] = LINE;
                CurrentStep++;
            }
        }else{
                movetype = MOVEDOWN;
        //记录历史记录
        history_d = map[x][y];
        history_d1 = map[x + 1][y];
        history_d2 = map[x + 2][y];
        not_move++;
        }
        break;
    case LINE:
        if (map[x][y] == MANINAIM)//如果玩家在目标里面
        {
            movetype = MOVEDOWN;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x + 1][y];
            history_d2 = map[x + 2][y];

            map[x + 1][y] = MAN;
            map[x][y] = AIM;
            CurrentStep++;
            break;
        }
        movetype = MOVEDOWN;
        //记录历史记录
        history_d = map[x][y];
        history_d1 = map[x + 1][y];
        history_d2 = map[x + 2][y];
        map[x + 1][y] = MAN;
        map[x][y] = LINE;
        CurrentStep++;
        break;
    case AIM:
        if (map[x][y] == MANINAIM)
        {
            movetype = MOVEDOWN;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x + 1][y];
            history_d2 = map[x + 2][y];

            map[x + 1][y] = MANINAIM;
            map[x][y] = AIM;
            CurrentStep++;
            break;
        }

        movetype = MOVEDOWN;
        //记录历史记录
        history_d = map[x][y];
        history_d1 = map[x + 1][y];
        history_d2 = map[x + 2][y];

        map[x + 1][y] = MANINAIM;
        map[x][y] = LINE;
        CurrentStep++;
        break;
    default:
        break;
    }
    Invalidate(false);
}

void CPushBoxDlg::MoveUp(int x, int y)
{
    if (x - 1 < 0)
    {
        return;
    }
    Pos_x = x;
    Pos_y = y;
    switch (map[x - 1][y])
    {
    case WALL:
        movetype = MOVEUP;
        //记录历史记录
        history_d = map[x][y];
        history_d1 = map[x - 1][y];
        history_d2 = map[x - 2][y];
        not_move++;
        break;
    case BOX:
        if (x - 2 < 0) {
            movetype = MOVEUP;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x - 1][y];
            history_d2 = map[x - 2][y];
            not_move++;
            break;
        }
        else if (map[x - 2][y] == LINE)
        {
            if (map[x][y] == MANINAIM)
            {
                movetype = MOVEUP;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x - 1][y];
                history_d2 = map[x - 2][y];

                map[x - 1][y] = MAN;
                map[x - 2][y] = BOX;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }
            movetype = MOVEUP;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x - 1][y];
            history_d2 = map[x - 2][y];
            map[x - 1][y] = MAN;
            map[x - 2][y] = BOX;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else if (map[x - 2][y] == AIM)
        {
            if (map[x][y] == MANINAIM)
            {
                movetype = MOVEUP;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x - 1][y];
                history_d2 = map[x - 2][y];
                map[x - 1][y] = MAN;
                map[x - 2][y] = BOXINAIM;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }
            movetype = MOVEUP;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x - 1][y];
            history_d2 = map[x - 2][y];
            map[x - 1][y] = MAN;
            map[x - 2][y] = BOXINAIM;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else {
            movetype = MOVEUP;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x - 1][y];
            history_d2 = map[x - 2][y];
            not_move++;
        }
        break;
    case LINE:
        if (map[x][y] == MANINAIM)
        {
            movetype = MOVEUP;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x - 1][y];
            history_d2 = map[x - 2][y];
            map[x - 1][y] = MAN;
            map[x][y] = AIM;
            CurrentStep++;
            break;
        }
        movetype = MOVEUP;
        //记录历史记录
        history_d = map[x][y];
        history_d1 = map[x - 1][y];
        history_d2 = map[x - 2][y];
        map[x - 1][y] = MAN;
        map[x][y] = LINE;
        CurrentStep++;
        break;
    case AIM:
        if (map[x][y] == MANINAIM)
        {
            movetype = MOVEUP;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x - 1][y];
            history_d2 = map[x - 2][y];
            map[x - 1][y] = MANINAIM;
            map[x][y] = AIM;
            CurrentStep++;
            break;
        }
        movetype = MOVEUP;
        //记录历史记录
        history_d = map[x][y];
        history_d1 = map[x - 1][y];
        history_d2 = map[x - 2][y];
        map[x - 1][y] = MANINAIM;
        map[x][y] = LINE;
        CurrentStep++;
        break;
    case BOXINAIM://如果下一个是箱子在目标里面
        if (x - 2 < 0)//如果下下一个越界了
            break;
        else if (map[x - 2][y] == LINE)//判断下下一个如果是路
        {
            if (map[x][y] == MANINAIM)
            {
                movetype = MOVEUP;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x - 1][y];
                history_d2 = map[x - 2][y];
                map[x - 2][y] = BOX;
                map[x - 1][y] = MANINAIM;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }
            movetype = MOVEUP;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x - 1][y];
            history_d2 = map[x - 2][y];
            map[x - 1][y] = MANINAIM;
            map[x - 2][y] = BOX;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else if (map[x - 2][y] == AIM)//判断下下一个如果是目标
        {
            if (map[x][y] == MANINAIM)
            {
                movetype = MOVEUP;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x - 1][y];
                history_d2 = map[x - 2][y];
                map[x - 1][y] = MANINAIM;
                map[x - 2][y] = BOXINAIM;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }
            movetype = MOVEUP;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x - 1][y];
            history_d2 = map[x - 2][y];
            map[x - 1][y] = MANINAIM;
            map[x - 2][y] = BOXINAIM;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else {
            movetype = MOVEUP;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x - 1][y];
            history_d2 = map[x - 2][y];
            not_move++;
        }
        break;
    default:
        break;
    }
    Invalidate(false);
}

void CPushBoxDlg::MoveLeft(int x, int y)
{
    if (y - 1 < 0)
    {
        return;
    }
    Pos_x = x;
    Pos_y = y;
    switch (map[x][y - 1])
    {
    case WALL:
        movetype = MOVELEFT;
        //记录历史记录
        history_d = map[x][y];
        history_d1 = map[x][y-1];
        history_d2 = map[x][y-2];
        not_move++;
        break;
    case BOX:
        if (y - 2 < 0) {
            movetype = MOVELEFT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y - 1];
            history_d2 = map[x][y - 2];
            not_move++;
            break;
        }
        else if (map[x][y - 2] == LINE)
        {
            if (map[x][y] == MANINAIM)
            {

                movetype = MOVELEFT;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x][y - 1];
                history_d2 = map[x][y - 2];

                map[x][y - 1] = MAN;
                map[x][y - 2] = BOX;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }
            movetype = MOVELEFT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y - 1];
            history_d2 = map[x][y - 2];
            map[x][y - 1] = MAN;
            map[x][y - 2] = BOX;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else if (map[x][y - 2] == AIM)
        {
            if (map[x][y] == MANINAIM)
            {
                movetype = MOVELEFT;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x][y - 1];
                history_d2 = map[x][y - 2];
                map[x][y - 1] = MAN;
                map[x][y - 2] = BOXINAIM;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }
            movetype = MOVELEFT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y - 1];
            history_d2 = map[x][y - 2];
            map[x][y - 1] = MAN;
            map[x][y - 2] = BOXINAIM;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else {
            movetype = MOVELEFT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y - 1];
            history_d2 = map[x][y - 2];
            not_move++;
        }
        break;
    case LINE:
        if (map[x][y] == MANINAIM)
        {
            movetype = MOVELEFT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y - 1];
            history_d2 = map[x][y - 2];
            map[x][y - 1] = MAN;
            map[x][y] = AIM;
            CurrentStep++;
            break;
        }
        movetype = MOVELEFT;
        //记录历史记录
        history_d = map[x][y];
        history_d1 = map[x][y - 1];
        history_d2 = map[x][y - 2];
        map[x][y - 1] = MAN;
        map[x][y] = LINE;
        CurrentStep++;
        break;
    case AIM:
        if (map[x][y] == MANINAIM)
        {
            movetype = MOVELEFT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y - 1];
            history_d2 = map[x][y - 2];
            map[x][y - 1] = MANINAIM;
            map[x][y] = AIM;
            CurrentStep++;
            break;
        }
        movetype = MOVELEFT;
        //记录历史记录
        history_d = map[x][y];
        history_d1 = map[x][y - 1];
        history_d2 = map[x][y - 2];
        map[x][y - 1] = MANINAIM;
        map[x][y] = LINE;
        CurrentStep++;
        break;
    case BOXINAIM://如果下一个是箱子在目标里面
        if (y - 2 < 0)//如果下下一个越界了
            break;
        else if (map[x][y - 2] == LINE)//判断下下一个如果是路
        {
            if (map[x][y] == MANINAIM)
            {
                movetype = MOVELEFT;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x][y - 1];
                history_d2 = map[x][y - 2];
                map[x][y - 2] = BOX;
                map[x][y - 1] = MANINAIM;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }
            movetype = MOVELEFT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y - 1];
            history_d2 = map[x][y - 2];
            map[x][y - 1] = MANINAIM;
            map[x][y - 2] = BOX;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else if (map[x][y - 2] == AIM)//判断下下一个如果是目标
        {
            if (map[x][y] == MANINAIM)
            {
                movetype = MOVELEFT;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x][y - 1];
                history_d2 = map[x][y - 2];
                map[x][y - 2] = BOXINAIM;
                map[x][y - 1] = MANINAIM;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }
            movetype = MOVELEFT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y - 1];
            history_d2 = map[x][y - 2];
            map[x][y - 1] = MANINAIM;
            map[x][y - 2] = BOXINAIM;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else {
            movetype = MOVELEFT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y - 1];
            history_d2 = map[x][y - 2];
            not_move++;
        }
        break;
    default:
        break;
    }
    Invalidate(false);
}

void CPushBoxDlg::MoveRight(int x, int y)
{
    if (y + 1 > 19)
    {
        return;
    }
    Pos_x = x;
    Pos_y = y;
    switch (map[x][y + 1])
    {
    case WALL:
        movetype = MOVERIGHT;
        //记录历史记录
        history_d = map[x][y];
        history_d1 = map[x][y + 1];
        history_d2 = map[x][y + 2];
        not_move++;
        break;
    case BOX:
        if (y + 2 > 20) {
            movetype = MOVERIGHT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y + 1];
            history_d2 = map[x][y + 2];
            not_move++;
            break;
        }   
        else if (map[x][y + 2] == LINE)
        {
            if (map[x][y] == MANINAIM)
            {
                movetype = MOVERIGHT;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x][y + 1];
                history_d2 = map[x][y + 2];

                map[x][y + 1] = MAN;
                map[x][y + 2] = BOX;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }
            movetype = MOVERIGHT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y + 1];
            history_d2 = map[x][y + 2];
            map[x][y + 1] = MAN;
            map[x][y + 2] = BOX;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else if (map[x][y + 2] == AIM)
        {
            if (map[x][y] == MANINAIM)
            {
                movetype = MOVERIGHT;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x][y + 1];
                history_d2 = map[x][y + 2];
                map[x][y + 1] = MAN;
                map[x][y + 2] = BOXINAIM;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }
            movetype = MOVERIGHT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y + 1];
            history_d2 = map[x][y + 2];
            map[x][y + 1] = MAN;
            map[x][y + 2] = BOXINAIM;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else {
            movetype = MOVERIGHT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y + 1];
            history_d2 = map[x][y + 2];
            not_move++;
        }
        break;
    case LINE:
        if (map[x][y] == MANINAIM)
        {
            movetype = MOVERIGHT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y + 1];
            history_d2 = map[x][y + 2];
            map[x][y + 1] = MAN;
            map[x][y] = AIM;
            CurrentStep++;
            break;
        }
        movetype = MOVERIGHT;
        //记录历史记录
        history_d = map[x][y];
        history_d1 = map[x][y + 1];
        history_d2 = map[x][y + 2];
        map[x][y + 1] = MAN;
        map[x][y] = LINE;
        CurrentStep++;
        break;
    case AIM:
        if (map[x][y] == MANINAIM)
        {
            movetype = MOVERIGHT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y + 1];
            history_d2 = map[x][y + 2];
            map[x][y + 1] = MANINAIM;
            map[x][y] = AIM;
            CurrentStep++;
            break;
        }
        movetype = MOVERIGHT;
        //记录历史记录
        history_d = map[x][y];
        history_d1 = map[x][y + 1];
        history_d2 = map[x][y + 2];
        map[x][y + 1] = MANINAIM;
        map[x][y] = LINE;
        CurrentStep++;
        break;
    case BOXINAIM://如果下一个是箱子在目标里面
        if (y + 2 > 20)//如果下下一个越界了
            break;
        else if (map[x][y + 2] == LINE)//判断下下一个如果是路
        {
            if (map[x][y] == MANINAIM)
            {
                movetype = MOVERIGHT;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x][y + 1];
                history_d2 = map[x][y + 2];
                map[x][y + 2] = BOX;
                map[x][y + 1] = MANINAIM;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }
            movetype = MOVERIGHT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y + 1];
            history_d2 = map[x][y + 2];
            map[x][y + 1] = MANINAIM;
            map[x][y + 2] = BOX;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else if (map[x][y + 2] == AIM)//判断下下一个如果是目标
        {
            if (map[x][y] == MANINAIM)
            {
                movetype = MOVERIGHT;
                //记录历史记录
                history_d = map[x][y];
                history_d1 = map[x][y + 1];
                history_d2 = map[x][y + 2];
                map[x][y + 2] = BOXINAIM;
                map[x][y + 1] = MANINAIM;
                map[x][y] = AIM;
                CurrentStep++;
                break;
            }
            movetype = MOVERIGHT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y + 1];
            history_d2 = map[x][y + 2];
            map[x][y + 1] = MANINAIM;
            map[x][y + 2] = BOXINAIM;
            map[x][y] = LINE;
            CurrentStep++;
        }
        else {
            movetype = MOVERIGHT;
            //记录历史记录
            history_d = map[x][y];
            history_d1 = map[x][y + 1];
            history_d2 = map[x][y + 2];
            not_move++;
        }
        break;
    default:
        break;
    }

    Invalidate(false);
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容