码迷,mamicode.com
首页 > 编程语言 > 详细

Java 小游戏:扎金花

时间:2015-07-29 13:49:55      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

 

当所有人都拿到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[梅花] ,牌型:单张

Java 小游戏:扎金花

标签:

原文地址:http://www.cnblogs.com/Holing/p/4685631.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!