毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 课程设计 >> 正文

C++让计算机来猜测用户暗记的某张扑克牌源代码

更新时间:2011-5-3:  来源:毕业论文

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.lwfree.cnvoid 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

C++让计算机来猜测用户暗记的某张扑克牌源代码下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©lwfree.cn 六维论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。