当所有人都拿到3张牌之后,需要比较所有人的牌的大小,这时分为下面几步完成 1) 将一手牌按从大到小的顺序重新排列并计算出当前一手牌的牌型。 2)比较所有参与人的牌,先比较牌型,如果牌型相同再比较点数和花色。
1)先完成一手牌的排列和计算牌型 Yarborough.java
package com.entity;
import com.utils.CardUtils;
/**
* 一手牌
* @author Administrator
*
*/
public class Yarborough{
/**
* 点数最大的牌
*/
private PlayCard first;
/**
* 点数最二的牌
*/
private PlayCard second;
/**
* 点数最三的牌
*/
private PlayCard three;
/**
* 牌型名称
*/
private String typeName;
/**
* 牌型值
*/
private int typeValue;
private PlayCard preCard;
private PlayCard currCard;
private PlayCard nextCard;
public Yarborough(PlayCard first) {
super();
this.first = first;
}
public Yarborough(PlayCard first, PlayCard second, PlayCard three) {
this.first=first;
this.second=second;
this.three=three;
}
/**
* 重置一手牌从大到小排列
*/
public void resetPlayCard(){
CardUtils utils=new CardUtils();
//排序对象(从小到大)
PlayCard[] cards={first,second,three};
utils.sortPlayCard(cards);
//设置一手牌
this.first = cards[2];
this.second = cards[1];
this.three = cards[0];
//计算牌型
utils.calculatePlateType(this);
}
public PlayCard getFirst() {
return first;
}
public void setFirst(PlayCard first) {
this.first = first;
}
public PlayCard getSecond() {
return second;
}
public void setSecond(PlayCard second) {
this.second = second;
}
public PlayCard getThree() {
return three;
}
public void setThree(PlayCard three) {
this.three = three;
}
public String getTypeName() {
return typeName;
}
public void setTypeName(String typeName) {
this.typeName = typeName;
}
public int getTypeValue() {
return typeValue;
}
public void setTypeValue(int typeValue) {
this.typeValue = typeValue;
}
}
CardUtils.java添加如下代码:
/**
* 排序一手牌 从小到大
* @param careArray 一手牌集合
*/
public void sortPlayCard(PlayCard[] careArray){
if(careArray!=null && careArray.length>0){
//冒泡排序
for(int i=0;i<careArray.length;i++){
for(int j=i+1;j<careArray.length;j++){
PlayCard tmp=null;
//获取点数在数组下标的索引值
int index1=getIndexByArray(careArray[i].getNumber(), DefineUtils.NUM_ARRAY);
int index2=getIndexByArray(careArray[j].getNumber(), DefineUtils.NUM_ARRAY);
//判断点数的大小
if(index1>index2){
tmp=careArray[i];
careArray[i]=careArray[j];
careArray[j]=tmp;
}else if(index1==index2){//如果点数相同时需要判断花色
//获取颜色在数组下标的索引值
int index3=getIndexByArray(careArray[i].getColor(), DefineUtils.COLOR_ARRAY);
int index4=getIndexByArray(careArray[j].getColor(), DefineUtils.COLOR_ARRAY);
if(index3>index4){
tmp=careArray[i];
careArray[i]=careArray[j];
careArray[j]=tmp;
}
}
}
}
}
}
/**
* 获取值在数组中的下标值
* @param value
* @param arrays
* @return
*/
public int getIndexByArray(String value,String[] arrays){
if(arrays!=null && arrays.length>0){
for(int i=0;i<arrays.length;i++){
if(arrays[i].equals(value)){
return i;
}
}
}
return -1;
}
/**
* 计算牌型
* "单张(0)","对子(1)","顺子(2)","金花(3)","顺金(4)","豹子(5)","特殊(6)"
* @param yar
* @return
*/
public void calculatePlateType(Yarborough yar){
if(yar!=null){
PlayCard firstCard=yar.getFirst();
PlayCard secondCard=yar.getSecond();
PlayCard threeCard=yar.getThree();
//条件判断这里需要计算出当前这手牌属于哪种牌型
if(firstCard.getNumber().equals(secondCard.getNumber())
&& firstCard.getNumber().equals(threeCard.getNumber())){//豹子:点数相同
yar.setTypeName(DefineUtils.DEF_TYPE_NAME[5]);
yar.setTypeValue(5);
}else if(firstCard.getColor().equals(secondCard.getColor())
&& firstCard.getColor().equals(threeCard.getColor())){//花色相同
//这里需要判断是否为顺子
if(isStraight(yar)){//顺金
yar.setTypeName(DefineUtils.DEF_TYPE_NAME[4]);
yar.setTypeValue(4);
}else{//金花
yar.setTypeName(DefineUtils.DEF_TYPE_NAME[3]);
yar.setTypeValue(3);
}
}else if(isStraight(yar)){//花色不相同的牌顺子
yar.setTypeName(DefineUtils.DEF_TYPE_NAME[2]);
yar.setTypeValue(2);
}else if(firstCard.getNumber().equals(secondCard.getNumber())
|| firstCard.getNumber().equals(threeCard.getNumber())
|| secondCard.getNumber().equals(threeCard.getNumber())){//对子:两张同样大小的牌
yar.setTypeName(DefineUtils.DEF_TYPE_NAME[1]);
yar.setTypeValue(1);
}else if(
("5".equals(firstCard.getNumber())
&& "3".equals(secondCard.getNumber())
&& "2".equals(threeCard.getNumber())
)
&&(
!firstCard.getColor().equals(secondCard.getColor())
&& !firstCard.getColor().equals(threeCard.getColor())
&& !secondCard.getColor().equals(threeCard.getColor())
)
){//特殊
yar.setTypeName(DefineUtils.DEF_TYPE_NAME[6]);
yar.setTypeValue(6);
}else{//单张
yar.setTypeName(DefineUtils.DEF_TYPE_NAME[0]);
yar.setTypeValue(0);
}
}
}
/**
* 判断点数是否为顺子
* @param yar
* @return
*/
private boolean isStraight(Yarborough yar){
int index1=getIndexByArray(yar.getFirst().getNumber(), DefineUtils.NUM_ARRAY);
int index2=getIndexByArray(yar.getSecond().getNumber(), DefineUtils.NUM_ARRAY);
int index3=getIndexByArray(yar.getThree().getNumber(), DefineUtils.NUM_ARRAY);
if(index1-1==index2 && index2-1==index3){
return true;
}
return false;
}
测试类:Test5.java
package com.test;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import com.entity.PlayCard;
import com.entity.Yarborough;
import com.utils.CardUtils;
public class Test5 {
/**
* 显示所有人的牌
* @param rsList
*/
public static void disp(List<Yarborough> rsList){
System.out.println(rsList.size()+"个人的牌:");
for(int i=0;i<rsList.size();i++){
System.out.println("第"+(i+1)+"个人的牌:");
Yarborough y=rsList.get(i);
System.out.print("第一张牌:"+(y.getFirst().getNumber())+"["+y.getFirst().getColor()+"] ");
if(y.getSecond()!=null){
System.out.print("第二张牌:"+(y.getSecond().getNumber())+"["+y.getSecond().getColor()+"] ");
}
if(y.getThree()!=null){
System.out.print("第三张牌:"+(y.getThree().getNumber())+"["+y.getThree().getColor()+"] ");
}
if(y.getTypeName()!=null){
System.out.print(",牌型:"+y.getTypeName());
}
System.out.println();
}
}
/**
* 显示一手牌
* @param y
*/
public static void dispYarborough(Yarborough y,int rotaion){
switch(rotaion){
case 1:
System.out.print("第一张牌:"+(y.getFirst().getNumber())+"["+y.getFirst().getColor()+"] ");
break;
case 2:
System.out.print("第二张牌:"+(y.getSecond().getNumber())+"["+y.getSecond().getColor()+"] ");
break;
case 3:
System.out.print("第三张牌:"+(y.getThree().getNumber())+"["+y.getThree().getColor()+"] ");
break;
}
System.out.println();
}
/**
* 显示当前将要取出的最新的牌
* @param list
*/
public static void dispNewCard(List<PlayCard> list){
PlayCard card=null;
if(list!=null && list.size()>0){
card=list.get(list.size()-1);
System.out.println("---------当前最新的牌为:"+card.getNumber()+"["+card.getColor()+"]");
}
}
public static void main(String[] args) {
CardUtils utils=new CardUtils();
List<PlayCard> list=utils.generatorAllCard();//获取随机生成的所有牌
int rs=10;//总人数
List<Yarborough> rsList=new ArrayList<Yarborough>();//保存所有人的发牌
int maxIndex=0;
/*
* 现实中都是依次发牌,那么怎么样才能实现依次发牌的功能呢?
* 每个人最终都要拿到三张牌,所以要循环三次给10个人依次发牌
*/
for(int i=1;i<=3;i++){//三张牌
int count=0;
//那如何下一轮牌要从最大牌面的人开始发,上面的发牌功能应该怎么改?
//改进功能:第一轮从第一个人开始发牌;第二轮和第三轮以当前轮牌面最大的人开始发牌
System.out.println("---------从第"+(maxIndex+1)+"个人开始发牌");
dispNewCard(list);//显示第maxIndex将会拿到的牌或者说是本轮第一个人将会获取的牌
while(true){
switch(i){
case 1:
rsList.add(new Yarborough(utils.popPlayCardByLast(list)));//第一张牌
break;
case 2:
Yarborough y2=rsList.get(maxIndex);
y2.setSecond(utils.popPlayCardByLast(list));//第二张牌
break;
case 3:
Yarborough y3=rsList.get(maxIndex);
y3.setThree(utils.popPlayCardByLast(list));//第三张牌
break;
}
count++;
maxIndex++;
if(maxIndex>=rs) maxIndex=0;
if(count>=rs){
count=0;
break;
}
}
disp(rsList);
//发完一轮牌之后这里需要比较本轮所发的牌谁的牌面最大,最大的可以叫注,那这个功能要如何实现
maxIndex=utils.getMaxCardByRotation(rsList, i);
System.out.println("===========第"+i+"轮最大的牌是第"+(maxIndex+1)+"个人的牌:");
System.out.print("===========");
dispYarborough(rsList.get(maxIndex),i);
System.out.println();
}
//所有人都拿到所有牌之后这里需要比较所有人的牌型
//1、将所有人的一手牌按从大到小的顺序排列
utils.resetPlayCard(rsList);
disp(rsList);
}
}
测试结果:
---------从第1个人开始发牌
---------当前最新的牌为:Q[梅花]
10个人的牌:
第1个人的牌:
第一张牌:Q[梅花]
第2个人的牌:
第一张牌:7[方片]
第3个人的牌:
第一张牌:6[红桃]
第4个人的牌:
第一张牌:3[红桃]
第5个人的牌:
第一张牌:8[梅花]
第6个人的牌:
第一张牌:7[梅花]
第7个人的牌:
第一张牌:5[梅花]
第8个人的牌:
第一张牌:5[方片]
第9个人的牌:
第一张牌:6[黑桃]
第10个人的牌:
第一张牌:K[方片]
===========第1轮最大的牌是第1个人的牌:
===========第一张牌:Q[梅花]
---------从第1个人开始发牌
---------当前最新的牌为:K[红桃]
10个人的牌:
第1个人的牌:
第一张牌:Q[梅花] 第二张牌:K[红桃]
第2个人的牌:
第一张牌:7[方片] 第二张牌:8[红桃]
第3个人的牌:
第一张牌:6[红桃] 第二张牌:A[方片]
第4个人的牌:
第一张牌:3[红桃] 第二张牌:J[红桃]
第5个人的牌:
第一张牌:8[梅花] 第二张牌:9[红桃]
第6个人的牌:
第一张牌:7[梅花] 第二张牌:J[梅花]
第7个人的牌:
第一张牌:5[梅花] 第二张牌:9[方片]
第8个人的牌:
第一张牌:5[方片] 第二张牌:2[梅花]
第9个人的牌:
第一张牌:6[黑桃] 第二张牌:J[黑桃]
第10个人的牌:
第一张牌:K[方片] 第二张牌:Q[红桃]
===========第2轮最大的牌是第3个人的牌:
===========第二张牌:A[方片]
---------从第3个人开始发牌
---------当前最新的牌为:7[红桃]
10个人的牌:
第1个人的牌:
第一张牌:Q[梅花] 第二张牌:K[红桃] 第三张牌:4[红桃]
第2个人的牌:
第一张牌:7[方片] 第二张牌:8[红桃] 第三张牌:10[梅花]
第3个人的牌:
第一张牌:6[红桃] 第二张牌:A[方片] 第三张牌:7[红桃]
第4个人的牌:
第一张牌:3[红桃] 第二张牌:J[红桃] 第三张牌:Q[黑桃]
第5个人的牌:
第一张牌:8[梅花] 第二张牌:9[红桃] 第三张牌:2[方片]
第6个人的牌:
第一张牌:7[梅花] 第二张牌:J[梅花] 第三张牌:Q[方片]
第7个人的牌:
第一张牌:5[梅花] 第二张牌:9[方片] 第三张牌:9[黑桃]
第8个人的牌:
第一张牌:5[方片] 第二张牌:2[梅花] 第三张牌:K[黑桃]
第9个人的牌:
第一张牌:6[黑桃] 第二张牌:J[黑桃] 第三张牌:5[红桃]
第10个人的牌:
第一张牌:K[方片] 第二张牌:Q[红桃] 第三张牌:9[梅花]
===========第3轮最大的牌是第8个人的牌:
===========第三张牌:K[黑桃]
10个人的牌:
第1个人的牌:
第一张牌:K[红桃] 第二张牌:Q[梅花] 第三张牌:4[红桃] ,牌型:单张
第2个人的牌:
第一张牌:10[梅花] 第二张牌:8[红桃] 第三张牌:7[方片] ,牌型:单张
第3个人的牌:
第一张牌:A[方片] 第二张牌:7[红桃] 第三张牌:6[红桃] ,牌型:单张
第4个人的牌:
第一张牌:Q[黑桃] 第二张牌:J[红桃] 第三张牌:3[红桃] ,牌型:单张
第5个人的牌:
第一张牌:9[红桃] 第二张牌:8[梅花] 第三张牌:2[方片] ,牌型:单张
第6个人的牌:
第一张牌:Q[方片] 第二张牌:J[梅花] 第三张牌:7[梅花] ,牌型:单张
第7个人的牌:
第一张牌:9[黑桃] 第二张牌:9[方片] 第三张牌:5[梅花] ,牌型:对子
第8个人的牌:
第一张牌:K[黑桃] 第二张牌:5[方片] 第三张牌:2[梅花] ,牌型:单张
第9个人的牌:
第一张牌:J[黑桃] 第二张牌:6[黑桃] 第三张牌:5[红桃] ,牌型:单张
第10个人的牌:
第一张牌:K[方片] 第二张牌:Q[红桃] 第三张牌:9[梅花] ,牌型:单张