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

📄 dot04_02dlg.cpp

📁 实现24点游戏的功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{	
pCmdUI->SetCheck(over10==1);	
}

void CDot04_02Dlg::OnBelow10() 
{
over10=0;
}

void CDot04_02Dlg::OnUpdateBelow10(CCmdUI* pCmdUI) 
{
pCmdUI->SetCheck(over10==0);	
}

int CDot04_02Dlg::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;
}
float CDot04_02Dlg::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;
}

CString CDot04_02Dlg::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;
}

void CDot04_02Dlg::OnPai1() 
{	if(stop==0)
{   if(over10==0)
{if(t1>=10) t1=t1-3;}
	CString s;
    s.Format("%d",t1);
	m_input=m_input+s;
    UpdateData(false);
}
}

void CDot04_02Dlg::OnPai2() 
{	if(stop==0)
{	if(over10==0){if(t2>=10) t2=t2-3;}
	CString s;
    s.Format("%d",t2);
    m_input=m_input+s;
    UpdateData(false);}	
}

void CDot04_02Dlg::OnPai3() 
{	if(stop==0)
{   if(over10==0){if(t3>=10) t3=t3-3;}
	CString s;
    s.Format("%d",t3);
    m_input=m_input+s;
    UpdateData(false);	
}}

void CDot04_02Dlg::OnPai4() 
{	if(stop==0)
{   if(over10==0){if(t4>=10) t4=t4-3;}
	CString s;
    s.Format("%d",t4);
    m_input=m_input+s;
    UpdateData(false);	
}}

//定位最后一个算术符号的位置
int CDot04_02Dlg::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;
}

//定位最先一个算术符号的位置
int CDot04_02Dlg::AnyFirstPos(CString Str)
{
 int SubPos=Str.Find('-')+1;
 int PluPos=Str.Find('+')+1;
 int MulPos=Str.Find('*')+1;
 int DivPos=Str.Find('/')+1;
 int ForPos=Str.Find('^')+1;
 int Pos=200;

 if(SubPos==0) //如果没有-号
   SubPos=200; //将SubPos设置成一个不可能的值
 if(PluPos==0) //如果没有-号
   PluPos=200; //将PluPos设置成一个不可能的值
 if(MulPos==0) //如果没有-号
   MulPos=200; //将MulPos设置成一个不可能的值
 if(DivPos==0) //如果没有-号
   DivPos=200; //将DivPos设置成一个不可能的值
 if(ForPos==0) //如果没有-号
   ForPos=200; //将ForPos设置成一个不可能的值

 if(Pos>SubPos)
   Pos=SubPos;
 if(Pos>PluPos)
   Pos=PluPos;
 if(Pos>MulPos)
   Pos=MulPos;
 if(Pos>DivPos)
   Pos=DivPos;
 if(Pos>ForPos)
   Pos=ForPos;
 return Pos;
}

//判断最先出现的符号是+号、-号、*号还是/号
char CDot04_02Dlg::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;
}

//此计算用于计算不带()号的乘方、加、减、乘、除运算
int CDot04_02Dlg::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 CDot04_02Dlg::TotalCompute(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 CDot04_02Dlg::Onzanting() 
{ 
stop=1;
KillTimer(1);
}

void CDot04_02Dlg::Onjixu() 
{
stop=0;	
SetTimer(1,900,NULL);
}

void CDot04_02Dlg::Onfapai() 
{
	if(stop==0)
	{
    m_lunshu++;
	if(m_lunshu>=14)
	{m_jushu++;
	 m_lunshu=1;	}

        i=rand()%13;
        j=rand()%13;
        k=rand()%13;
        l=rand()%13;
		t1=i+1;
		t2=j+1;
		t3=k+1;
		t4=l+1;
		if(over10==0) 
		{if((i+1)>=10) i-=3;
		if((j+1)>=10) j-=3;
		if((k+1)>=10) k-=3;
		if((l+1)>=10) l-=3;}

	m_button[1]->SetBitmap(HBITMAP(card1[i]));
	m_button[2]->SetBitmap(HBITMAP(card2[j]));
	m_button[3]->SetBitmap(HBITMAP(card3[k]));
	m_button[4]->SetBitmap(HBITMAP(card4[l]));
	m_jf--;
	m_js++;
	SetTimer(1,900,NULL);
    m_LIST = _T("");
		m_input = _T("");
	CListBox *p;
	p=(CListBox *)GetDlgItem(IDC_LIST2);
    p->ResetContent();
    UpdateData(false);	}
}

void CDot04_02Dlg::Onbj() 
{
	back gg;
	if(gg.DoModal()==IDOK){
		m_button[0]->SetBitmap(HBITMAP(bj[gg.ghback]));}
}

void CDot04_02Dlg::OnChangeEdit1() 
{UpdateData(true);
UpdateData(false);
	// send this notification unless you override the CDialog::OnInitDialog()
	// function and call CRichEditCtrl().SetEventMask()
	// with the ENM_CHANGE flag ORed into the mask.	
}

void CDot04_02Dlg::OnAbout() 
{
	CAboutDlg d;
	d.DoModal();
}

void CDot04_02Dlg::OnNandu() 
{

}

void CDot04_02Dlg::OnAboutgame() 
{
     CHp e;
	 e.DoModal();
}

⌨️ 快捷键说明

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