📄 xue24diandlg.cpp
字号:
{
// 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 + -