⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 boxman.cpp

📁 这是用VC++编写的推箱子的游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//
void CBoxMan::DrawManWall(int x, int y, CDC* pDC)
{
    COLORREF clr = RGB(0, 0, 255);                   //蓝色墙
    pDC->FillSolidRect(x, y, 20, 20, clr);
    pDC->MoveTo(x, y + 10);
    pDC->LineTo(x + 20, y + 10);
    pDC->MoveTo(x + 10, y + 10);
    pDC->LineTo(x + 10, y + 20);

	//人的绘制
    pDC->Ellipse(x + 6, y + 2, x + 14, y + 10);      //人头

    pDC->MoveTo(x + 2, y + 11);                      //人手
    pDC->LineTo(x + 18, y + 11);

    pDC->MoveTo(x + 10, y + 10);                     //人身体
    pDC->LineTo(x + 10, y + 12);

    pDC->MoveTo(x + 2, y + 20);                      //人脚
    pDC->LineTo(x + 10, y + 12);
    pDC->LineTo(x + 18, y +20);
}

//
//  绘制人在目的地
//
void CBoxMan::DrawManBall(int x, int y, CDC* pDC)
{
    COLORREF clr = RGB(0, 0, 255);                   //球
    pDC->FillSolidRect(x, y, 20, 20, clr);
    pDC->MoveTo(x, y + 10);
    pDC->LineTo(x + 20, y + 10);
    pDC->MoveTo(x + 10, y + 10);
    pDC->LineTo(x + 10, y + 20);
    pDC->Ellipse(x, y, x + 20, y + 20);
    pDC->Ellipse(x + 5, y + 5, x + 15, y + 15);

	//人的绘制
    pDC->Ellipse(x + 6, y + 2, x + 14, y + 10);      //人头

    pDC->MoveTo(x + 2, y + 11);                      //人手
    pDC->LineTo(x + 18, y + 11);

    pDC->MoveTo(x + 10, y + 10);                     //人身体
    pDC->LineTo(x + 10, y + 12);

    pDC->MoveTo(x + 2, y + 20);                      //人脚
    pDC->LineTo(x + 10, y + 12);
    pDC->LineTo(x + 18, y +20);
}

void CBoxMan::KeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
    DispatchMsg(nChar);

    if (IsFinish())
    {
		m_soundState = SOUND_STATE_VICTORY;
        m_iMissionNum = m_iMissionNum +1;
        if (m_iMissionNum > MAX_MISSION_NUM)
            m_iMissionNum = 1;
        LoadMap(m_iMissionNum);
        m_ptManPosition = GetManPosition();
    }

	BoxManPlaySound();
}

void CBoxMan::DispatchMsg(UINT nChar)
{
    int x1, y1, x2, y2, x3, y3;

	//获取工人当前位置
    x1 = m_ptManPosition.x;
    y1 = m_ptManPosition.y;

	//分析按键消息
    switch (nChar)
    {
	//向上
    case VK_UP:
        x2 = x1;
        y2 = y1 - 1;
        x3 = x1;
        y3 = y1 - 2;
		//将所有位置输入以判断并作地图更新
        UpdateMap(x1, y1, x2, y2, x3, y3);
        break;
	//向下
    case VK_DOWN:
        x2 = x1;
        y2 = y1 + 1;
        x3 = x1;
        y3 = y1 + 2;
        UpdateMap(x1, y1, x2, y2, x3, y3);
        break;
	//向左
    case VK_LEFT:
        x2 = x1 - 1;
        y2 = y1;
        x3 = x1 - 2;
        y3 = y1;
        UpdateMap(x1, y1, x2, y2, x3, y3);
        break;
	//向右
    case VK_RIGHT:
        x2 = x1 + 1;
        y2 = y1;
        x3 = x1 + 2;
        y3 = y1;
        UpdateMap(x1, y1, x2, y2, x3, y3);
        break;

  //选关功能键
    case 82:  //R  重新玩当前关
    case 114: //r  
        LoadMap(m_iMissionNum);
        m_ptManPosition = GetManPosition();
        break;
    case 113:  //F2  跳到下一关
        m_iMissionNum = m_iMissionNum + 1;
        if (m_iMissionNum > MAX_MISSION_NUM)
            m_iMissionNum = 1;
        LoadMap(m_iMissionNum);
        m_ptManPosition = GetManPosition();
        break;
    case 112:  //F1  跳到前一关
        m_iMissionNum = m_iMissionNum - 1;
        if (m_iMissionNum < 1)
            m_iMissionNum = MAX_MISSION_NUM;
        LoadMap(m_iMissionNum);
        m_ptManPosition = GetManPosition();
    }
}

void CBoxMan::UpdateMap(int x1, int y1, int x2, int y2, int x3, int y3)
{
    switch (m_cMap[y2][x2])
    {
    case MAP_BACKGROUP:           //地图设计错误,不应该出现
        AfxMessageBox("wrong map");
        break;
    case MAP_WHITEWALL:          //遇到墙,不做任何事情
        
        break;
    case MAP_BLUEWALL:           //通道,可以行走
        m_cMap[y2][x2] = MAP_MANWALL;
        if (m_cMap[y1][x1] == MAP_MANWALL)
            m_cMap[y1][x1] = MAP_BLUEWALL;
        else if (m_cMap[y1][x1] == MAP_MANBALL)
            m_cMap[y1][x1] = MAP_BALL;
        m_ptManPosition.x = x2;
        m_ptManPosition.y = y2;
		m_soundState = SOUND_STATE_MOVE;
        break;

    case MAP_BALL:               //目的地,可以行走
        m_cMap[y2][x2] = MAP_MANBALL;
        if (m_cMap[y1][x1] == MAP_MANWALL)
            m_cMap[y1][x1] = MAP_BLUEWALL;
        else if (m_cMap[y1][x1] == MAP_MANBALL)
            m_cMap[y1][x1] = MAP_BALL;        
        m_ptManPosition.x = x2;
        m_ptManPosition.y = y2;
		m_soundState = SOUND_STATE_MOVE;
        break;

    case MAP_YELLOWBOX:          //箱子
        if (m_cMap[y3][x3] == MAP_BALL)   //目的地可以行走
        {
            m_cMap[y3][x3] = MAP_REDBOX;
            m_cMap[y2][x2] = MAP_MANWALL;
            if (m_cMap[y1][x1] == MAP_MANWALL)
                m_cMap[y1][x1] = MAP_BLUEWALL;
            else if (m_cMap[y1][x1] == MAP_MANBALL)
                m_cMap[y1][x1] = MAP_BALL;
            m_ptManPosition.x = x2;
            m_ptManPosition.y = y2;
		m_soundState = SOUND_STATE_PUSH;
        }
        else if (m_cMap[y3][x3] == MAP_BLUEWALL) //通道,可以行走
        {
            m_cMap[y3][x3] = MAP_YELLOWBOX;
            m_cMap[y2][x2] = MAP_MANWALL;
            if (m_cMap[y1][x1] == MAP_MANWALL)
                m_cMap[y1][x1] = MAP_BLUEWALL;
            else if (m_cMap[y1][x1] == MAP_MANBALL)
                m_cMap[y1][x1] = MAP_BALL;
            m_ptManPosition.x = x2;
            m_ptManPosition.y = y2;
		m_soundState = SOUND_STATE_PUSH;
        }
        break;

    case MAP_REDBOX:             //安放好的箱子
        if (m_cMap[y3][x3] == MAP_BALL)   //目的地可以行走
        {
            m_cMap[y3][x3] = MAP_REDBOX;
            m_cMap[y2][x2] = MAP_MANBALL;
            if (m_cMap[y1][x1] == MAP_MANWALL)
                m_cMap[y1][x1] = MAP_BLUEWALL;
            else if (m_cMap[y1][x1] == MAP_MANBALL)
                m_cMap[y1][x1] = MAP_BALL;
            m_ptManPosition.x = x2;
            m_ptManPosition.y = y2;
			m_soundState = SOUND_STATE_PUSH;
        }
        else if (m_cMap[y3][x3] == MAP_BLUEWALL)  //通道,可以行走
        {
            m_cMap[y3][x3] = MAP_YELLOWBOX;
            m_cMap[y2][x2] = MAP_MANBALL;
            if (m_cMap[y1][x1] == MAP_MANWALL)
                m_cMap[y1][x1] = MAP_BLUEWALL;
            else if (m_cMap[y1][x1] == MAP_MANBALL)
                m_cMap[y1][x1] = MAP_BALL;
            m_ptManPosition.x = x2;
            m_ptManPosition.y = y2;
			m_soundState = SOUND_STATE_PUSH;
        }        
        break;

    case MAP_MANWALL:            //地图设计错误,不应该出现
        AfxMessageBox("wrong map");
        break;

    case MAP_MANBALL:            //地图设计错误,不应该出现
        AfxMessageBox("wrong map");
        break;
    }
}

bool CBoxMan::IsFinish()
{
    bool bFinish = true;
    for (int i = 0; i < M_TAB_HEIGHT; i++)
    {
        for (int j = 0; j < M_TAB_WIDTH; j++)
        {
            if (m_cMap[i][j] == MAP_BALL || m_cMap[i][j] == MAP_MANBALL)
                bFinish = false;
        }
    }
    return bFinish;
}

BOOL CBoxMan::ChangeMissionNum(int iNum)
{
	if((iNum>MAX_MISSION_NUM)||(iNum<1))
	{
		return FALSE;
	}
	else
	{
        m_iMissionNum = iNum;
        LoadMap(m_iMissionNum);
        m_ptManPosition = GetManPosition();
		return TRUE;
	}
}

int  CBoxMan::GetNowMissionNum(void)
{
	return m_iMissionNum;
}

void CBoxMan::BoxManPlaySound(void)
{
	if(m_bSound)
	{
		char strFileName[30];
		
		switch (m_soundState)
		{
		case SOUND_STATE_START :
			strcpy(strFileName,"start.wav");
			break;
			
		case SOUND_STATE_MOVE :
			strcpy(strFileName,"move.wav");
			break;
			
		case SOUND_STATE_PUSH :
			strcpy(strFileName,"push.wav");
			break;
			
		case SOUND_STATE_VICTORY :
			strcpy(strFileName,"victory.wav");
			break;
			
		default:
			return;
		}

		PlaySound(strFileName, NULL, SND_ASYNC | SND_FILENAME);	
	}
}

void CBoxMan::IsSound(BOOL bUse)
{
	m_bSound = bUse;
}

⌨️ 快捷键说明

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