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

📄 puzzledlg.cpp

📁 拼图游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -