摸拟三张牌游戏,利用两个类,一个“打牌者”,一副“牌”,很方便的模拟三张牌游戏,可以设定玩牌的人数,也可以设定玩的副数,在此基础上,可以很方便的作出各种玩牌的游戏来!
两个类的源代码:
#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交流 
|