Java基础-斗地主案例

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一、需求

按照斗地主的规则,完成洗牌发牌的动作。具体规则:使用54张牌打乱顺序,三个玩家参与游戏,三个人交替摸牌,每人17张牌,最后三张留作底牌。
在这里插入图片描述

二、分析

1.纸牌类

每张牌由花色数字两部分组成,定义纸牌类,包含花色和数字两个属性。

2.准备牌

一副牌有54张,使用ArrayList集合存储所有的纸牌对象。
每张牌由花色数字两部分组成,可以使用花色数组与数字数组嵌套迭代完成每张牌的组装,并添加到集合中。

3.洗牌

使用Coolection类的shuffle()方法对集合元素随机打乱。

4.发牌

每个玩家对应一手牌,创建3个ArrayList集合分别存储每个玩家的纸牌,通过对3取模依次发牌,或者一次发17张。将最后3张牌直接存放于底牌集合中。

5.看牌

直接打印每个玩家集合,先排序。

三、代码

package hntou.hntou.demo01_iterator.case04;
public class Card implements Comparable<Card>{
    private String number;
    private String color;
    private int id; //用于对象排序

    public Card(){
    }

    public Card(String number, String color, int id) {
        this.number = number;
        this.color = color;
        this.id = id;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return color+number;
    }

    @Override
    public int compareTo(Card o) {
        return o.getId()-this.getId();
    }
}
package hntou.hntou.demo01_iterator.case04;

import java.util.ArrayList;
import java.util.Collections;

/**
 * 斗地主综合案例
 */
public class FightTheLandlord {
    /**
     * 初始化纸牌
     */
    private static ArrayList<Card> pokers = new ArrayList<>();

    static {
        pokers.add(new Card("", "🃏", 54));
        pokers.add(new Card("", "🃏", 53));
        String[] numbers = {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"};
        String[] color = {"♠️", "♥️", "♣️", "♦️"};
        int id = 52;
        //外循环牌号
        for (String i : numbers) {
            //内循环花色
            for (String j : color) {
                pokers.add(new Card(i, j, id));
                id--;
            }
        }
    }

    public static void main(String[] args) {
        System.out.println(pokers);
        /**
         * 洗牌
         */
        Collections.shuffle(pokers);
        System.out.println(pokers);

        /**
         * 发牌
         */
        ArrayList<Card> player1 = push(0);
        ArrayList<Card> player2 = push(1);
        ArrayList<Card> player3 = push(2);
        ArrayList<Card> bottom = push(3);
        /**
         * 看牌(排序)
         */
        Collections.sort(player1);
        Collections.sort(player2);
        Collections.sort(player3);
        System.out.println("玩家1:" + player1);
        System.out.println("玩家2:" + player2);
        System.out.println("玩家3:" + player3);
        System.out.println("底牌:" + bottom);
    }

    /**
     * 发牌 0、1、2 分别代表 前三个玩家 其他代表底牌
     */
    public static ArrayList<Card> push(int count) {
        ArrayList<Card> player = new ArrayList<>(17);
        if (count == 0) {
            for (int i = 0; i < 17; i++) {
                player.add(pokers.get(i));
            }
        } else if (count == 1) {
            for (int i = 17; i < 34; i++) {
                player.add(pokers.get(i));
            }
        } else if (count == 2) {
            for (int i = 34; i < 51; i++) {
                player.add(pokers.get(i));
            }
        } else {
            for (int i = 51; i < 54; i++) {
                player.add(pokers.get(i));
            }
        }
        return player;
    }

}

四、效果图

在这里插入图片描述

五、总结

1.扑克牌内有花色、数字两个基本属性,一个id用于排序的属性。
2.初始化纸牌的时候放在static代码块内,FightTheLandlord类加载的时候就会把54张牌初始化。纸牌集合定义为静态变量共享。
3.两层循环把花色与数字组合。加入id用作后面排序,把大小王id分为54,53。因为初始化扑克牌的时候就是花色和数字都是从大到小排列的,所以从♠️2开始只需要依次赋值后再把id-,同理♦️3的值就是1最小。
4.洗牌用到了Collections工具类的shuffle方法(随机打乱List集合中元素的顺序)。
5.发牌就三个玩家从打乱的牌堆集合中从下标0依次开取,每人17张(一次性发17张)最后三张作为底牌。
6.查看牌之前先把分到的牌排序,就用到了Collections工具类的sort方法,Card类实现Comparable接口重写compareTo方法,自定义降序排序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值