📄 puzzledlg.cpp
字号:
m_positionGameBK.xPos = m_nPicRowNum; //可移动方块的位置
m_positionGameBK.yPos = m_nPicColNum;
Invalidate(FALSE);
OnInitialPuzzleGame();
}
//初始化拼图游戏
void CPuzzleDlg::OnInitialPuzzleGame()
{
srand( (unsigned)time( NULL ) );
for(int i=1;i<MAX;i++)
{
int temp=rand()%4+1;
switch(temp)
{
case 1:
::SendMessage(m_hWnd,WM_KEYDOWN,VK_LEFT,0);
break;
case 2:
::SendMessage(m_hWnd,WM_KEYDOWN,VK_RIGHT,0);
break;
case 3:
::SendMessage(m_hWnd,WM_KEYDOWN,VK_UP,0);
break;
case 4:
::SendMessage(m_hWnd,WM_KEYDOWN,VK_DOWN,0);
break;
}
}
}
//消息的转换
BOOL CPuzzleDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
OnKeyDown((UINT)pMsg->wParam,(UINT)pMsg->lParam,(UINT)pMsg->lParam);
}
return CDialog::PreTranslateMessage(pMsg);
}
//处理上下左右键的消息和初始化时图的随机分布
void CPuzzleDlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
PICBLOCKPOSITION tempPos;
switch(nChar)
{
case VK_LEFT:
if(m_positionGameBK.xPos >1)
{
m_nGameStartedSteps+=1;
if(m_nGameStartedSteps>1000)
{
MessageBox("所定义数组空间已用完,你水平太臭了!","拼图游戏",MB_OK|MB_ICONINFORMATION);
CDialog::EndDialog(0);
}
m_nGameStepsArray[m_nGameStartedSteps] = 1;
tempPos.xPos = m_positionGameBK.xPos - 1;
tempPos.yPos = m_positionGameBK.yPos ;
m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].xPos = m_positionPicBlockInfo[tempPos.xPos][tempPos.yPos].xPos;
m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].yPos = m_positionPicBlockInfo[tempPos.xPos][tempPos.yPos].yPos;
tempPos.xPos = m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].xPos;
tempPos.yPos = m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].yPos;
OnPaintBlockPic(m_positionGameBK,tempPos);
m_positionGameBK.xPos = m_positionGameBK.xPos - 1;
OnSetGameBK();
OnSetLineToDivideUpPic();
if(m_nGameStartedSteps > 1)
{
if(m_nGameStepsArray[m_nGameStartedSteps - 1]== 2)
{
m_nGameStartedSteps = m_nGameStartedSteps - 2;
}
}
}
break;
case VK_RIGHT:
if(m_positionGameBK.xPos<m_nPicRowNum)
{
m_nGameStartedSteps+=1;
if(m_nGameStartedSteps>1000)
{
MessageBox("所定义数组空间已用完,你水平太臭了!","拼图游戏",MB_OK|MB_ICONINFORMATION);
CDialog::EndDialog(0);
}
m_nGameStepsArray[m_nGameStartedSteps]=2;
tempPos.xPos = m_positionGameBK.xPos+1;
tempPos.yPos = m_positionGameBK.yPos ;
m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].xPos = m_positionPicBlockInfo[tempPos.xPos][tempPos.yPos].xPos;
m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].yPos = m_positionPicBlockInfo[tempPos.xPos][tempPos.yPos].yPos;
tempPos.xPos = m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].xPos;
tempPos.yPos = m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].yPos;
OnPaintBlockPic(m_positionGameBK,tempPos);
m_positionGameBK.xPos = m_positionGameBK.xPos + 1;
OnSetGameBK();
OnSetLineToDivideUpPic();
if(m_nGameStartedSteps > 1)
{
if(m_nGameStepsArray[m_nGameStartedSteps - 1]== 1)
{
m_nGameStartedSteps = m_nGameStartedSteps - 2;
}
}
}
break;
case VK_UP:
if(m_positionGameBK.yPos>1)
{
m_nGameStartedSteps+=1;
if(m_nGameStartedSteps>1000)
{
MessageBox("所定义数组空间已用完,你水平太臭了!","拼图游戏",MB_OK|MB_ICONINFORMATION);
CDialog::EndDialog(0);
}
m_nGameStepsArray[m_nGameStartedSteps]=3;
tempPos.xPos = m_positionGameBK.xPos ;
tempPos.yPos = m_positionGameBK.yPos - 1;
m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].xPos = m_positionPicBlockInfo[tempPos.xPos][tempPos.yPos].xPos;
m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].yPos = m_positionPicBlockInfo[tempPos.xPos][tempPos.yPos].yPos;
tempPos.xPos = m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].xPos;
tempPos.yPos = m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].yPos;
OnPaintBlockPic(m_positionGameBK,tempPos);
m_positionGameBK.yPos = m_positionGameBK.yPos - 1;
OnSetGameBK();
OnSetLineToDivideUpPic();
if(m_nGameStartedSteps > 1)
{
if(m_nGameStepsArray[m_nGameStartedSteps - 1]== 4)
{
m_nGameStartedSteps = m_nGameStartedSteps - 2;
}
}
}
break;
case VK_DOWN:
if(m_positionGameBK.yPos<m_nPicColNum)
{
m_nGameStartedSteps+=1;
if(m_nGameStartedSteps>1000)
{
MessageBox("所定义数组空间已用完,你水平太臭了!","拼图游戏",MB_OK|MB_ICONINFORMATION);
CDialog::EndDialog(0);
}
m_nGameStepsArray[m_nGameStartedSteps]=4;
tempPos.xPos = m_positionGameBK.xPos ;
tempPos.yPos = m_positionGameBK.yPos +1;
m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].xPos = m_positionPicBlockInfo[tempPos.xPos][tempPos.yPos].xPos;
m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].yPos = m_positionPicBlockInfo[tempPos.xPos][tempPos.yPos].yPos;
tempPos.xPos = m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].xPos;
tempPos.yPos = m_positionPicBlockInfo[m_positionGameBK.xPos][m_positionGameBK.yPos].yPos;
OnPaintBlockPic(m_positionGameBK,tempPos);
m_positionGameBK.yPos = m_positionGameBK.yPos + 1;
OnSetGameBK();
OnSetLineToDivideUpPic();
if(m_nGameStartedSteps > 1)
{
if(m_nGameStepsArray[m_nGameStartedSteps - 1]== 3)
{
m_nGameStartedSteps = m_nGameStartedSteps - 2;
}
}
}
break;
}
CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CPuzzleDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
PICBLOCKPOSITION mousePos;
mousePos.xPos =point.x/m_nPicBlockWidth+1;
mousePos.yPos =point.y/m_nPicBlockHeight+1;
if(abs(mousePos.xPos - m_positionGameBK.xPos )+abs(mousePos.yPos - m_positionGameBK.yPos )==1)
{
if(mousePos.xPos - m_positionGameBK.xPos == 1)
{
::SendMessage(m_hWnd,WM_KEYDOWN,VK_RIGHT,0);
}
if(mousePos.xPos - m_positionGameBK.xPos == -1)
{
::SendMessage(m_hWnd,WM_KEYDOWN,VK_LEFT,0);
}
if(mousePos.yPos - m_positionGameBK.yPos == 1)
{
::SendMessage(m_hWnd,WM_KEYDOWN,VK_DOWN,0);
}
if(mousePos.yPos - m_positionGameBK.yPos == -1)
{
::SendMessage(m_hWnd,WM_KEYDOWN,VK_UP,0);
}
}
IsWonTheGame(); //判断是否已赢得这局游戏
CDialog::OnLButtonDown(nFlags, point);
}
//判断是否已赢得这局游戏
void CPuzzleDlg::IsWonTheGame()
{
for(int i = 1;i<=m_nPicRowNum;i++)
{
for(int j = 1;j<=m_nPicColNum;j++)
{
if(i !=m_positionGameBK.xPos || j != m_positionGameBK.yPos)
if(m_positionPicBlockInfo[i][j].xPos !=i || m_positionPicBlockInfo[i][j].yPos !=j)
return;
}
}
OnPaintBlockPic(m_positionGameBK,m_positionGameBK);
OnSetLineToDivideUpPic();
MessageBox("恭喜你,你已赢得这局游戏,要重新开始,请单击 '新游戏' ","拼图游戏",MB_OK|MB_ICONINFORMATION);
m_nGameStartedSteps = 0;
return;
}
//选择图片一
void CPuzzleDlg::OnPic1()
{
m_nPicID=IDB_GAME_PIC1;
AfxGetApp()->WriteProfileInt(_T("游戏参数"),_T("PicID"),IDB_GAME_PIC1);
m_bitmap.Detach();
m_bitmap.LoadBitmap(m_nPicID);
OnNewgame();
}
//选择图片二
void CPuzzleDlg::OnPic2()
{
m_nPicID=IDB_GAME_PIC2;
AfxGetApp()->WriteProfileInt(_T("游戏参数"),_T("PicID"),IDB_GAME_PIC2);
m_bitmap.Detach();
m_bitmap.LoadBitmap(m_nPicID);
OnNewgame();
}
//选择图片三
void CPuzzleDlg::OnPic3()
{
m_nPicID=IDB_GAME_PIC3;
AfxGetApp()->WriteProfileInt(_T("游戏参数"),_T("PicID"),IDB_GAME_PIC3);
m_bitmap.Detach();
m_bitmap.LoadBitmap(m_nPicID);
OnNewgame();
}
//退出程序
void CPuzzleDlg::OnExit()
{
CDialog::EndDialog(0);
}
//防止按Enter键后程序退出
void CPuzzleDlg::OnOK()
{
}
//防止按ESC键后程序退出
void CPuzzleDlg::OnCancel()
{
}
void CPuzzleDlg::OnClose()
{
CDialog::EndDialog(0);
}
//打开设置对话框
void CPuzzleDlg::OnSetting()
{
CSettingDlg dlg;
if(dlg.DoModal()==IDOK)
{
m_nPicRowNum=dlg.m_nRowNum;
m_nPicColNum=dlg.m_nColNum;
CPuzzleDlg::OnNewgame();
}
}
//自动拼图
void CPuzzleDlg::OnAutopuzzle()
{
m_nAutoPlayStartedSteps=m_nGameStartedSteps;
HMENU hmenu;
hmenu=::GetSubMenu(::GetMenu(m_hWnd),0);
if(m_bAutoPlay==FALSE)
{
if(m_nAutoPlayStartedSteps>0)
{
m_wndStatusBar.SetText("正在自动拼图",0,0);
m_bAutoPlay=TRUE;
::ModifyMenu(hmenu,1,MF_BYPOSITION|MF_STRING,::GetMenuItemID(hmenu,1),"停止自动拼图(&R)");
SetTimer(IDC_TIMER,300,NULL);
}
}
else
{
m_bAutoPlay=FALSE;
KillTimer(IDC_TIMER);
::ModifyMenu(hmenu,1,MF_BYPOSITION|MF_STRING,::GetMenuItemID(hmenu,1),"自动拼图(&A)");
m_wndStatusBar.SetText("正在游戏",0,0);
}
}
void CPuzzleDlg::OnTimer(UINT nIDEvent)
{
switch(m_nGameStepsArray[m_nAutoPlayStartedSteps])
{
case 1:
::SendMessage(m_hWnd,WM_KEYDOWN,VK_RIGHT,0);
break;
case 2:
::SendMessage(m_hWnd,WM_KEYDOWN,VK_LEFT,0);
break;
case 3:
::SendMessage(m_hWnd,WM_KEYDOWN,VK_DOWN,0);
break;
case 4:
::SendMessage(m_hWnd,WM_KEYDOWN,VK_UP,0);
break;
}
m_nAutoPlayStartedSteps-=1;
if(m_nAutoPlayStartedSteps==0)
{
KillTimer(IDC_TIMER);
OnPaintBlockPic(m_positionGameBK,m_positionGameBK);
m_bAutoPlay=FALSE;
MessageBox("自动拼图已完成!","拼图游戏",MB_OK|MB_ICONINFORMATION);
HMENU hmenu;
hmenu=::GetSubMenu(::GetMenu(m_hWnd),0);
::ModifyMenu(hmenu,1,MF_BYPOSITION|MF_STRING,::GetMenuItemID(hmenu,1),"自动拼图(&A)");
m_wndStatusBar.SetText("正在游戏",0,0);
}
CDialog::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -