斗地主(5)

来源:互联网 发布:发型设计软件破解版 编辑:程序博客网 时间:2024/05/01 14:11

稀里糊涂的写了几天  真是自己都全乱了。不管了 等框架搭好后再调吧。。


判断当前选中牌的类型,大小,这个函数嘛,,有点长。。感觉是不是不应该这么复杂。。

//判断牌型   1为王炸,2为炸弹,3为单牌,4为对牌,5为三张牌,6为三带一,7为三带二//8为单顺,9为双顺,10,为三顺(飞机不带翅膀),11为飞机带翅膀单牌,12为四带二单牌,13为四带二副对牌,14为飞机带翅膀对牌//-1为牌不符合规定POKE_TYPE PokeManager::JudgePokeType(list<POKE> listpoke){int type = -1;int value = -1;int length = listpoke.size();POKE *poke = new POKE[length];list<POKE>::iterator it;int i = 0;listpoke.sort(CmpView);//进行从小到大排序for(it = listpoke.begin(); it != listpoke.end(); ++it)poke[i++] = *it;POKE temppoke;list<POKE> triochain;switch(length){case 0:type = -1;break;case 1:type = 3;//3单牌break;case 2:if((poke[0].view + poke[1].view) == 29)//1王炸type = 1;else if(poke[0].view == poke[1].view)//4对牌type = 4;else type = -1;break;case 3:if(poke[0].view == poke[1].view && poke[0].view == poke[1].view)//5三张type = 5;else type = -1;break;case 4:// 4445  5666if(poke[0].view == poke[1].view && poke[0].view == poke[2].view && poke[0].view == poke[3].view)//2炸弹type = 2;else if(poke[1].view  == poke[2].view && (poke[1].view == poke[0].view || poke[1].view == poke[3].view))//6三带一type = 6;else type = -1;break; case 5://3带2  单顺     //44678   45678    44455   33444if((poke[0].view == poke[1].view && poke[3].view == poke[4].view) && (poke[2].view == poke[0].view || poke[2].view == poke[4].view))//7 三带二type = 7;else if(CheckChain(poke,length) && !FindIllegalConnecting(listpoke))//单顺type = 8;else type = -1;break;case 6://4带2张单牌  单顺  双顺  三顺if(FindSame(listpoke,4,&temppoke))//4带2张单牌{int i,x = 0,view1,view2;for(i = 0; i < length; i++){if(poke[i].view != temppoke.view){if(++x == 0) view1 = poke[i].view; else view2 = poke[i].view;}}if(view1 != view2) type = 12;else type = -1;}else if(CheckChain(poke,length) && !FindIllegalConnecting(listpoke))//8单顺type = 8;else if(CheckPairChain(poke,length) && !FindIllegalConnecting(listpoke))//9双顺type = 9;else if(CheckTrioChain(poke,length,triochain) && !FindIllegalConnecting(listpoke))//飞机不带翅膀type = 10;elsetype = -1;break;//三顺   6 333444    8 33344456    10 4445556677    12 333444555678   16 33344455566678910case 7://单顺  飞机带单翅膀case 9: case 11:case 13:case 15:case 17:case 19:if(CheckChain(poke,length) && !FindIllegalConnecting(listpoke))//8单顺type = 8;else if(CheckTrioChain(poke,length,triochain) == 11 && !FindIllegalConnecting(listpoke))//11飞机带单翅膀type = 11;else type = -1;break;case 8://单顺  双顺   三顺带双翅case 10:case 12:case 14:case 16:case 18:case 20:if(length == 8){if(CheckFourWithTwoPairs(poke,&temppoke))//13 四带二张对牌{type = 13;break;}}if(CheckChain(poke,length) && !FindIllegalConnecting(listpoke))//8单顺type = 8;else if(CheckPairChain(poke,length) && !FindIllegalConnecting(listpoke))//9双顺type = 9;else if(CheckTrioChain(poke,length,triochain) == 14 && !FindIllegalConnecting(listpoke))//11飞机带单翅膀type = 14;else type = -1;break;}return CalValue(poke,length,type,temppoke,triochain);}


判断牌型各种的小函数

//查看连牌中是否有大王小王 和2bool PokeManager::FindIllegalConnecting(list<POKE> listpoke){list<POKE>::iterator it;for(it = listpoke.begin(); it != listpoke.end(); ++it){if(it->view == 2 || it->view == 14  || it->view == 15)return true;}return false;}//查看牌中是否有多张相同牌bool PokeManager::FindSame(list<POKE> listpoke, int samenum, POKE *temppoke){list<POKE>::iterator tempIt,it;int count = 0;bool isexist = false;for(tempIt = listpoke.begin(); tempIt != listpoke.end(); ++tempIt){for(it = listpoke.begin(); it != listpoke.end(); ++it){if(tempIt == it)count++;}if(count == samenum){*temppoke = *tempIt;if(!isexist)isexist = true;elseisexist = false;}}return false;}//检查是否为顺牌bool PokeManager::CheckChain(POKE *poke, int num){POKE *vpoke = ValueSort(poke,num);for(int i = 0; i < num - 1; i++){if(vpoke[i].value + 1 != vpoke[i+1].value)return false;}delete vpoke;return true;}//检查是否为双顺牌bool PokeManager::CheckPairChain(POKE *poke, int num){POKE *vpoke = ValueSort(poke,num);for(int i = 0; i < num - 2; i+=2){if((vpoke[i].value + 1 != vpoke[i+2].value) || (vpoke[i].value != vpoke[i+1].value))return false;}delete vpoke;return true;}//检查是否为三顺牌int PokeManager::CheckTrioChain(POKE *poke, int num, list<POKE> &triochain){POKE *vpoke = ValueSort(poke,num);int value1,value2;int count = 1;bool solo = false, pair = false;//三顺带的是solo(单张)还是pair(对牌),不能同时为truevalue1 = vpoke[0].value;for(int i = 0; i < num; i++){value2= vpoke[i].value;if(value1 == value2)count++;else{if(count == 1)solo = true;else if(count == 2)pair = true;else if(count == 3)triochain.push_back(vpoke[i-1]);else if(count > 3)break;count = 1;value1 = value2; }}delete vpoke;if(solo && !pair)return 11;else if(!solo && pair)return 14;else return -1;}//检查是否为四带两张对牌bool PokeManager::CheckFourWithTwoPairs(POKE *poke, POKE *temppoke){int view1,view2;int count = 1;int pairnums = 0;view1 = poke[0].view;for(int i = 0; i < 8; i++){view2 = poke[i].view;if(view1 == view2)count++;else{if(count == 2)pairnums++;else if(count == 4)*temppoke = poke[i-1];elsereturn false;count = 1;view1 = view2;}}if(pairnums == 2)return true;elsereturn false;}

为了不使原按view排序的序列混乱,写了一个按value排序并返回的小函数

//以value为基准排序POKE* PokeManager::ValueSort(POKE *poke, int num){POKE *vpoke = new POKE[num];for(int i = 0; i < num; i++){vpoke[i] = poke[i];}sort(vpoke,vpoke+num,CmpValue);return vpoke;}
最后 计算当前牌的值

//计算牌型的大小POKE_TYPE PokeManager::CalValue(POKE *poke, int length, int type, POKE valuepoke, list<POKE> valuetriochain){//三带一 算第2张牌  3444 4445   三带二算第3张牌    33444 44455 飞机带翅膀// 1 2 3 4 5 8 9 10 POKE_TYPE poketype;sort(poke,poke+length,CmpValue);sort(valuetriochain.begin(),valuetriochain.end(),CmpValue);int value = 0; switch(type){case 1:case 2:case 3:case 4:case 5:case 8:case 9:case 10:value = poke[0].value;break;case 6:case 7:value = poke[2].value;break;case 11:case 14://飞机单翅 飞机双翅value = valuetriochain.begin()->value;break;case 12:case 13://四带二单 四带二双value = valuepoke.value;break;}}

额额 ,这几天比较忙,家里搬家,程序写的很混乱,这么长的代码,是不是不应该啊~


0 0