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

📄 xue24diandlg.cpp

📁 24点游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	// TODO: Add your control notification handler code here
		
	   	if (m_stop&&flag)
	{
	    kzjishi++;
    	if (kzjishi%2!=0)
		{
	    	KillTimer(1);
		}
        	m_stop=1;
	}
	
	
	
}

void CXue24dianDlg::OnJixu() 
{
	// TODO: Add your control notification handler code here
		if (m_stop&&flag)
	{
	    //kzjishi++;
    	//if (kzjishi%2!=0)
		//m_stop=1;
		//else
			//m_stop=0;
			//SetTimer(1,1000,NULL);
			if (m_stop==1)
	{
	    kzjishi++;
    	if (kzjishi%2==0)
		{
	    	SetTimer(1,1000,NULL);
		}
        	m_stop=0;
	}
		//KillTimer(1);
	}
	
}

char CXue24dianDlg::AnyFirstF(CString Str)
{
	int SubPos=Str.Find('-')+1;
 int PluPos=Str.Find('+')+1;
 int MulPos=Str.Find('*')+1;
 int DivPos=Str.Find('/')+1;

 if(SubPos==0)
   SubPos=200;
 if(PluPos==0)
   PluPos=200;
 if(MulPos==0)
   MulPos=200;
 if(DivPos==0)
   DivPos=200;

 char Result='-';
 int tempPos=SubPos;
 if(PluPos<tempPos)
   {
    Result='+';
    tempPos=PluPos;
   }
 if(MulPos<tempPos)
   {
    Result='*';
    tempPos=MulPos;
   }
 if(DivPos<tempPos)
   {
    Result='/';
    tempPos=DivPos;
   }

 return Result;
}

char CXue24dianDlg::AnyFirstPos(CString Str)
{
	int SubPos=Str.Find('-')+1;
 int PluPos=Str.Find('+')+1;
 int MulPos=Str.Find('*')+1;
 int DivPos=Str.Find('/')+1;

 if(SubPos==0)
   SubPos=200;
 if(PluPos==0)
   PluPos=200;
 if(MulPos==0)
   MulPos=200;
 if(DivPos==0)
   DivPos=200;

 char Result='-';
 int tempPos=SubPos;
 if(PluPos<tempPos)
   {
    Result='+';
    tempPos=PluPos;
   }
 if(MulPos<tempPos)
   {
    Result='*';
    tempPos=MulPos;
   }
 if(DivPos<tempPos)
   {
    Result='/';
    tempPos=DivPos;
   }

 return Result;
}

char CXue24dianDlg::AnyLastPos(CString Str)
{
	int SubPos=Str.ReverseFind('-')+1;
	int PluPos=Str.ReverseFind('+')+1;
	 int MulPos=Str.ReverseFind('*')+1;
	int DivPos=Str.ReverseFind('/')+1;
	int Pos=SubPos;
	if(Pos<PluPos)
		Pos=PluPos;
	if(Pos<MulPos)
		Pos=MulPos;
	if(Pos<DivPos)
		Pos=DivPos;
 return Pos;
}

CString CXue24dianDlg::compu(int i1, int i2, int i3, int i4)
{
	CString s;
	int i,j,k,l;
	float a[4];
	a[0]=(float)i1;
	a[1]=(float)i2;
	a[2]=(float)i3;
	a[3]=(float)i4;
	for (i=0;i<4;i++)
		for (j=0;j<4;j++)
			for (k=0;k<4;k++)
				for (l=0;l<4;l++)
					if (i!=j&&i!=k&&j!=k&&i!=l&&j!=l&&k!=l) 
						if (compu1(a[i],a[j],a[k],a[l],s)) 
							return s;
	s.Format("%d,%d,%d,%d 无解",i1,i2,i3,i4);
	return s;

}

float CXue24dianDlg::compu3(float i1, float i2, int i)
{switch(i)
	{
	case 0:
		return i1+i2;
	case 1:
		return i1-i2;
	case 2:
		return i1*i2;
	case 3:
		if (i2>0.0001||i2<-0.0001) return i1/i2;
		else return 9999.9;
	}
	return 9999.9;

}

int CXue24dianDlg::compu1(float i1, float i2, float i3, float i4, CString &s)
{
	char op[4][6]={"+","-","*","/"};
	int i,j,k;
	float f;
	for(i=0;i<4;i++)
		for (j=0;j<4;j++)
			for (k=0;k<4;k++)
			{
					f =compu3(compu3(compu3(i1,i2,i),i3,j),i4,k);
					if (f>23.9999&&f<24.0001)
					{
						s.Format("((%2d %s %2d) %s %2d) %s %2d=24",(int)i1,op[i],(int)i2,op[j],(int)i3,op[k],(int)i4); 
						return 1;
					}
					f =compu3(compu3(i1,i2,i),compu3(i3,i4,k),j);
					if (f>23.9999&&f<24.0001)
					{
						s.Format("(%2d %s %2d) %s (%2d %s %2d)=24",(int)i1,op[i],(int)i2,op[j],(int)i3,op[k],(int)i4); 
						return 1;
					}
					f =compu3(compu3(i1,compu3(i2,i3,j),i),i4,k);
					if (f>23.9999&&f<24.0001)
					{
						s.Format("(%2d %s (%2d %s %2d)) %s %2d=24",(int)i1,op[i],(int)i2,op[j],(int)i3,op[k],(int)i4); 
						return 1;
					}
					f =compu3(i1,compu3(compu3(i2,i3,j),i4,k),i);
					if (f>23.9999&&f<24.0001)
					{
						s.Format("%2d %s ((%2d %s %2d) %s %2d)=24",(int)i1,op[i],(int)i2,op[j],(int)i3,op[k],(int)i4); 
						return 1;
					}
					f =compu3(i1,compu3(i2,compu3(i3,i4,k),j),i);
					if (f>23.9999&&f<24.0001)
					{
						s.Format("%2d %s (%2d %s (%2d %s %2d))=24",(int)i1,op[i],(int)i2,op[j],(int)i3,op[k],(int)i4); 
						return 1;
					}
			}
			return 0;
}



int CXue24dianDlg::SubCompute(CString Str)
{
	CString Middle="";
 CString Mul2="";
 CString Right="";

 //定位第一个^号位置 ,计算乘方
 int First=Str.Find("^")+1;
 if(First) //循环计算乘方
   {
     CString tempStr=Str.Mid(0,First-1);
    int        temp=AnyLastPos(tempStr);
    CString Left=Str.Mid(0,temp);
    CString Mul1 =Str.Mid(temp,First-temp-1);
    tempStr=Str.Mid(First,Str.GetLength()-First);
    temp=AnyFirstPos(tempStr);
    if(temp==200)
     {
      Mul2=tempStr;
      Right="";
     }
    else
     {
      Mul2 =tempStr.Mid(0,temp-1);
      Right=tempStr.Mid(temp-1,tempStr.GetLength()-temp+1);
     }
    Middle.Format("%d",(int)(pow(atof(Mul1),atof(Mul2))));
    Str=Left+Middle+Right;

    First=Str.Find("^")+1;
   }

 //定位第一个*号或/号的位置
 int MulPos=Str.Find('*')+1;
 int DivPos=Str.Find('/')+1;
 First=MulPos;
 if(MulPos>DivPos)
   First=DivPos;
 if(DivPos==0  && MulPos!=0)
   {
    First=MulPos;
    DivPos=2000; // 将除号所在位置设置成一个大于MulPos但又不可能的值
   }
 if(DivPos!=0  && MulPos==0)
   {
    First=DivPos; // 将乘号所在位置设置成一个大于DivPos但不可能的值
    MulPos=2000;
   }
 while(First) //循环计算乘、除
   {
    CString tempStr=Str.Mid(0,First-1);
    int        temp=AnyLastPos(tempStr);
    CString Left=Str.Mid(0,temp);
    CString Mul1 =Str.Mid(temp,First-temp-1);
    tempStr=Str.Mid(First,Str.GetLength()-First);
    temp=AnyFirstPos(tempStr);
    if(temp==200)
     {
      Mul2=tempStr;
      Right="";
     }
    else
     {
      Mul2 =tempStr.Mid(0,temp-1);
      Right=tempStr.Mid(temp-1,tempStr.GetLength()-temp+1);
     }
    if(MulPos>DivPos)
       Middle.Format("%d",(int)(strtod(Mul1.GetBuffer(Mul1.GetLength()),&stopstring)/strtod(Mul2.GetBuffer(Mul2.GetLength()),&stopstring)));
    else
	   Middle.Format("%d",(int)(strtod(Mul1.GetBuffer(Mul1.GetLength()),&stopstring)*strtod(Mul2.GetBuffer(Mul2.GetLength()),&stopstring)));

    Str=Left+Middle+Right;

    MulPos=Str.Find('*')+1;
    DivPos=Str.Find('/')+1;
    First=MulPos;
    if(MulPos>DivPos)
       First=DivPos;

    if(DivPos==0  && MulPos!=0)
      {
       First=MulPos;
       DivPos=2000; // 将除号所在位置设置成一个大于MulPos但又不可能的值
      }
    if(DivPos!=0  && MulPos==0)
      {
       First=DivPos; // 将乘号所在位置设置成一个大于DivPos但不可能的值
       MulPos=2000;
      }
   }

 //定位+、-号首先出现的位置
 First=AnyFirstPos(Str);
 if(First==200)//如果没有+、-号,则可以直接返回结果
   return (int)strtod(Str.GetBuffer(Str.GetLength()),&stopstring);
 char Fuhao=AnyFirstF(Str); //确定首先出现的符号是+号还是-号
 while(First)
   {//如果找到+号或-号
     CString tempStr=Str.Mid(0,First-1);
     int        temp=AnyLastPos(tempStr);
     CString Left=Str.Mid(0,temp);
     CString Mul1 =Str.Mid(temp,First-temp-1);
     tempStr=Str.Mid(First,Str.GetLength()-First);
     temp=AnyFirstPos(tempStr);
     if(temp==200)
       {
        Mul2=tempStr;
        Right="";
       }
     else
       {
        Mul2 =tempStr.Mid(0,temp-1);
        Right=tempStr.Mid(temp-1,tempStr.GetLength()-temp+1);
       }
     if(Fuhao=='+')
       Middle.Format("%d",(int)(strtod(Mul1.GetBuffer(Mul1.GetLength()),&stopstring)+strtod(Mul2.GetBuffer(Mul2.GetLength()),&stopstring)));
     else
       Middle.Format("%d",(int)(strtod(Mul1.GetBuffer(Mul2.GetLength()),&stopstring)-strtod(Mul2.GetBuffer(Mul2.GetLength()),&stopstring)));
     Str=Left+Middle+Right;
     First=AnyFirstPos(Str);
     if(First==200)
       break;
     Fuhao=AnyFirstF(Str);
   }

 return (int)strtod(Middle.GetBuffer(Middle.GetLength()),&stopstring);
}

int CXue24dianDlg::ZHCompute(CString Str)
{
int First=Str.ReverseFind('(')+1; //定位最后一个(号位置
  while(First)
{
    CString SubStr =Str.Mid(First,(Str.GetLength()-First));
    int Last= SubStr.Find(')')+1;
    Last+=First;  //定位最后一个(号以后的最开始的)号位置
    CString LeftStr=Str.Mid(0,First-1); //(号左边的字符串
  CString Middle =Str.Mid(First,Last-First-1); //()号中间的字符串
  CString Right  =Str.Mid(Last,Str.GetLength()-Last); //)号右边的字符串
    int Result=SubCompute(Middle);  //进入下面的计算
  Middle.Format("%d",Result);

  Str=LeftStr+Middle+Right;
  First=Str.ReverseFind('(')+1;
  }

  int Result=SubCompute(Str);
  return Result;


}

void CXue24dianDlg::OnTjdaan() 
{
	// TODO: Add your control notification handler code here
	if (!flag)
{UpdateData(true);
	
		KillTimer(1);
		CString s,s1,s2;
   s=compu(t1,t2,t3,t4);
	s1=compu(t3,t2,t1,t4);//四张牌的计算
    s2=compu(t4,t2,t1,t3);
		
 

//n=	ZHCompute(m_Input);


  if(n==24)
  {  
	  m_defen=m_defen+10;
	 
     MessageBox("正确,奖励10分,请继续!");
     CListBox *p;
     p=(CListBox *)GetDlgItem(IDC_XIANSHIDAAN);//把答案放到列表上
     p->AddString(s);
     p->AddString(s1);
     p->AddString(s2);
	
  }
  
     
   else
   {
	   MessageBox("错误!先扣掉5分,请看答案!"); 
	   m_defen=m_defen-5;
        CListBox *p;
       p=(CListBox *)GetDlgItem(IDC_XIANSHIDAAN);//把答案放到列表上
       p->AddString(s);
       p->AddString(s1);
       p->AddString(s2);
   }


}
	else
		MessageBox("请先开始游戏!");
	UpdateData(false);
}

void CXue24dianDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if (m_shijian>0)	
   {	
	  m_shijian--;
	   //OnPaint();
	  //Invalidate();
   }
   else
   {
       m_defen=m_defen-5;
	   KillTimer(1);
	MessageBox("对不起时间到,扣掉5分,请努力!");
    
   }
   UpdateData(false);

	CDialog::OnTimer(nIDEvent);
}

void CXue24dianDlg::OnPukepai1() 
{
	// TODO: Add your control notification handler code here
		UpdateData(true);
	if (!flag)
		{
	      	CString s;
          s.Format("%d",t1);//把整形数字转换为字符型
      m_Input=m_Input+s;//放到input数组中	
      UpdateData(false);
		}
	
}

void CXue24dianDlg::OnPukepai2() 
{
	// TODO: Add your control notification handler code here
		UpdateData(true);
	if (!flag)
		{
	      	CString s;
          s.Format("%d",t2);//把整形数字转换为字符型
      m_Input=m_Input+s;//放到input数组中	
      UpdateData(false);
		}
	
}

void CXue24dianDlg::OnPukepai3() 
{
	// TODO: Add your control notification handler code here
		UpdateData(true);
	if (!flag)
		{
	      	CString s;
          s.Format("%d",t3);//把整形数字转换为字符型
      m_Input=m_Input+s;//放到input数组中	
      UpdateData(false);
		}
	
}

void CXue24dianDlg::OnPukepai4() 
{
	// TODO: Add your control notification handler code here
		UpdateData(true);
	if (!flag)
		{
	      	CString s;
          s.Format("%d",t4);//把整形数字转换为字符型
      m_Input=m_Input+s;//放到input数组中	
      UpdateData(false);
		}
	
}

⌨️ 快捷键说明

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