手记

慕课Java3 简易扑克牌游戏

代码是在一个文件里的写的,完整性强,基本都有注释

代码中未使用到 Comparable 和 Comparator,对输入没有进行检索

运行图如下:

代码如下

package 集合.慕课简易扑克牌游戏;

import java.util.*;

public class EasyPoker {

    public static void main(String[] args) {
        // 构建牌组管理器
        PokerManager PokerM = new PokerManager();
        // 构建玩家管理器
        PlayerManager PlayerM = new PlayerManager();
        // 创建牌组
        PokerM.createPoker();
        // 创建玩家
        PlayerM.createTwoPlayer();
        // 欢迎用语
        for (Player player : PlayerM.players) System.out.println("- - - -> 欢迎玩家:" + player.getName());
        // 玩家拿牌
        PokerM.dealCards(PlayerM.players);
        // 打印玩家的牌
        PokerM.showCards(PlayerM.players);
        // 输出玩家手中最大的牌,得到胜利者
        PokerM.maxPoker(PlayerM.players);
    }
}

// 扑克牌基本属性
class Poker
{
    private final PokerType type;
    private final String dot;

    public Poker(PokerType type, String dot) {
        this.type = type;
        this.dot = dot;
    }
    // 重写 toString,直接打印 花色+点数
    public String toString(){
        return this.type.getPic() + this.dot;
    }

    public PokerType getType() {
        return type;
    }

    public String getDot() {
        return dot;
    }
}

// 扑克管理器
class PokerManager
{
    // 创建牌组集合
    ArrayList<Poker> pokers = new ArrayList<>();

    // 创建牌组并洗牌
    public void createPoker(){
        System.out.println("- - - - - - - - - - 开始创建扑克牌!- - - - - - - - - -");

        for (int i = 0; i < Constant.DOTS.length; i++){
            // 遍历 2-A
            String dot = Constant.DOTS[i];
            for (int j = 0; j < Constant.TYPE.length; j++){
                // 遍历 四种花色
                PokerType type = Constant.TYPE[j];
                // 添加牌到牌组中
                pokers.add(new Poker(type, dot));
            }
        }
        System.out.println("- - - - - - - - - - 扑克牌创建成功!- - - - - - - - - -");
        System.out.println("- - - - - - - - - - 开始洗牌!- - - - - - - - - - - -");
        // 打乱集合顺序
        Collections.shuffle(pokers);
        System.out.println("- - - - - - - - - - 洗牌结束!- - - - - - - - - - - -");
    }

    // 发牌
    public void dealCards(ArrayList<Player> players){
        System.out.println("- - - - - - - - - - 开始发牌 - - - - - - - - - -");

        for (Player player : players) {
            // 从玩家集合中分别取出玩家拿牌
            for (int j = 0; j < player.pokerT.length; j++) {
                // 因为顺序已经打乱,每次获取第一张即可
                player.pokerT[j] = pokers.get(0);
                // 取完即删,不会获得重复扑克牌
                pokers.remove(0);
            }
            System.out.println("- - - -> 玩家:" + player.getName() + " 已拿牌");
        }
    }

    // 打印牌的信息
    public void showCards(ArrayList<Player> players){
        System.out.println("- - - -> 玩家各自的手牌为:");
        for (Player player : players) {
            System.out.println("- - - -> "+ player.getName() + Arrays.toString(player.pokerT));
        }
    }

    // 比较两张牌的大小,并返回大的那个
    public Poker comparePoker(Poker p1, Poker p2){
        // 按 2-A 的索引取大小
        if (Arrays.asList(Constant.DOTS).indexOf(p1.getDot()) > Arrays.asList(Constant.DOTS).indexOf(p2.getDot())) return p1;
        // 同上
        else if (Arrays.asList(Constant.DOTS).indexOf(p1.getDot()) < Arrays.asList(Constant.DOTS).indexOf(p2.getDot())) return p2;
        // 按花色取大小,黑红梅方,ID依次变小
        else
            if (p1.getType().getId() > p2.getType().getId()) return p1;
            else return p2;
    }

    // 输入两个玩家各自手中最大的牌,并进行比较,得出胜者
    public void maxPoker(ArrayList<Player> players){
        // 创建一个数组来保存2个玩家最大值
        Poker[] pokerArr = new Poker[2];

        for (int i = 0; i < players.size(); i++){
            Player player = players.get(i);
            // 取得其一最大值
            Poker p = comparePoker(player.pokerT[0], player.pokerT[1]);
            // 添加进数组
            pokerArr[i] = p;
            // 打印2个玩家的手牌信息
            System.out.println("- - - -> 玩家:" + player.getName() + " 最大的手牌为:" + p.toString());
        }
        // 对比2个最大值得到最终最大扑克牌
        Poker winPoker = comparePoker(pokerArr[0], pokerArr[1]);
        for (Player player : players){
            // 属于哪个玩家的,就是谁获胜
            if (Arrays.asList(player.pokerT).contains(winPoker)) System.out.println("- - - -> 玩家:" + player.getName() + " 获胜!");
        }
    }
}

// 玩家基本属性
class Player
{
    private final String name;
    // 每个玩家2张牌,用数组来保存
    public Poker[] pokerT = new Poker[2];

    public Player(String name){
        this.name = name;
    }

    public String getName(){
        return this.name;
    }
}

// 玩家管理器
class PlayerManager
{
    // 创建玩家集合
    ArrayList<Player> players = new ArrayList<>();

    // 创建两个玩家
    public void createTwoPlayer(){
        Scanner in = new Scanner(System.in);

        for (int i = 1; i < 3; i++){
            System.out.println("- - - -> 请输入第" + i + "位玩家的姓名:");
            String name = in.next();
            // 添加玩家对象到集合中
            players.add(new Player(name));
        }
        in.close();
    }
}

// 常数类,用来放置不变类型
class Constant
{
    // 方便后面通过索引位置比较大小
    public static final String[] DOTS = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
    public static final PokerType[] TYPE = {PokerType.SPADES, PokerType.HEARTS, PokerType.CLUBS, PokerType.DIAMOND};
}

// 设置扑克类型
class PokerType
{
    private final String pic;
    private final int id;

    public PokerType(String pic, int id){
        this.pic = pic;
        this.id = id;
    }
    // 定义四个花色的构造器
    public static final PokerType SPADES  = new PokerType("黑桃", 4);
    public static final PokerType HEARTS  = new PokerType("红桃", 3);
    public static final PokerType CLUBS   = new PokerType("梅花", 2);
    public static final PokerType DIAMOND = new PokerType("方块", 1);

    // 获取花色,用来打印扑克牌信息
    public String getPic(){
        return this.pic;
    }

    // 获取id,后面用来比较同点数时比较花色用
    public int getId(){
        return this.id;
    }
}

希望对暂时没有头绪的初学者朋友有一定借鉴作用,代码有什么不对之处也欢迎指正(●’◡’●)

1人推荐
随时随地看视频
慕课网APP

热门评论

作者实在是太厉害了,膜拜一下。写的很清晰,结构很容易懂

查看全部评论