算24游戏测试

给定4个小于12的数
可能“no answer"
5秒后
输入1继续
2结束
用“n+m=k”的格式答题(请不要乱输入)
当显示“24 win!"说明正确
5秒后
输入1继续
2结束

#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int a[4]={},vis[4]={},n[4]={},a1[4]={},a2[4]={},f=0;
int q,w,m,q1,w1,m1,q2,w2,m2,t=0;
char x,y,x1,x2;
void v()
{
  for(int i=0;i<4;i++)
    if(a[i]==24) {f=1;
	break;}
}
void dfs(int t)
{
  if(t==1) {v();return;}
  if(t>1)
    for(int i=0;i<4;i++)
      if(a[i]==24) return;
  for(int i=0;i<4;i++)
    for(int j=0;j<4;j++)
      if(vis[j]==0&&a[i]>=a[j]&&i!=j)
      {
        a1[4-t]=a[i];
        a2[4-t]=a[j];
    a[i]=a[i]+a[j];
        vis[j]=1;
        n[4-t]=1;
        if(a[i]>0&&vis[i]==0) 
		dfs(t-1);
        vis[j]=0;
        a[i]-=a[j];
        a1[4-t]=a[i];
        a2[4-t]=a[j];
        a[i]=a[i]-a[j];
        vis[j]=1;
        n[4-t]=2;
        if(a[i]>0&&vis[i]==0) 
		dfs(t-1);
        vis[j]=0;
        a[i]+=a[j];
        a1[4-t]=a[i];
        a2[4-t]=a[j];
        a[i]=a[i]*a[j];
        vis[j]=1;
        n[4-t]=3;
        if(a[i]>0&&vis[i]==0) 
		dfs(t-1);
        vis[j]=0;
        a[i]/=a[j];
        if(a[i]%a[j]==0)
        {
          a1[4-t]=a[i];
          a2[4-t]=a[j];
          a[i]=a[i]/a[j];
          vis[j]=1;
          n[4-t]=4;
          if(a[i]>0&&vis[i]==0) 
		  dfs(t-1);
          vis[j]=0;
          a[i]*=a[j];
        }
      }
}
//判断输入合法性 
void check() {
    cin >> q >> x >> w >> y >> m;
    if ( (x == '+') && (q + w == m) && 
         ( (q == a[0]) || (q == a[1]) || (q == a[2]) || (q == a[3]) ) && 
         ( (w == a[0]) || (w == a[1]) || (w == a[2]) || (w == a[3]) ) && 
         (y == '=') ) {
    }
    else if ( (x == '-') && (q - w == m) && 
              ( (q == a[0]) || (q == a[1]) || (q == a[2]) || (q == a[3]) ) && 
              ( (w == a[0]) || (w == a[1]) || (w == a[2]) || (w == a[3]) ) && 
              (y == '=') ) {
    }
    else if ( (x == '*') && (q * w == m) && 
              ( (q == a[0]) || (q == a[1]) || (q == a[2]) || (q == a[3]) ) && 
              ( (w == a[0]) || (w == a[1]) || (w == a[2]) || (w == a[3]) ) && 
              (y == '=') ) {
    }
    else if ( (x == '/') && (q / w == m) && (q % m == 0) && 
              ( (q == a[0]) || (q == a[1]) || (q == a[2]) || (q == a[3]) ) && 
              ( (w == a[0]) || (w == a[1]) || (w == a[2]) || (w == a[3]) ) && 
              (y == '=') ) {
    }
    else {
        cout << "输入不合法,请重新输入" << endl;
        check();
    }
}
void checka() {
    cin >> q1 >> x1 >> w1 >> y >> m1;
    if ( (x1 == '+') && (q1 + w1 == m1) && 
         ( (q1 == a[0]) || (q1 == a[1]) || (q1 == a[2]) || (q1 == a[3]) || (q1 == m) ) && 
         ( (w1 == a[0]) || (w1 == a[1]) || (w1 == a[2]) || (w1 == a[3]) || (w1 == m) ) && 
         (y == '=') ) {
    }
    else if ( (x1 == '-') && (q1 - w1 == m1) && 
              ( (q1 == a[0]) || (q1 == a[1]) || (q1 == a[2]) || (q1 == a[3]) || (q1 == m) ) && 
              ( (w1 == a[0]) || (w1 == a[1]) || (w1 == a[2]) || (w1 == a[3]) || (w1 == m) ) && 
              (y == '=') ) {
    }
    else if ( (x1 == '*') && (q1 * w1 == m1) && 
              ( (q1 == a[0]) || (q1 == a[1]) || (q1 == a[2]) || (q1 == a[3]) || (q1 == m) ) && 
              ( (w1 == a[0]) || (w1 == a[1]) || (w1 == a[2]) || (w1 == a[3]) || (w1 == m) ) && 
              (y == '=') ) {
    }
    else if ( (x1 == '/') && (q1 / w1 == m1) && (q1 % m1 == 0) && 
              ( (q1 == a[0]) || (q1 == a[1]) || (q1 == a[2]) || (q1 == a[3]) || (q1 == m) ) && 
              ( (w1 == a[0]) || (w1 == a[1]) || (w1 == a[2]) || (w1 == a[3]) || (w1 == m) ) && 
              (y == '=') ) {
    }
    else {
        cout << "输入不合法,请重新输入" << endl;
        checka();
    }
}
void checkb() {
    cin >> q2 >> x2 >> w2 >> y >> m2;
    if ( (x2 == '+') && (q2 + w2 == m2&&m2==24) && 
         ( (q2 == a[0]) || (q2 == a[1]) || (q2 == a[2]) || (q2 == a[3]) || (q2 == m) || (q2==m1) ) && 
         ( (w2 == a[0]) || (w2 == a[1]) || (w2 == a[2]) || (w2 == a[3]) || (w2 == m) || (w2==m1) ) && 
         (y == '=') ) {
         	t++;
         	cout<<"24 win"<<'!'<<"\n"<<"2秒后刷新";
    }
    else if ( (x2 == '-') && (q2 - w2 == m2&&m2==24) && 
              ( (q2 == a[0]) || (q2 == a[1]) || (q2 == a[2]) || (q2 == a[3]) || (q2 == m) || (q2==m1) ) && 
              ( (w2 == a[0]) || (w2 == a[1]) || (w2 == a[2]) || (w2 == a[3]) || (w2 == m) || (w2==m1) ) && 
              (y == '=') ) {
              	t++;
              	cout<<"24 win"<<'!'<<"\n"<<"2秒后刷新";
    }
    else if ( (x2 == '*') && (q2 * w2 == m2&&m2==24) && 
              ( (q2 == a[0]) || (q2 == a[1]) || (q2 == a[2]) || (q2 == a[3]) || (q2 == m) || (q2==m1) ) && 
              ( (w2 == a[0]) || (w2 == a[1]) || (w2 == a[2]) || (w2 == a[3]) || (w2 == m) || (w2==m1) ) && 
              (y == '=') ) {
              	t++;
              	cout<<"24 win"<<'!'<<"\n"<<"2秒后刷新";
    }
    else if ( (x2 == '/') && (q2 / w2 == m2&&m2==24) && (q2 % m2 == 0) && 
              ( (q2 == a[0]) || (q2 == a[1]) || (q2 == a[2]) || (q2 == a[3]) || (q2 == m) || (q2==m1) ) && 
              ( (w2 == a[0]) || (w2 == a[1]) || (w2 == a[2]) || (w2 == a[3]) || (w2 == m) || (w2==m1) ) && 
              (y == '=') ) {
              	t++;
              	cout<<"24 win"<<'!'<<"\n"<<"2秒后刷新";
    }
    else {
        cout << "输入不合法,请重新输入" << endl;
        checkb();
    }
}
int main()
{
	char c='1';
while(c=='1'){
	//首先随机生成四个 1 到 12 之间的数字作为游戏可用的数字。
	srand(time(0));
    a[0] = rand() % 12 + 1;
    a[1] = rand() % 12 + 1;
    a[2] = rand() % 12 + 1;
    a[3] = rand() % 12 + 1;
 
    cout << "\n可用的四个数字:";
    cout << a[0] << "  " << a[1] <<"  "<<a[2]<<"  "<<a[3]<<"\n"; 
    cout << "\n积分" <<':'<<t<<"\n"; 
    //dfs判断是否可以算24。 
    dfs(4);
     if(a[0]==1&&a[1]==1&&a[2]==1&&a[3]==24||a[0]==1&&a[1]==1&&a[2]==24&&a[3]==1||a[0]==1&&a[1]==24&&a[2]==1&&a[3]==1||a[0]==24&&a[1]==1&&a[2]==1&&a[3]==1){
    	f=1;
	}
	if(f==0){
	cout<<"sorry no answer\n2秒后刷新";
	} 
	else{ check();
	if(q==a[0])a[0]=-12;
	else if(q==a[1])a[1]=-12;
	else if(q==a[2])a[2]=-12;
	else if(q==a[3])a[3]=-12;
	else if(w==a[0])a[0]=-12;
	else if(w==a[1])a[1]=-12;
	else if(w==a[2])a[2]=-12;
	else if(w==a[3])a[3]=-12;
	checka();
    if(q1==a[0])a[0]=-12;
	else if(q1==a[1])a[1]=-12;
	else if(q1==a[2])a[2]=-12;
	else if(q1==a[3])a[3]=-12;
	else if(q1==m)m=-12; 
	else if(w1==a[0])a[0]=-12;
	else if(w1==a[1])a[1]=-12;
	else if(w1==a[2])a[2]=-12;
	else if(w1==a[3])a[3]=-12;
	else if(w1==m)m=-12;
	checkb();
	}
	Sleep(2000);
	system("cls");
	cout << "积分" <<':'<<t; 
	if(t==2)cout<<"恭喜获得“算24小白”称号" ;
	if(t==5)cout<<"恭喜获得“算24萌新”称号";
	if(t==10)cout<<"恭喜获得“算24入门”称号"; 
	if(t==30)cout<<"恭喜获得“算24青铜”称号"; 
	if(t==40)cout<<"恭喜获得“算24白银”称号";
	if(t==70)cout<<"恭喜获得“算24黄金”称号";
	if(t==90)cout<<"恭喜获得“算24王者”称号"; 
	cout<<"\n继续请按1 \n结束请按2"; 
	cin>>c; 
	system("cls");
}
	  return 0;
}

请各位大佬帮忙评测一下
(发现bug给解决方案)!

@jhxs1326 你没有考虑数字不能重复用这件事

改一下(给个解决方案)

[quote=“余梓辰, post:1, topic:32165, username:jhxs1326”]

	else{ check();
	if(q==a[0])a[0]=-12;
	else if(q==a[1])a[1]=-12;
	else if(q==a[2])a[2]=-12;
	else if(q==a[3])a[3]=-12;
	else if(w==a[0])a[0]=-12;
	else if(w==a[1])a[1]=-12;
	else if(w==a[2])a[2]=-12;
	else if(w==a[3])a[3]=-12;
	checka();
    if(q1==a[0])a[0]=-12;
	else if(q1==a[1])a[1]=-12;
	else if(q1==a[2])a[2]=-12;
	else if(q1==a[3])a[3]=-12;
	else if(q1==m)m=-12; 
	else if(w1==a[0])a[0]=-12;
	else if(w1==a[1])a[1]=-12;
	else if(w1==a[2])a[2]=-12;
	else if(w1==a[3])a[3]=-12;
	else if(w1==m)m=-12;
	checkb();
	}

用过的数字自动变为-12

@张昊泽

q和w可以用同一个

@jhxs1326


像这个
@jhxs1326

不能回老帖,还有我劝你最好把名字改了