猜扑克牌的C语言程序设计,急急急!!
发布网友
发布时间:2022-11-02 07:16
我来回答
共3个回答
热心网友
时间:2023-10-22 21:31
作业要自己做呀~~~呵呵,给你一个吧,学C++的时候自己做的一道课后习题。
代码给你拷上来,一些不必要的部分你自己改一下就可以了。
当时随便做的,还可以再进一步优化的。
另:回楼上的,这题主要是三次排序的问题。第一次选择一个行数,然后把那行的元素分成三份到每一行去,第二次再选一行,那么把那一行的第一次就有的三个元素再分布到每行中去,这样,最后每行只剩下一个两次都选择了的元素。那么最后再选一行答案就是唯一的了。
#include<iostream>
#include<string>
#include<time.h>
using namespace std;
namespace variable
{
int used;
static int i;
}
namespace array
{
int used[27]={0};
}
/*自定义函数部分*/
void drawline(int n)//画线函数
{
if(n==1)
cout<<"----------------------------";
else
cout<<"-------------------------------------------------------------------------------";
}
//打印版权信息~~嘿嘿~~~~~自己写的程序~~~标个版权~~
void printcopy(){
int short_line(1);
drawline(short_line);
cout<<"Copyright(c) SehDan.Lee";
drawline(short_line);
cout<<endl;
}
//函数:为名为poker的string类型数组赋初值,作用:生成一副扑克牌
void push_poker(string *str,int len)
{
string list[15];
for(int i=3;i<18;i++)
switch(i)
{
case 10:list[i-3]="10";break;
case 11:list[i-3]='J';break;
case 12:list[i-3]='Q';break;
case 13:list[i-3]='K';break;
case 14:list[i-3]='A';break;
case 15:list[i-3]='2';break;
case 16:list[i-3]="KING2";break;
case 17:list[i-3]="KING1";break;
default:list[i-3]=i+48;
}
string type[4]={"a","b","c","d"};
i=0;
for(int j=0;j<13;j++)
{
for(int k=0;k<4;k++)
{
*(str+i)=type[k]+"-"+list[j];
i++;
}
}
for(i=0;i<2;i++)
*(str+len+i-2)=list[i+13];
}
//函数:检测生成的扑克牌是否已被使用
int chk_used(int *p,int i)
{
for(int j=0;j<27;j++)
{
if(*(p+j)==i)
{
return 1;
break;
}
}
return 0;
}
//函数:标记已使用的扑克牌
void used(int *p,int i)
{
*(p+variable::i)=i;
variable::i++;
}
//数组置零
void set_int_array(int *p,int len)
{
for(int i=0;i<len;i++)
*(p+i)=0;
}
//抽取扑克
void set_poker(string *str,string *p_poker,int n)
{
for(int i=0;i<n;i++)//随机抽取n张牌
{
srand((unsigned)time(NULL));//以系统时间为种子,产生不同的随机值
variable::used=rand()%54;
while(chk_used(array::used,variable::used)==1){variable::used=rand()%54;}//确保产生不重复的随机值
used(array::used,variable::used);//标记产生的随机值,确保下次不再出现
*(p_poker+i)=*(str+variable::used);
}
variable::i=0;
set_int_array(array::used,27);
}
//出题函数
void print_area(string *str,int times,int row,int row_2,int *r)
{
int p_row,i,n_list[27]={0};
for(i=0;i<27;i++)
n_list[i]=i;
if(times!=1)
{
//接下来处理第一次收集的row信息
int t;
for(i=0;i<3;i++)
{
t=n_list[i];
n_list[i]=n_list[(row-1)*9+i];
n_list[(row-1)*9+i]=t;
}
for(i=0;i<3;i++)
{
t=n_list[i+12];
n_list[i+12]=n_list[(row-1)*9+i+3];
n_list[(row-1)*9+i+3]=t;
}
for(i=0;i<3;i++)
{
t=n_list[i+24];
n_list[i+24]=n_list[(row-1)*9+i+6];
n_list[(row-1)*9+i+6]=t;
}
//第二次收集到的row信息(row_2)
if(times==3)
{
for(i=0;i<3;i++)
{
t=n_list[(row_2-1)*12+i];
n_list[(row_2-1)*12+i]=n_list[i*9];
n_list[i*9]=t;
}
for(i=0;i<27;i++)
*(r+i)=n_list[i];
}
}
for(i=0;i<27;i++)
{
if(i%9==0)
cout<<endl<<"Line "<<i/9+1<<":";
cout.width(8);
cout<<*(str+n_list[i]);
}
cout<<endl;
}
/*主函数*/
void main()
{
int again=1;
int times,row,row_2,row_last,r[27],long_line=0;
string poker[54],p_poker[27];
push_poker(poker,54);
while(again)
{
times=1,row=0,row_2=0,row_last=0;
printcopy();
set_poker(poker,p_poker,27);
while(times!=4)
{
drawline(long_line);
print_area(p_poker,times,row,row_2,r);
drawline(long_line);
cout<<endl;
if(!row)
cout<<"Remember a card,and tell me what line it reside in(1/2/3):";
else
cout<<"What line the card you remembered reside in now(1/2/3):";
if(!row)
cin>>row;
else if(!row_2)
cin>>row_2;
times++;
}
int final;
cin>>final;
drawline(long_line);
cout<<"\nYour remembered card is: "<<p_poker[r[(final-1)*9]]<<endl;
cout<<"Donot believe it? Try again?(1 for yes,0 for no)";
cin>>again;
cout<<"\n\n\n";
if(again!=1&&again!=0)
{
cout<<"error!";
break;
}
}
}
热心网友
时间:2023-10-22 21:32
哦 原来是这样 谢了 楼下
这样找 不一定到到的就是唯一的,有可能有几个数据!
有时间帮你做!
热心网友
时间:2023-10-22 21:32
我有VB写的,要不?