24点游戏实现
程序员文章站
2024-01-29 12:50:34
...
一、题目要求(24点游戏是经典的纸牌益智游戏)
常见游戏规则:
从扑克中每次取出4张牌。使用加减乘除,第一个能得出24者为赢。
(其中,J代表11,Q代表12,K代表13,A代表1)
按照要求编程解决24点游戏。
基本要求: 随机生成4个代表扑克牌牌面的数字字母,程序自动列出所有可能算出24的表达式,用擅长的语言(C/C++/Java或其他均可)实现程序解决问题。
1.程序风良好(使用自定义注释模板)
2.列出表达式无重复
二、代码实现
#include<iostream>
using namespace std;
int MAXSIZE1=1,MAXSIZE2=1,p;
class abc
{
public:
float num[432][4],cord[432][4];
};
abc emmm0(int n, int m,abc A,abc B) //n表示对象B里的数据个(组)数,m表示每组数据的个数例(4,3,2,1),产生新的对象A
{ //i表示存入数组的数的序号下标,j表示被操作数组的第几组数,
int i=0,flag,j=0,k,ch=0,j0,q,d; //ch,k表示被操作数组的的第几组数的记几个元素的下标
for(j=0;j<n;j++) //q表示传递符号和数据时的下标
{
for(d=(p==0)?0:2; d<3;d++)
{
for( k=1; k<m; k++,i++) //1:+ 2:* 3:-(1) 4:-(2) 5:/(1) 6:/(2)
{
A.num[i][0]=B.num[j][ch]+B.num[j][k]; // +
flag=(p==0)?0:1;
for(int h=1; h<m; h++,flag++) //将除过运算数据外的其他数据存入新的对象
{
if(flag!=k)
A.num[i][h]=B.num[j][flag];
else
h--;
}
if(p!=0)
{
for( q=0; q<2*(4-m); q++) //将当前符号标记输入进cord数组
A.cord[i][q]=B.cord[j][q];
A.cord [i][6]=B.cord[j][6];
A.cord[i][q]=A.num[i][0];
A.cord[i][++q]=1;
if(p==2&&A.num[i][0]==24) //最后一次调用时解决数组越界问题
i=i;
else if(p==2&&A.num[i][0]!=24) i--;
}
else //第一次调用函数时将数据和字符一同传入
{
j0=0;
A.cord[i][j0]=B.num[j][ch];
A.cord[i][++j0]=1;
A.cord[i][6]=B.num[j][k];
}
A.num[++i][0]=B.num[j][ch]*B.num[j][k]; // *
flag=(p==0)?0:1;
for(int h=1; h<m; h++,flag++ )
{
if(flag!=k)
A.num[i][h]=B.num[j][flag];
else
h--;
}
if(p!=0)
{
for( q=0; q<2*(4-m); q++) //将当前符号标记输入进cord数组
A.cord[i][q]=B.cord[j][q];
A.cord [i][6]=B.cord[j][6];
A.cord[i][q]=A.num[i][0];
A.cord[i][++q]=2;
if(p==2&&A.num[i][0]==24)
i=i;
else if(p==2&&A.num[i][0]!=24) i--;
}
else //第一次调用函数时将数据和字符一同传入
{
j0=0;
A.cord[i][j0]=B.num[j][ch];
A.cord[i][++j0]=2;
A.cord[i][6]=B.num[j][k];
}
A.num[++i][0]=B.num[j][ch]-B.num[j][k]; // -
flag=(p==0)?0:1;
for(int h=1; h<m; h++,flag++ )
{
if(flag!=k)
A.num[i][h]=B.num[j][flag];
else
h--;
}
if(p!=0)
{
for( q=0; q<2*(4-m); q++)
A.cord[i][q]=B.cord[j][q];
A.cord [i][6]=B.cord[j][6];
A.cord[i][q]=A.num[i][0];
A.cord[i][++q]=3;
if(p==2&&A.num[i][0]==24)
i=i;
else if(p==2&&A.num[i][0]!=24) i--;
}
else //第一次调用函数时将数据和字符一同传入
{
j0=0;
A.cord[i][j0]=B.num[j][ch];
A.cord[i][++j0]=3;
A.cord[i][6]=B.num[j][k];
}
A.num[++i][0]=B.num[j][k]-B.num[j][ch]; // -
flag=(p==0)?0:1;
for(int h=1; h<m; h++,flag++ )
{
if(flag!=k)
A.num[i][h]=B.num[j][flag];
else
h--;
}
if(p!=0)
{
for( q=0; q<2*(4-m); q++)
A.cord[i][q]=B.cord[j][q];
A.cord [i][6]=B.cord[j][6];
A.cord[i][q]=A.num[i][0];
A.cord[i][++q]=4;
if(p==2&&A.num[i][0]==24)
i=i;
else if(p==2&&A.num[i][0]!=24) i--;
}
else //第一次调用函数时将数据和字符一同传入
{
j0=0;
A.cord[i][j0]=B.num[j][ch];
A.cord[i][++j0]=4;
A.cord[i][6]=B.num[j][k];
}
if(B.num[j][ch]>0||B.num[j][ch]<0) // /
{
A.num[++i][0]=B.num[j][ch]/B.num[j][k];
flag=(p==0)?0:1;
for(int h=1; h<m; h++,flag++ )
{
if(flag!=k)
A.num[i][h]=B.num[j][flag];
else
h--;
}
if(p!=0)
{
for( q=0; q<2*(4-m); q++)
A.cord[i][q]=B.cord[j][q];
A.cord [i][6]=B.cord[j][6];
A.cord[i][q]=A.num[i][0];
A.cord[i][++q]=5;
if(p==2&&A.num[i][0]==24)
i=i;
else if(p==2&&A.num[i][0]!=24) i--;
}
else //第一次调用函数时将数据和字符一同传入
{
j0=0;
A.cord[i][j0]=B.num[j][ch];
A.cord[i][++j0]=5;
A.cord[i][6]=B.num[j][k];
}
}
if(B.num[j][ch]>0||B.num[j][ch]<0){
A.num[++i][0]=B.num[j][k]/B.num[j][0]; // /
flag=(p==0)?0:1;
for(int h=1; h<m; h++ ,flag++)
{
if(flag!=k)
A.num[i][h]=B.num[j][flag];
else
h--;
}
if(p!=0)
{
for( q=0; q<2*(4-m); q++)
A.cord[i][q]=B.cord[j][q];
A.cord [i][6]=B.cord[j][6];
A.cord[i][q]=A.num[i][0];
A.cord[i][++q]=6;
if(p==2&&A.num[i][0]==24)
i=i;
else if(p==2&&A.num[i][0]!=24) i--;
}
else //第一次调用函数时将数据和字符一同传入
{
j0=0;
A.cord[i][j0]=B.num[j][ch];
A.cord[i][++j0]=6;
A.cord[i][6]=B.num[j][k];
}
}
}
}
}
return A;
}
int main()
{
int i=0,n,j,k,sum=0,a[4]={6,6,6,6};
abc a0;
for( i=0;i<4;i++)
a0.num[0][i]=a[i];
abc a1,a2,a3;
p=0;
a1=emmm0(1,4,a1,a0);
p=1;
a2=emmm0(36,3,a2,a1);
p=2;
a3=emmm0(432,2,a3,a2);
for(i=0;i<500;i++)
{
if(a3.num[i][0]==24)
{
cout<<endl;
cout<<a3.num[i][0]<<endl;
cout<<"数据:"<<a3.cord[i][0]<<" "<<a3.cord[i][6]<<" "<<a3.cord[i][2]<<" "<<a3.cord[i][4]<<" "<<endl<<"符号";
for(int j=0;j<7;j++)
{ if(j%2==1)
switch((int)a3.cord[i][j])
{
case 1: cout<<"+"<<" "; break;
case 2: cout<<"*"<<" "; break;
case 3: cout<<"-"<<" "; break;
case 4: cout<<"-"<<" "; break;
case 5: cout<<"/"<<" "; break;
case 6: cout<<"/"<<" "; break;
}
}
sum++;
}
}
cout<<"共"<<sum<<"种算法";
return 0;
}
三、算法构造
四、调试及运行
上一篇: laravel Blade是什么