用Java实现斗地主发牌器

先看下整体效果:(由于剪辑长度有限,只能展示前一部分)

开始实现:

一,先创建出牌。

有三点值得注意:

1.写重构方法时要写两个,因为大小王不是点数,而是字符串。

2.重写toString方法只用花色suit和点数points就行,保持简洁性。

3.一定要实现comparator接口,实现compareto方法(数字按大小比较,王比数字都大,但小王比大王小)

二,生成牌

最重要的思想是把牌用List组织起来,因为这样牌就可以方便后续抽牌、洗牌等操作

三、洗牌

洗牌主要借助Random方法生成随机数,把i下标的数据和随机数下标的数进行交换

四、开始斗地主

用的核心思想主要是生成List<List<Card>> listList二维数组装抽取出来的牌,并且后续比较时用到了Collections.sort()方法。

五、在Test中执行

最后的结果就是:

六、总结

1.,学会用List组织类,就可以对类进行增删查改。

2,用List组织起来的类型的add()和remove()方法是会影响到List本身的,只在添加数据和删除数据时运用,而set()和get()不影响List本身,只是修改里面的值和取值。

3.学会灵活运用comparator接口进行较为复杂的比较

七、代码:

一共三个类:Card类,Playcards类,Test类。

Card类:
import java.time.Period;
import java.util.Comparator;

public class Card implements Comparator<Card> {
    private String suit;
    private int points;

    public String doubleking;

    public Card(String suit, int points) {
        this.suit = suit;
        this.points = points;
    }

    public Card(String suit, String doubleking) {
        this.suit = suit;
        this.doubleking = doubleking;
    }

    public String getSuit() {
        return suit;
    }

    public void setSuit(String suit) {
        this.suit = suit;
    }

    public int getPoints() {
        return points;
    }

    public void setPoints(int points) {
        this.points = points;
    }

    public String getDoubleking() {
        return doubleking;
    }

    public void setDoubleking(String doubleking) {
        this.doubleking = doubleking;
    }

    @Override
    public String toString() {
        return doubleking==null?("suit  "+suit+"  points  "+points):("suit  "+suit+"  points  "+doubleking);
    }

//
//    public int compareTo(Card o) {
//        if(this.doubleking==null&&o.doubleking==null){
//            int ret=this.points-o.points;
//            return ret;
//        }
//        else if(this.doubleking==null&&o.doubleking!=null){
//            return -1;
//        }
//        else if(this.doubleking!=null&&o.doubleking==null){
//            return 1;
//        }
//        else /*if(this.doubleking!=null&&o.doubleking!=null){*/
//        {
//            if(this.doubleking.compareTo(o.doubleking)>0){
//                return -1;
//            }else {
//                return 1;
//            }
//        }
//
//    }

    @Override
    public int compare(Card o1, Card o2) {
        if(o1.doubleking==null&&o2.doubleking==null){
            int ret=o1.points-o2.points;
            return ret;
        }
        else if(o1.doubleking==null&&o2.doubleking!=null){
            return -1;
        }
        else if(o1.doubleking!=null&&o2.doubleking==null){
            return 1;
        }
        else /*if(this.doubleking!=null&&o.doubleking!=null){*/
        {
            if(o1.doubleking.compareTo(o2.doubleking)>0){
                return -1;
            }else {
                return 1;
            }
        }

    }
}
Playcards类:
import java.util.*;
import java.util.jar.JarEntry;

public class Playcards {
    //玩家号码
    private   int player=0;
    //牌的花色和点数
    private static final String[]suits={"♥","♦","♠","♣"};
    private static final int[]points={1,2,3,4,5,6,7,8,9,10,11,12,13};
    //(两个王)
    private static final String[]doubleking={"xiaowang","dawang"};
    //生成牌并且设置牌的花色和点数(牌的形式是由list组织起来的)

    //牌的形式是由list组织起来的
    List<Card>cardList=new ArrayList<>();
    //生成牌并且设置牌的花色和点数
    public List<Card> setCards(){
        for (int i = 0; i < points.length; i++) {
            for (int j = 0; j < suits.length; j++) {
                Card card=new Card(suits[j],points[i]);
                cardList.add(card);
            }
        }
        //加入王
        cardList.add(points.length*suits.length,new Card(doubleking[0],"xiaowang"));
        cardList.add(points.length*suits.length,new Card(doubleking[1],"dawang"));

        //展示所有的牌
        System.out.println();
        System.out.println(cardList);
        System.out.println();

        //返回cardList,此时cardList是组织起来的牌
        return cardList;
    }
    //洗牌
    public void randomCards(List<Card>cards){
        Random random=new Random();
        for (int i = points.length*suits.length+2-1; i > 0; i--) {
            exchange(cards,i,random.nextInt(i));
        }
        System.out.println(cards);
        System.out.println();
    }
    //(交换牌)
    private void exchange(List<Card>cards,int i,int j){
        Card tmpcard=cards.get(i);
        cards.set(i,cards.get(j));
        cards.set(j,tmpcard);
    }



    //打牌(斗地主)
    public void playCards(List<Card>cards){
        //三个玩家手中的牌
        List<Card>player1=new ArrayList<>();
        List<Card>player2=new ArrayList<>();
        List<Card>player3=new ArrayList<>();

        //把三个人手中的牌组织起来
        List<List<Card>> listList =new ArrayList<List<Card>>();
        listList.add(player1);
        listList.add(player2);
        listList.add(player3);

        //我的回合,抽卡!
        for (int i = 0; i < 17; i++) {
            for (int j = 0; j <3; j++) {
                Card tmpcard=cards.remove(0);
                listList.get(j).add(tmpcard);
            }
        }

        System.out.println(listList.get(0));
        System.out.println(listList.get(1));
        System.out.println(listList.get(2));
        System.out.println();
        //剩余三张牌,开始抢地主
        while (true){

            int playernumber=player%3+1;
            System.out.println("请问"+(playernumber)+"号玩家抢地主吗?");
            System.out.println("抢地主按1,不强按2");
            Scanner scanner=new Scanner(System.in);
            int choice=scanner.nextInt();
            if(choice==1)
            {
                //展示地主牌
                System.out.println(cards);

                //加入地主牌
                listList.get(playernumber-1).add(cards.remove(0));
                listList.get(playernumber-1).add(cards.remove(0));
                listList.get(playernumber-1).add(cards.remove(0));

                break;
            }else {
                player++;
            }

        }



        Collections.sort(listList.get(0), new Comparator<Card>() {
            @Override
            public int compare(Card o1, Card o2) {
                if(o1.doubleking==null&&o2.doubleking==null){
                    int ret=o1.getPoints()-o2.getPoints();
                    return ret;
                }
                else if(o1.doubleking==null&&o2.doubleking!=null){
                    return -1;
                }
                else if(o1.doubleking!=null&&o2.doubleking==null){
                    return 1;
                }
                else /*if(this.doubleking!=null&&o.doubleking!=null){*/
                {
                    if(o1.doubleking.compareTo(o2.doubleking)>0){
                        return -1;
                    }else {
                        return 1;
                    }
                }

            }


        });
        Collections.sort(listList.get(1), new Comparator<Card>() {
            @Override
            public int compare(Card o1, Card o2) {
                if(o1.doubleking==null&&o2.doubleking==null){
                    int ret=o1.getPoints()-o2.getPoints();
                    return ret;
                }
                else if(o1.doubleking==null&&o2.doubleking!=null){
                    return -1;
                }
                else if(o1.doubleking!=null&&o2.doubleking==null){
                    return 1;
                }
                else /*if(this.doubleking!=null&&o.doubleking!=null){*/
                {
                    if(o1.doubleking.compareTo(o2.doubleking)>0){
                        return -1;
                    }else {
                        return 1;
                    }
                }

            }


        });
        Collections.sort(listList.get(2), new Comparator<Card>() {
            @Override
            public int compare(Card o1, Card o2) {
                if(o1.doubleking==null&&o2.doubleking==null){
                    int ret=o1.getPoints()-o2.getPoints();
                    return ret;
                }
                else if(o1.doubleking==null&&o2.doubleking!=null){
                    return -1;
                }
                else if(o1.doubleking!=null&&o2.doubleking==null){
                    return 1;
                }
                else /*if(this.doubleking!=null&&o.doubleking!=null){*/
                {
                    if(o1.doubleking.compareTo(o2.doubleking)>0){
                        return -1;
                    }else {
                        return 1;
                    }
                }

            }


        });


        //展示所有玩家的手牌,开始斗地主
        System.out.println(listList.get(0));
        System.out.println(listList.get(1));
        System.out.println(listList.get(2));


        //出牌
    }



}
Test类:
import java.util.List;

public class Test {
    public static void main(String[] args) {
        Playcards playcards=new Playcards();
        List<Card>cardList=playcards.setCards();

        playcards.randomCards(cardList);

        playcards.playCards(cardList);
    }

}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值