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

📄 24pointsdlg.cpp

📁 简单的游戏24点
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		rect.right=m_SymbolRect[m_index].right+1;
		rect.top=m_SymbolRect[m_index].top;
		rect.bottom=m_SymbolRect[m_index].bottom+1;
		if(symPreRect!=rect)
		{
			if(!symPreRect.IsRectEmpty())
				InvalidateRect(symPreRect);
			InvalidateRect(rect);
			symPreRect=rect;
		}
	}
	else if(!symPreRect.IsRectEmpty())
	{
		InvalidateRect(symPreRect);
		symPreRect.SetRectEmpty();
	}
	if(!m_mouseDown)
	{//鼠标进入那个对象区域
		CRect tmpRect(0,0,0,0);
		for(i=1;i<m_objArray.GetSize();i++)
		{
			node*p=(node*)m_objArray.GetAt(i);
			if(p->m_rect.PtInRect(point))
			{
				p->m_mouse_in=1;
				tmpRect.left=p->m_rect.left-1;
				tmpRect.top=p->m_rect.top-1;
				tmpRect.right=p->rc.right +1;
				tmpRect.bottom=p->m_rect.bottom+1;
			}
			else
				p->m_mouse_in=0;
		}
		if(objPreRect!=tmpRect)
		{
			if(!objPreRect.IsRectEmpty())
				InvalidateRect(objPreRect);
			if(!tmpRect.IsRectEmpty())
				InvalidateRect(tmpRect);
			objPreRect=tmpRect;
		}
	}
	if(m_mouseDown)
	{
		::SetCursor(m_HCursor);
		int i;
		for(i=0;i<m_objArray.GetSize();i++)
		{
			node*p=(node*)m_objArray.GetAt(i);
			CRect rect=p->m_rect;
			rect+=CSize(5,0);
			if(rect.PtInRect(point)&&strGot.GetLength())
				p->m_hit=1;
			else
				p->m_hit=0;
		}
		if(strGot.GetLength()||m_index<6)
		{
			CRect rect=GetFormulaRect();
			if(rect.PtInRect(point))
				InvalidateRect(rect);
		}
	}
	CDialog::OnMouseMove(nFlags, point);
}

void CMy24pointsDlg::OnLButtonUp(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CClientDC dc(this);
	m_mouseDown=FALSE;
	m_HCursor=AfxGetApp()->LoadStandardCursor(IDC_ARROW);
	if(strGot.GetLength())
	{
		node*p=new node;
		strcpy(p->m_str,strGot.GetBuffer(strGot.GetLength()));
		if(!Add(p,point))
		{
			delete p;
			cards.m_index_set.erase(m_card_index);
		}
		else if(m_card_index>-1)
		{
			cards.m_index_set.insert(m_card_index);
			p->oriIndex=m_card_index;
		}
	}
	if(!symPreRect.IsRectEmpty())
		InvalidateRect(symPreRect);
	cards.Draw(&dc,m_TLP,m_shuffle);
	InvalidateRect(CRect(10,150,230,180));
	CDialog::OnLButtonUp(nFlags, point);
}

void CMy24pointsDlg::DrawSyms(CDC *pDC)
{
	CBitmap bitmap;
	CDC memDC;
	CBitmap*oldBitmap;
	int bmWidth=30,bmHeight=30;
	bitmap.LoadBitmap(IDB_ADD);
	memDC.CreateCompatibleDC(pDC);
	oldBitmap=memDC.SelectObject(&bitmap);
	memDC.BitBlt(0,0,bmWidth,bmHeight,&memDC,0,0,SRCCOPY);
	pDC->BitBlt(m_SymbolRect[0].left,m_SymbolRect[0].top,bmWidth,bmHeight,&memDC,0,0,SRCAND);
	bitmap.DeleteObject();
	int i=0;
	for(i=1;i<6;i++)
	{
		bitmap.LoadBitmap(IDB_ADD+i);
		memDC.SelectObject(&bitmap);
		memDC.BitBlt(0,0,bmWidth,bmHeight,&memDC,0,0,SRCCOPY);
		pDC->BitBlt(m_SymbolRect[i].left,m_SymbolRect[i].top,bmWidth,bmHeight,&memDC,0,0,SRCAND);
		bitmap.DeleteObject();
	}
	pDC->SelectObject(oldBitmap);
}

void CMy24pointsDlg::OnOK() 
{
	// TODO: Add extra validation here
	m_shuffle=TRUE;
	cards.m_index_set.clear();
	while(m_objArray.GetSize()>1)
	{
		node*p=(node*)m_objArray.GetAt(1);
		m_objArray.RemoveAt(1);
		delete p;
	}
	CStatic*pStatic=(CStatic*)GetDlgItem(IDC_STATIC_RESULT);
	pStatic->SetWindowText("");
	SetTimer(2,m_maxElapse,NULL);
	m_lapse=0;
	CButton*pbut=(CButton*)GetDlgItem(IDC_SHOE_EXPRESSION);
	pbut->EnableWindow();
	pbut=(CButton*)GetDlgItem(IDC_RE_DO);
	pbut->EnableWindow();
	pbut=(CButton*)GetDlgItem(IDC_SUBMIT);
	pbut->EnableWindow();			
	CClientDC dc(this);
	cards.Draw(&dc,m_TLP,m_shuffle);
	InvalidateRect(GetFormulaRect());
	m_operators=0;
}

void CMy24pointsDlg::DrawFormula(CDC *pDC, CPoint point)
{
	int i;
	node*p=(node*)m_objArray.GetAt(0);
	p->Draw(pDC);
	for(i=1;i<m_objArray.GetSize();i++)
	{
		node*pp=(node*)m_objArray.GetAt(i);
		pp->m_rect.left=p->m_rect.right;
		pp->Draw(pDC);
		p=pp;
	}
}

BOOL CMy24pointsDlg::Add(node *p, CPoint point,BOOL AtTail)
{
	if(hitNode&&hitNode->m_rect.PtInRect(point))
		return FALSE;
	BOOL bRet=FALSE;
	int i=0;
	int num=m_objArray.GetSize();
	node*pp=0;
	for(i=0;i<num;i++)
	{
		pp=(node*)m_objArray.GetAt(i);
		CRect rect=pp->m_rect;
		rect+=CSize(5,0);		
		if(rect.PtInRect(point))
		{
			pp->m_hit=0;
			break;
		}
	}
	if(pp&&i<num)
	{
		p->m_rect.left=pp->m_rect.right;
		p->m_rect.top=pp->m_rect.top;
		m_objArray.InsertAt(i+1,p);
		bRet=TRUE;
	}
	else if(AtTail)
	{
		m_objArray.Add(p);
		bRet=TRUE;
	}
	if(hitNode)
	{
		for(i=0;i<m_objArray.GetSize();i++)
		{
			if(hitNode==(node*)m_objArray.GetAt(i))
				break;
		}
		if(i<m_objArray.GetSize())
			m_objArray.RemoveAt(i);
		if(!bRet)
		{
			cards.m_index_set.erase(hitNode->oriIndex);
			if(IsOperator(hitNode->m_str[0]))
				m_operators--;
		}
		else
			p->oriIndex=hitNode->oriIndex;
		delete hitNode;
		hitNode=0;
	}
	else if(bRet&&IsOperator(p->m_str[0]))
		m_operators++;
	return bRet;
}

void CMy24pointsDlg::OnReDo() 
{
	// TODO: Add your control notification handler code here
	cards.m_index_set.clear();
	while(m_objArray.GetSize()>1)
	{
		node*p=(node*)m_objArray.GetAt(1);
		m_objArray.RemoveAt(1);
		delete p;
	}
	CStatic*pStatic=(CStatic*)GetDlgItem(IDC_STATIC_RESULT);
	pStatic->SetWindowText("");
	m_operators=0;
	Invalidate();
}

void CMy24pointsDlg::OnSubmit() 
{
	// TODO: Add your control notification handler code here
	CParse parse;
	char str[255]={0};
	int i;
	for(i=1;i<m_objArray.GetSize();i++)
	{
		node*p=(node*)m_objArray.GetAt(i);
		strcat(str,p->m_str);
	}	
	std::vector<char*> error_str;
	int num=parse.ExpressionReduce(str);
	parse.get_error_info(error_str);
	char result[255]={0};
	if(error_str.size())
	{
		std::vector<char*>::iterator it=error_str.begin();
		while(it!=error_str.end())
		{
			strcat(result,*it);
			it++;
		}
	}
	else 
		sprintf(result,"%s=%d",str,num);
	CStatic*pStatic=(CStatic*)GetDlgItem(IDC_STATIC_RESULT);
	pStatic->SetWindowText(result);
	if(num==24&&cards.m_index_set.size()==4&&m_operators==3)
		KillTimer(2);
}

void CMy24pointsDlg::OnShoeExpression() 
{
	// TODO: Add your control notification handler code here
	CString str;
	cards.GetResult(str);
	CStatic*pStatic=(CStatic*)GetDlgItem(IDC_STATIC_RESULT);
	pStatic->SetWindowText(str);
	SetTimer(1,200,NULL);
}

CRect CMy24pointsDlg::GetFormulaRect()
{
	CRect rect=((node*)m_objArray.GetAt(0))->rc;
//	int num=m_objArray.GetSize();
	rect.right+=200;//((node*)m_objArray.GetAt(num-1))->rc.right;
	return rect;
}

void CMy24pointsDlg::DrawProgress(CStatic *pStatic)
{
	CDC*pDC=pStatic->GetDC();
	CRect rect;
	pStatic->GetClientRect(&rect);
	double value=rect.Width();
	value/=60;
	CRect rc=rect;
	rc.right=rc.left+value*m_lapse;
	pDC->Rectangle(&rect);
	pDC->FillRect(rc,&CBrush(RGB(255,0,0)));
	pStatic->ReleaseDC(pDC);
}

void CMy24pointsDlg::OnCancel() 
{
/*	for(int i=0;i<m_objArray.GetSize();i++)
		delete (node*)m_objArray.GetAt(i);
	m_objArray.RemoveAll();*/
	CDialog::OnCancel();
}


CRect CMy24pointsDlg::GetCardsRect(int index)
{
	int width=71;
	CRect rect[4]={CRect(m_TLP.x,m_TLP.y,m_TLP.x+71,m_TLP.y+96),
		CRect(m_TLP.x+width+2,m_TLP.y,m_TLP.x+2*width+2,m_TLP.y+96),
		CRect(m_TLP.x+2*width+4,m_TLP.y,m_TLP.x+3*width+4,m_TLP.y+96),
		CRect(m_TLP.x+3*width+6,m_TLP.y,m_TLP.x+4*width+6,m_TLP.y+96)};
	if(index>=0&&index<4)
		return rect[index];
	else
		return CRect(0,0,0,0);
}

void CMy24pointsDlg::OnDestroy() 
{
	CDialog::OnDestroy();
	for(int i=0;i<m_objArray.GetSize();i++)
		delete (node*)m_objArray.GetAt(i);
	m_objArray.RemoveAll();
}

BOOL CMy24pointsDlg::IsOperator(char ch)
{
	BOOL bRet=(ch=='+');
	bRet|=(ch=='-');
	bRet|=(ch=='*');
	bRet|=(ch=='/');
	return bRet;
}


void CMy24pointsDlg::OnLButtonDblClk(UINT nFlags, CPoint point)
{
	// TODO: 在此添加消息处理程序代码和/或调用默认值
	m_card_index=-1;
	strGot="";
	int i;
	for(i=0;i<4;i++)
	{
		if(cards.m_index_set.find(i)!=cards.m_index_set.end())
			continue;
		if(GetCardsRect(i).PtInRect(point))
		{
			int num=cards.m_deck[cards.m_got_cards[i]].point-IDB_DIAMAND_02+1;
			if(num==13)
				num=0;
			strGot.Format("%d",num+1);
            node*p=new node;
			strcpy(p->m_str,strGot.GetBuffer(strGot.GetLength()));
			CRect rect=((node*)m_objArray.GetAt(m_objArray.GetSize()-1))->m_rect;
			p->m_rect.top=rect.top;
			p->m_rect.left=rect.right;
			p->oriIndex=i;
            m_objArray.Add(p);
			cards.m_index_set.insert(i);
			break;
		}
	}
	if(strGot.GetLength()==0)
	{
		for(i=0;i<6;i++)
		{
			if(m_SymbolRect[i].PtInRect(point))
			{
				char s[]="+-*/()";
				strGot.Insert(0,s[i]);
				node*p=new node;
				strcpy(p->m_str,strGot.GetBuffer(strGot.GetLength()));
				CRect rect=((node*)m_objArray.GetAt(m_objArray.GetSize()-1))->m_rect;
				p->m_rect.top=rect.top;
				p->m_rect.left=rect.right;
				m_objArray.Add(p);
				if(IsOperator(p->m_str[0]))
					m_operators++;
				break;
			}
		}
	}
	CDialog::OnLButtonDblClk(nFlags, point);
}

BOOL CAboutDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// TODO:  在此添加额外的初始化
	CStatic*p=new CStatic;
	p->Create("周云才设计",WS_CHILD|WS_VISIBLE,CRect(55,10,260,30),this);
	p->ShowWindow(SW_SHOW);
	return TRUE;  // return TRUE unless you set the focus to a control
	// 异常: OCX 属性页应返回 FALSE
}

⌨️ 快捷键说明

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