### 模拟三张牌游戏

#pragma once
#include "vector"
using namespace std;
typedef vector<int>vectorint;
class pukepai
{

int paicount;
vector <int> puke;
vector <int>::iterator vi;
void pukepai::shuzhi();
char xianshizifu[8];
//int xianshishuzhi[3];
void paixianshi(char *paimian);
int paizhi;
public:
int pukepai::chupai(char *);

pukepai(void);
~pukepai(void);
};

//“牌”的成员函数

#include "stdafx.h"

#include "time.h"
#include "./pukepai.h"

pukepai::pukepai(void)//初始化一副牌
{
paizhi=-1;
paicount=52;

//sort(vecTestScore.begin(), vecTestScore.end());
// &vecTestScore.size=9;
puke.assign(52,1);
for (vi=puke.begin()+1; vi != puke.end(); vi++)

*vi=*(vi-1)+1;

}
void pukepai::shuzhi()//赋值给牌面，然后删除摸到了的牌
{

paicount--;

paizhi=*vi;

puke.erase(vi);

}

void pukepai::paixianshi(char *paimian)//以日常所见的方式，返回一个牌色和牌面
{

char buf[32]="黑桃 ";
if(paizhi>13&&paizhi<27)
{paizhi=paizhi-13;
strcpy(buf,"红桃 ");

}
if(paizhi>26&&paizhi<40)
{paizhi=paizhi-26;
strcpy(buf,"方块 ");
}
if(paizhi>39&&paizhi<53)
{paizhi=paizhi-39;
strcpy(buf,"草花 ");
}

if(paizhi>10||paizhi==1)
{
if(paizhi==11)
strcat(buf,"J");
if(paizhi==12)
strcat(buf,"Q");
if(paizhi==13)
strcat(buf,"K");
if(paizhi==1)
strcat(buf,"A");
}
else
{
itoa(paizhi,xianshizifu,10);
strcat(buf,xianshizifu);
}
if(paimian!=NULL)
strcpy(paimian,buf);

}
int pukepai::chupai(char *paimian)//进行抽牌
{ if(paicount==0)//如果一副牌已经摸完了
{
return -1;
}

vi=puke.begin();
vi+=rand()%paicount;//随机摸牌
shuzhi();//看摸中了哪个，并且删除那张牌
paixianshi(paimian);//返回摸中的牌色和牌面

return paizhi;
}

pukepai::~pukepai(void)
{
}

//“打牌者”的头文件

#pragma once

class mopai
{

public:
int pai1;
char buf1[8];
int pai2;
char buf2[8];
int pai3;
char buf3[8];

int leixing();

};

//“打牌者”的成员函数

#include "stdafx.h"
#include "./mopai.h"

int mopai::leixing()
{int tonghuaflag=0;

char buftemp1[8]="";
char buftemp2[8]="";
char buftemp3[8]="";
int temp=0,temp1=0,temp2=0,temp3=0;
temp1=pai1;//把三张牌赋给三个临时变量
temp2=pai2;
temp3=pai3;

if(temp1<temp2)
{temp=temp2;//确保第一个临时变量是最大的那种牌
temp2=temp1;
temp1=temp;}

if(temp1<temp3)
{temp=temp3;//确保第一个临时变量是最大的那种牌
temp3=temp1;
temp1=temp;}

if(temp2<temp3)
{temp=temp3;//确保第二个临时变量是第二大的那种牌
temp3=temp2;
temp2=temp;}

strncpy(buftemp1,buf1,strlen("黑桃"));
strncpy(buftemp2,buf2,strlen("黑桃"));
strncpy(buftemp3,buf3,strlen("黑桃"));
if(strcmp(buftemp1,buftemp2)==0&&strcmp(buftemp2,buftemp3)==0)
{tonghuaflag=1;}//摸到了同花,不返回，继续判断，看是否属于同花顺
if((temp1-temp2==1)&&(temp2-temp3==1))//如果三张牌依次递减，说明符合同花顺的基本规则
{

if(tonghuaflag==1)
{
return 1;//摸到了同花顺
}
else
{
return 2;//摸到了顺子
}

}
if(tonghuaflag==1)//如果上面没返回，则这里返回同花
return 3;
if(temp1==temp2&&temp2==temp3)//如果三张牌同牌面，不同花色，属于三个头
return 0;
if(temp1==temp2||temp2==temp3||temp1==temp3)
return 4;//摸到了一对

return -1;//既不属于同花顺，也不属于三个头

}

//完整代码下载：

0 0