摸拟三张牌游戏,利用两个类,一个“打牌者”,一副“牌”,很方便的模拟三张牌游戏,可以设定玩牌的人数,也可以设定玩的副数,在此基础上,可以很方便的作出各种玩牌的游戏来!
两个类的源代码:
#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;//既不属于同花顺,也不属于三个头
}
//完整代码下载:
http://www.cfxy.net/bbs/viewFile.asp?Boardid=46&ID=370
有空欢迎到www.cfxy.net交流