C++让计算机来猜测用户暗记的某张扑克牌源代码
需求分析:
计算机从一副扑克牌(54张)中任意抽出27张,摆放在不同的三行上(每行9张),用户“暗记”某张纸牌,而后告诉计算机所“暗记”的那张纸牌处于哪一行中;之后计算机再两次将纸牌重新摆放,并让用户再回答两次相同的提问(那张纸牌在重新摆放后又处在哪一行上);此时计算机会将用户所“暗记”的那张纸牌给挑出来。
程序执行的结果:
3.3概要设计:
本程设计思路: 为了突出重点我把13种牌标记位A,B,C.....4种花色标记为(1.2.3.4),首先是洗牌从54张牌中取出27张除了使用随机数外还得记下已经选出的牌避免27张牌中有重复的牌,我用一个大小为27个指向牌(对象)的指针的指针数组表示3行及其位置,每次对用户所选行的牌计数加1,并对某些牌的指针指向进行改变;最终有一张牌计数为3该牌即为所选。
程序流程图(如左图):
3.3 详细设计与编码:
见上传程序。
3.4 调试分析:
在调试过程中开始我发现由于使用的是指针,所以很容易将指针指向非法的区域,因而格外小心。这需要我们有差错的意识,在容易出错的地方要有错误的检测和处理代码。
3.5 用户使用说明:
用户记住自己所选的牌,每次输入此牌所在的行号,程序可以找出您记住的牌
3.6 设计心得:
对于指针的使用要格外小心,防止非法的访问
#include<iostream>
#include<time.h>
#include<iomanip>
#include<assert.h>
using namespace std;
class FindCard
{
private:
struct card
{
card():id(0),num(0) { }
int id;
int num;
};
card cardList[27]; //记录所抽取的卡片
card** lineHead; //记录各个位置上的卡片信息
int lastSelectedRow; //上次选择所选的行号
int currentState; //第几次选取
const int changeState();
const static char style[14]; //输出样式
public:
const int initCard();
FindCard():lineHead(0),lastSelectedRow(0),
currentState(0)
{
lineHead=new card*[27];
}
void printoutCurrentState() const;
void select(int row);
void printoutResult() const;
void clear();
~FindCard() { }
};
const char FindCard::style[14]={'A','B','C','D','E','F','G','H','I','J','K','L','M','I'};
const int FindCard::initCard()
{
int state[54]; //记录个卡片选取状况,防止重复选取
for(int i=0;i<54;i++)
state[i]=0;
for(i=0;i<27;i++)
{
time_t t;
srand((unsigned)time(&t)+rand());
int m=rand()%54+1;
while(state[m])
{
if(m==54)
m=1;
m++;
}
state[m]=1;
cardList[i].id=m;
lineHead[i]=&cardList[i];
}
return 1;
}
template<typename T> //交换位置
inline void _swap(T &a,T &b)
{
T temp;
temp=a;a=b;
b=temp;
}
const int FindCard::changeState()
{
int line1=(lastSelectedRow+1)%3;
int line2=(lastSelectedRow+2)%3;
if(currentState==1) //第一次选取
{
for(int i=0;i<3;i++)
_swap(lineHead[lastSelectedRow*9+i],lineHead[line1*9+i]);
for(i=3;i<6;i++)
_swap(lineHead[lastSelectedRow*9+i],lineHead[line2*9+i]);
}
else if(currentState==2) //第二次选取
{
int m=2;
for(int i=0;i<9 && m;i++)
{
if(lineHead[lastSelectedRow*9+i]->num==currentState )
{
if (m==2)
_swap(lineHead[lastSelectedRow*9+i],lineHead[line1*9+i]);
else
_swap(lineHead[lastSelectedRow*9+i],lineHead[line2*9+i]);
m--;
}
}
}
else
return 0;
return 1;
}
void FindCard::printoutCurrentState() const
{
setw(10);
for(int i=0;i<27;i++)
{
if(i%9==0)
cout<<endl<<"Line "<<i/9<<" ";
cout<<style[lineHead[i]->id/4]<<"-"<<lineHead[i]->id%4+1<<" ";
}
cout<<endl;
}
void FindCard::select(int row)
{
assert(row>=0 && row<3);
currentState++;
lastSelectedRow=row;
for(int i=0;i<9;i++)
lineHead[lastSelectedRow*9+i]->num++;
changeState();
}
void FindCard::printoutResult() const
{
if(currentState!=3)
cout<<"error!"<<endl;
for(int i=0;i<9;i++)
{
if(lineHead[lastSelectedRow*9+i]->num==currentState)
{
cout<<style[lineHead[lastSelectedRow*9+i]->id/4]<<"-"
<<lineHead[lastSelectedRow*9+i]->id%4+1<<endl;
}
原文请找腾讯752018766优,文-论'文.网http://www.youerw.comvoid main()
{
FindCard find_card;
if(find_card.initCard())
{
for(int i=0;i<3;i++)
{
find_card.printoutCurrentState();
cout<<"请选择您所记住的牌所在行:"<<endl;
int row;
cin>>row;
find_card.select(row);
}
find_card.printoutResult();
find_card.clear();1812