📄 boxman.cpp
字号:
//
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 + -