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

📄 24diandlg.cpp

📁 24点游戏,用c++实现
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		
	}
	SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
	
}

void CMy24DianDlg::OnButtonNoAnswer() 
{
	// TODO: Add your control notification handler code here
	if(m_strAnswerList=="无解!")
	{
		MessageBox("正确!","信息",MB_ICONINFORMATION);
		return;
	}
	if(!m_strAnswerList.IsEmpty())
	{
		MessageBox("不正确!\n本题目有解!","信息",MB_ICONINFORMATION);
		return;
	}

	UpdateData();	

	CString strNum[4];
	strNum[0]=m_strNum1;
	strNum[1]=m_strNum2;
	strNum[2]=m_strNum3;
	strNum[3]=m_strNum4;

	m_ctlEditAnswer.GetWindowText(m_strAnswer);

	if(m_bIsEnter)
	{
		for(int i=0; i<4; i++)
			m_dNum[i]=atof(strNum[i]);
	}

	SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));

	CExpression expression(m_dNum[0],m_dNum[1],m_dNum[2],m_dNum[3],atof(m_strResult));	
	if(!expression.ScanNum())
	{
		m_strAnswerList="无解!";

		MessageBox("正确!","信息",MB_ICONINFORMATION);
	}
	else
	{
		m_strAnswerList="参考答案:\r\n";
		m_strAnswerList+=expression.GetExpression();
		m_strAnswerList.Replace("*","×");
		m_strAnswerList.Replace("/","÷");

		MessageBox("不正确!\n本题目有解!","信息",MB_ICONINFORMATION);
	}

	SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
		
}

void CMy24DianDlg::OnButtonNextAnswer() 
{
	// TODO: Add your control notification handler code here
	if(!m_strAnswerList.IsEmpty())
	{
		if(m_strAnswerList=="无解!")
		{
			m_ctlEditAnswerList.SetWindowText(m_strAnswerList);
			return;
		}

		CString strShowAnswer;
		int nPos=0;
		for(int i=0; i<m_nAnswerIndex+2; i++)
		{
			nPos=m_strAnswerList.Find('\n',nPos+1);
			if(nPos==-1)
			{
				strShowAnswer=m_strAnswerList;
				m_ctlEditAnswerList.SetWindowText(m_strAnswerList);
				m_ctlEditAnswerList.SetSel(m_strAnswerList.GetLength(), m_strAnswerList.GetLength());
				MessageBox("所有参考答案都已列出!","信息",MB_ICONINFORMATION);
				return;
			}

		}
		strShowAnswer=m_strAnswerList.Left(nPos+1);
		m_nAnswerIndex++;
		m_ctlEditAnswerList.SetWindowText(strShowAnswer);
		m_ctlEditAnswerList.SetSel(strShowAnswer.GetLength(),strShowAnswer.GetLength());
		return;
	}

	UpdateData();	
	CString strNum[4];
	strNum[0]=m_strNum1;
	strNum[1]=m_strNum2;
	strNum[2]=m_strNum3;
	strNum[3]=m_strNum4;

	if(m_bIsEnter)
	{
		for(int i=0; i<4; i++)
			m_dNum[i]=atof(strNum[i]);
	}

	SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));

	CExpression expression(m_dNum[0],m_dNum[1],m_dNum[2],m_dNum[3],atof(m_strResult));	
	if(expression.ScanNum())
	{
		m_strAnswerList="参考答案:\r\n";
		m_strAnswerList+=expression.GetExpression();
		m_strAnswerList.Replace("*","×");
		m_strAnswerList.Replace("/","÷");	

		CString strShowAnswer;
		int nPos=0;
		for(int i=0; i<2; i++)
		{
			nPos=m_strAnswerList.Find('\n',nPos+1);
			if(nPos==-1)
				break;

		}
		if(nPos==-1)
		{
			MessageBox("所有参考答案都已列出!","信息",MB_ICONINFORMATION);
			m_ctlEditAnswerList.SetWindowText(m_strAnswerList);
		}
		else
		{
			strShowAnswer=m_strAnswerList.Left(nPos+1);
			m_ctlEditAnswerList.SetWindowText(strShowAnswer);
		}
		m_nAnswerIndex++;
	}
	else
	{
		m_strAnswerList="无解!";
		m_ctlEditAnswerList.SetWindowText(m_strAnswerList);
	}

	SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
}

void CMy24DianDlg::OnButtonAllAnswer() 
{
	// TODO: Add your control notification handler code here
	m_nAnswerIndex=0;
	if(!m_strAnswerList.IsEmpty())
	{
		m_ctlEditAnswerList.SetWindowText(m_strAnswerList);
		return;
	}

	UpdateData();	
	CString strNum[4];
	strNum[0]=m_strNum1;
	strNum[1]=m_strNum2;
	strNum[2]=m_strNum3;
	strNum[3]=m_strNum4;

	if(m_bIsEnter)
	{
		for(int i=0; i<4; i++)
			m_dNum[i]=atof(strNum[i]);
	}

	SetCursor(AfxGetApp()->LoadStandardCursor(IDC_WAIT));

	CExpression expression(m_dNum[0],m_dNum[1],m_dNum[2],m_dNum[3],atof(m_strResult));	
	if(expression.ScanNum())
	{
		m_strAnswerList="参考答案:\r\n";
		m_strAnswerList+=expression.GetExpression();
		m_strAnswerList.Replace("*","×");
		m_strAnswerList.Replace("/","÷");		
	}
	else
	{
		m_strAnswerList="无解!";
	}

	m_ctlEditAnswerList.SetWindowText(m_strAnswerList);

	SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));

}
void CMy24DianDlg::OnUpdateEnterNum(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->SetCheck(m_bIsEnter);
}

void CMy24DianDlg::OnEnterNum() 
{
	// TODO: Add your command handler code here
	ShowEnterCtl(TRUE);
	m_nRestCount=0;
	m_bIsEnter=TRUE;

	m_strAnswerList="";
	m_nAnswerIndex=0;

	InitPos();

	for(int i=0; i<5; i++)
	{
		InvalidateRect(m_rcCardPos[i], FALSE);
	}
	
	InitCardInfo();
	InitEnterNum();

	SetButtonEnabled();

	m_bStart=TRUE;
	
}

void CMy24DianDlg::OnStart() 
{
	// TODO: Add your command handler code here

	ShowEnterCtl();

	m_bIsEnter=FALSE;
	if(!m_bmpCard[0].LoadFromFile("bmp\\-1-10.bmp"))
	{
		AfxMessageBox("Can not load \"-1-10.bmp\"!");
	}

	InitCardInfo();

	GetRand4();

	CRect rc;	
	CStatic*pStatic=(CStatic*)GetDlgItem(IDC_CARD);
	pStatic->GetWindowRect(rc);	
	ScreenToClient(rc);
	InvalidateRect(rc,FALSE);

	InvalidateRgn();

	SetButtonEnabled();

	m_bStart=TRUE;
}

void CMy24DianDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_bStart)
	{
		CRect rc;	
		CStatic*pStatic=(CStatic*)GetDlgItem(IDC_CARD);
		pStatic->GetWindowRect(rc);
		ScreenToClient(rc);
		if(!m_bIsEnter && rc.PtInRect(point))
			SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND));
		else
			SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));

		if(m_nCapturedCard>=0)
		{
			MoveCard(point, m_nCapturedCard);
		}

		if(m_nCapturedOp>=0)
		{
			MoveOp(point, m_nCapturedOp);
		}
	}

	
	CDialog::OnMouseMove(nFlags, point);
}

void CMy24DianDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_bStart)
	{
		CRect rc;	
		CStatic*pStatic=(CStatic*)GetDlgItem(IDC_CARD);
		pStatic->GetWindowRect(rc);
		ScreenToClient(rc);
		if(!m_bIsEnter && rc.PtInRect(point))
		{
			SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND));
			GetRand4();
		}
		else
			SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
		if(!m_bIsEnter && m_nRestCount<=0) 
		{
			if(!m_bmpCard[0].LoadFromFile("bmp\\-1-11.bmp"))
			{
				AfxMessageBox("Can not load \"-1-11.bmp\"!");
			}
			InvalidateRect(rc,FALSE);
		}

		m_nCapturedCard=CapturedCard(point);
		m_nCapturedOp=CapturedOp(point);
		m_ptDown=point;
	}

	CDialog::OnLButtonDown(nFlags, point);
}

void CMy24DianDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if(m_bStart)
	{
		if(m_nCapturedCard>=0)			
			Snap(m_nCapturedCard);
		if(m_nCapturedOp>=0)
			Snap(m_nCapturedOp);
		m_nCapturedCard=-1;
		m_nCapturedOp=-1;

		CRect rc;	
		CStatic*pStatic=(CStatic*)GetDlgItem(IDC_CARD);
		pStatic->GetWindowRect(rc);
		ScreenToClient(rc);
		if(m_bStart && !m_bIsEnter && rc.PtInRect(point))
			SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR_HAND));
		else
			SetCursor(AfxGetApp()->LoadStandardCursor(IDC_ARROW));
	}
	CDialog::OnLButtonUp(nFlags, point);
}

void CMy24DianDlg::ShowEnterCtl(BOOL bShow)
{
	if(bShow)
	{
		for(int i=0; i<4; i++)
		{
			CComboBox*pCombo=(CComboBox*)GetDlgItem(IDC_COMBO_NUM1+i);
			pCombo->ShowWindow(SW_SHOW);
		}
	}
	else
	{
		for(int i=0; i<4; i++)
		{
			CComboBox*pCombo=(CComboBox*)GetDlgItem(IDC_COMBO_NUM1+i);
			pCombo->ShowWindow(SW_HIDE);
		}
	}


}


void CMy24DianDlg::OnBackground() 
{
	// TODO: Add your command handler code here
	char BASED_CODE szFilter[] ="Bitmap Files (*.bmp)|*.bmp||"; //"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";
	CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter,NULL);
	if(dlg.DoModal()==IDOK)
	{
		if(!m_bmpBK.LoadFromFile(dlg.GetFileName()))
		{
			MessageBox("文件格式不对或不存在!","Stop",MB_ICONSTOP);
			return;
		}
		Invalidate(FALSE);
	}
}

CString CMy24DianDlg::IsRight(BOOL& bIsAgain)
{
//	UpdateData(TRUE);
	bIsAgain=TRUE;
	CString strAnswer=m_strAnswer;
	strAnswer.Replace("×", "*");
	strAnswer.Replace("÷", "/");
	if(strAnswer.IsEmpty())
	{
		MessageBox("不能为空!","信息",MB_ICONSTOP);
		SetAnswerEditFocus();
		return "FALSE";
	}
	CCalculate cal(strAnswer);
	if(!cal.IsValid())
	{
		MessageBox("表达式有错!","信息",MB_ICONSTOP);
		SetAnswerEditFocus();
		return "FALSE";
	}	
	int nNumCount=NumCount(strAnswer);
	if(nNumCount!=4) 
	{
		MessageBox("数字个数不对!","信息",MB_ICONSTOP);
		SetAnswerEditFocus();
		return "FALSE";
	}
	if(!ContainNum(strAnswer))
	{
		MessageBox("不是指定的四个数!","信息",MB_ICONSTOP);
		SetAnswerEditFocus();
		return "FALSE";
	}
	double dResult=cal.GetResult();
	if(dResult< atof(m_strResult)-0.001 || dResult>atof(m_strResult)+0.001)
	{
		bIsAgain=FALSE;
		SetAnswerEditFocus();
//		MessageBox("结果有错!","信息",MB_ICONSTOP);
		CString strWrongResult;
		strWrongResult.Format("%.2f", dResult);
		return strWrongResult;
	}
	return "";

}

int CMy24DianDlg::NumCount(const CString &strExp)
{
	int nCount=0;
	int len=strExp.GetLength();
	for(int i=0; i<len; i++)
	{
		if(isdigit(strExp[i]))
			nCount++;
		while(i<len && isdigit(strExp[i]))
			i++;

	}
	return nCount;
}

BOOL CMy24DianDlg::ContainNum(const CString &strExp)
{
	CString strNum;
	double num=0.0;
	int nPos=0;
	int len=strExp.GetLength();
	double tmpNum[4];
	BOOL bIsContain=FALSE;
	for(int n=0; n<4; n++)
		tmpNum[n]=m_dNum[n];
	for(int i=0; i<len; i++)
	{
		if(isdigit(strExp[i])) 
			nPos=i;
		else
			continue;
		while(i<len && isdigit(strExp[i]))
			i++;

		strNum=strExp.Mid(nPos,i-nPos);
		num=atof(strNum);
		bIsContain=FALSE;
		for(int j=0; j<4; j++)
		{
			if(num==tmpNum[j])
			{
				tmpNum[j]=-1.0;
				bIsContain=TRUE;
				break;
			}
		}
		if(!bIsContain)
			return FALSE;

	}
	return TRUE;

}

void CMy24DianDlg::SetAnswerEditFocus()
{
	CEdit*pEdit=(CEdit*)GetDlgItem(IDC_EDIT_ANSWER);
	pEdit->SetFocus();
}



void CMy24DianDlg::OnAbout() 
{
	// TODO: Add your command handler code here
	CAboutDlg dlg;
	dlg.DoModal();
}

void CMy24DianDlg::InitPos()
{
	CRect rc;
	for(int i=0; i<5; i++)
	{
		InvalidateRect(m_rcCardPos[i],FALSE);
		CStatic *pStatic=(CStatic*)GetDlgItem(IDC_CARD+i);
		pStatic->GetWindowRect(rc);
		ScreenToClient(rc);
		m_rcCardPos[i]=rc;
	}
	for(i=0; i<21; i++)
	{
		InvalidateRect(m_rcOpPos[i],FALSE);
		CStatic *pStatic=(CStatic*)GetDlgItem(IDC_OP_ADD+i/3);
		pStatic->GetWindowRect(rc);
		ScreenToClient(rc);
		m_rcOpPos[i]=rc;
		InvalidateRect(rc,FALSE);
	}
}

void CMy24DianDlg::InitExpPos()
{
	CRect rc;
	for(int i=0; i<9; i++)
	{
		CStatic *pStatic=(CStatic*)GetDlgItem(IDC_EXP_OP_0+i);
		pStatic->GetWindowRect(rc);
		ScreenToClient(rc);
		m_rcExpOpPos[i]=rc;
	}
	for(i=0; i<4; i++)
	{
		CStatic *pStatic=(CStatic*)GetDlgItem(IDC_EXP_CARD_0+i);
		pStatic->GetWindowRect(rc);
		ScreenToClient(rc);
		m_rcExpCardPos[i]=rc;
	}
}

void CMy24DianDlg::MoveCard(const CPoint& point, int nIndex)
{
	CRect rcRange;
	CStatic *pStatic=(CStatic*)GetDlgItem(IDC_STATIC_RANGE);
	pStatic->GetWindowRect(rcRange);
	ScreenToClient(rcRange);

	CRect tmpRC=m_rcCardPos[nIndex];
	tmpRC.OffsetRect(CPoint(point-m_ptDown));
	if(!rcRange.PtInRect(tmpRC.TopLeft())
		|| !rcRange.PtInRect(tmpRC.BottomRight()))
/*	if(!rcRange.PtInRect(point))*/
		return;

	InvalidateRect(&m_rcCardPos[nIndex],FALSE);	
	m_rcCardPos[nIndex]=tmpRC;
	InvalidateRect(&m_rcCardPos[nIndex],FALSE);	
	
	m_ptDown=point;

//	Snap(nIndex);
	
}

void CMy24DianDlg::MoveOp(const CPoint &point, int nIndex)
{
	CRect rcRange;
	CStatic *pStatic=(CStatic*)GetDlgItem(IDC_STATIC_RANGE);
	pStatic->GetWindowRect(rcRange);
	ScreenToClient(rcRange);

	CRect tmpRC=m_rcOpPos[nIndex];
	tmpRC.OffsetRect(CPoint(point-m_ptDown));

	if(!rcRange.PtInRect(tmpRC.TopLeft())
		|| !rcRange.PtInRect(tmpRC.BottomRight()))
/*	if(!rcRange.PtInRect(point))*/
		return;

	InvalidateRect(&m_rcOpPos[nIndex],FALSE);	
	m_rcOpPos[nIndex]=tmpRC;
	InvalidateRect(&m_rcOpPos[nIndex],FALSE);	

	m_ptDown=point;

//	Snap(nIndex);
}

int CMy24DianDlg::CapturedCard(const CPoint &point)
{
	for(int i=4; i>0; i--)
	{
		if(m_rcCardPos[i].PtInRect(point))
			return i;
	}
	return -1;
}

int CMy24DianDlg::CapturedOp(const CPoint &point)
{
	for(int i=20; i>=0; i--)
	{
		if(m_rcOpPos[i].PtInRect(point))
			return i;
	
	}
	return -1;
}


void CMy24DianDlg::Snap(int nIndex)
{
	if(m_nCapturedCard >= 0)
	{

⌨️ 快捷键说明

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