Java 面向对象编程之斗地主洗牌发牌

工具类

package com.homework;

import java.util.ArrayList;
import java.util.Arrays;

// 定义一个工具类
public class ToolsUtil {

    // 准备一个牌盒用来存储牌
    static ArrayList<Poker> pokerBox = new ArrayList<>();

    // 初始化牌盒,准备一副新牌
    public static ArrayList<Poker> initPoker(){
        // 1.1 准备花色数组
        String[] colors = {"♥","♠","♦","♣"};
        // 1.2 准备数字数组
        String[] numbers = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
        // 1.3 创造牌 拼接牌
        // 双重for循环,增强for循环 foreach
        for (String color : colors) {
            //
            for (String number : numbers) {
                String content = color + number;
                pokerBox.add(new Poker(content)); // 使用全参构造
            }
        }
        // 1.4 存储大王小王
        // 存储的都是对象
        pokerBox.add(new Poker("大王"));
        pokerBox.add(new Poker("小王"));
        // 最后把组装好的牌,返回给方法
        return pokerBox;
    }

    // 2. 洗牌
    public static ArrayList<Poker> shufflePoker(ArrayList<Poker> list){

        // 打乱顺序
        ArrayList<Poker> pokers = new ArrayList<>();
        // 随机索引
        for (int i = 0; i < 54; i++) {
            int index = (int)(Math.random()*(list.size()));
            pokers.add(list.remove(index));
            // Poker remove(index) 删除ArrayList容器中的指定元素
            // 并返回删除指定的元素
        }
        return pokers;
    }

    // 3.看牌 三个玩家的牌 和 底牌 ,可变参数列表
    // 知识点:可变参数列表放最后
    // String[] cards 底牌
    public static void checkup(Poker[] cards,Player ... players){

        System.out.println("三位玩家和底牌依次为: ");
        //非空校验
        if(cards != null && players!=null && players.length!= 0){
            // 遍历是N个玩家的牌,
            // 如果使用可变参数列表, player相当于是一个数组,不是对象!!!!
            // players 相当于是一个数组Player[] players;

            for (int i = 0; i < players.length; i++) {
                // 一个一个玩家,在ArrayList类中有重写的toString方法.
                // player[i] == poker 其中一个玩家
                System.out.println("玩家"+players[i].getName()+"的牌是:"+players[i].getPokers());

            }
            // 查看底牌
            // String[] cards 底牌
            // Arrays.toString(数组类型的变量)
            System.out.println(Arrays.toString(cards));
        }

    }

}

定义一个poker类

package com.homework;

// 定义一个poker类
public class Poker {
    // 属性
    private String content;
    // 牌底 = 花色 + 数字

    // 当打印poker类对象时,只想查看该牌的内容
    // 默认调用
    @Override
    public String toString() {
        return  content ;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Poker() {
    }

    public Poker(String content) {
        this.content = content;
    }

}

定义一个玩家类

package com.homework;

import java.util.ArrayList;

// 定义一个【玩家类】
public class Player {
    //
    private String name;

    // 对应关系
    // private Poker poker;
    // 一一对应的关系

    // 一对多关系
    private ArrayList<Poker> pokers;



    @Override
    public String toString() {
        return "Player{" +
                "name='" + name + '\'' +
                ", pokers=" + pokers +
                '}';
    }

    public Player() {
    }

    public Player(String name, ArrayList<Poker> pokers) {
        this.name = name;
        this.pokers = pokers;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public ArrayList<Poker> getPokers() {
        return pokers;
    }

    public void setPokers(ArrayList<Poker> pokers) {
        this.pokers = pokers;
    }
}

主函数类

package com.homework;

import java.util.ArrayList;

// 定义一个主启动类
public class MainProgram {
    //
    public static void main(String[] args) {

        // 1.准备牌
        ArrayList<Poker> pokers = ToolsUtil.initPoker();
        System.out.println(pokers);
        // 2.洗牌
        ArrayList<Poker> pokersBox = ToolsUtil.shufflePoker(pokers);
        // 3.发牌
        // 准备三个玩家,创建三个Player对象 Ctrl+D
        Player p1 = new Player("小明", new ArrayList<>());
        Player p2 = new Player("小刘", new ArrayList<>());
        Player p3 = new Player("小王", new ArrayList<>());
        // 准备底牌
        Poker[] cards = new Poker[3];

        // 准备三个玩家轮流摸牌,通过索引操作[0,53] 底牌的索引是 51,52,53
        // 遍历
        for (int i = 0; i < pokersBox.size(); i++) {
            // 获取纸牌
            Poker poker = pokersBox.get(i);
            // 流出三张底牌,存储到底牌数组中
            if (i >= 51) {
                // 数组存储,越界,i-51后
                // cards 的索引是0 1 2
                cards[i - 51] = poker;
                // 当i=51的时候i-51 = 0
            } else {
                // 玩家抽牌
                if (i % 3 == 0) {
                    // 第一个玩家
                    p1.getPokers().add(poker);
                    // ArrayList 中增加用add
                } else if (i % 3 == 1) {
                    // 第二个玩家
                    p2.getPokers().add(poker);
                } else if (i % 3 == 2) {
                    // 第三个玩家
                    p3.getPokers().add(poker);
                }
            }

        }
        // 4.看牌
        ToolsUtil.checkup(cards,p1,p2,p3);

    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值