从零开始写游戏之斗地主-数据结构

最近看游戏直播的过程中,老是看到主播在玩欢乐斗地主。突发奇想,我能不能用Java写一个斗地主的游戏呢?说干就干!Java天下第一(开玩笑的)。

玩法

斗地主这个玩法大家都知道A~K各4张,再加上大小王各一张,总共54张牌。

有两个阵营:地主和农民,其中两个农民各持有17张牌,地主持有21张牌。

根据上面的信息以及平常斗地主时的经历,我们就能先一步构想出斗地主设计的一些数据结构了。

数据结构

扑克牌-Poker

我们都知道一张扑克牌有着两种属性:大小 以及花色 。当然了,大小王肯定是排除在外滴。所以自然而然就能写出扑克牌对应的类了。

扑克牌大小以及花色都能用一个枚举来声明:

java 复制代码
@Getter
public enum PokerCardEnums {

    JOKER_BIG("Big Joker", 17, false),
    JOKER_SMALL("Small Joker", 16, false),
    TWO("2", 15, true),
    ACE("A", 14, true),
    KING("K", 13, true),
    QUEEN("Q", 12, true),
    JACK("J", 11, true),
    TEN("10", 10, true),
    NINE("9", 9, true),
    EIGHT("8", 8, true),
    SEVEN("7", 7, true),
    SIX("6", 6, true),
    FIVE("5", 5, true),
    FOUR("4", 4, true),
    THREE("3", 3, true);

    private final String name;
    private final int rank;
    private final boolean hasSuit;

    PokerCardEnums(String name, int rank, boolean hasSuit) {
        this.name = name;
        this.rank = rank;
        this.hasSuit = hasSuit;
    }
}	
java 复制代码
@Getter
public enum SuitEnums {

    /**
     * 黑桃
     */
    SPADES("♠"),

    /**
     * 红桃
     */
    HEARTS("♥"),

    /**
     * 梅花
     */
    CLUBS("♣"),

    /**
     * 方块
     */
    DIAMONDS("♦");

    private final String desc;

    SuitEnums(String desc) {
        this.desc = desc;
    }

}

此时就能写出一张扑克牌的数据结构了:

java 复制代码
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Poker {

    private PokerCardEnums pokerCard;

    private SuitEnums suit;

    @Override
    public String toString() {
        return (Objects.nonNull(suit) ? suit.getDesc() : "") + pokerCard.getName();
    }
}

在扑克牌这个类中,也是重写了toString()方法,用于可视化的显示当前是哪一张牌。

牌堆-PokerPile

牌堆,是每一位斗地主玩家当前所持有的牌。那么肯定有个属性来区分当前牌堆的持有人的角色:userType

那么角色我们也可以用一个枚举类来实现:

java 复制代码
@Getter
public enum UserType {

    FARMER("农民"),

    LANDLORD("地主");

    private final String desc;

    UserType(String desc) {
        this.desc = desc;
    }
}

然后得有一个列表来存放当前持有的扑克牌:pokerList

两个重要的元素有了,那么出牌的顺序也需要加上:order

java 复制代码
public class PokerPile {
    
    /**
    * 当前玩家角色
    */
    private UserType userType;

    /**
    * 当前持有的牌
    */
    private List<Object> pokerList;

    /**
    * 出牌顺序
    */
    private Integer order;
}

出牌记录-PlayingRecord

对于出牌记录来说,只需要简单的记录下这轮次所处的牌以及当前轮次就行了。

java 复制代码
public class PlayingRecord {

    /**
     * 本次所出的牌
     */
    private List<Poker> usePokerList;

    /**
     * 当前的轮次
     */
    private Integer rounds;
}

记牌器-CardRecorder

这个记牌器的数据结构我想了比较久,突然想到一种比较奇技淫巧的方法。那就是一幅扑克牌总是会分配给三位玩家,那么我们只需要将这副牌存起来,然后在玩家出牌的时候,将这一张或这一次所出 的扑克牌的状态 设置成已经使用 ,剩下来没有使用的就自然而然能知道了。

这个时候,需要把往扑克牌增加一个新的属性use是否已经使用这张扑克牌。此时就能在记牌器中写出获取尚未使用的扑克牌的方法了。

java 复制代码
public class CardRecorder {

    /**
     * 一副扑克牌
     */
    private List<Poker> pokerList;

    /**
     * 返回尚未使用的扑克牌
     *
     * @return 尚未使用的扑克牌
     */
    public List<Poker> getUnusedPokerList() {
        return pokerList.stream()
                .filter(poker -> !poker.isUse())
                .collect(Collectors.toList());
    }
}

总结

现在已经构思好斗地主所涉及的数据结构了,那么下一篇文章就会开始玩法的代码开发了!

代码仓库:https://github.com/AzirZsk/FightTheLandlord

相关推荐
weixin_7275356236 分钟前
MinIO大文件上传深度拆解:从原理到生产落地的完整指南
java·中间件
雅客李1 小时前
2026年第三季度云手机实测 游戏多开挂机托管三维度数据公开
游戏·智能手机
摇滚侠1 小时前
Java 全栈开发实战教程 课程笔记 34-36
java·笔记
芝士熊爱编程1 小时前
创建型模式-单例模式
java·单例模式·设计模式
大模型码小白1 小时前
Spring AI 框架实战:Java 后端集成大模型的架构设计与工程落地
java·人工智能·python·spring
weixin_BYSJ19872 小时前
「课设设计」springboot校园超市助购系统26449 (附源码)
java·javascript·spring boot·python·django·flask·php
栋***t2 小时前
从“纸质试卷”到“AI智能组卷”,麦塔在线考试系统如何重构出题逻辑?
java·大数据·人工智能·算法·重构
CHANG_THE_WORLD2 小时前
深入理解递归:从函数调用到调用栈的完整执行过程
java·开发语言·算法
xexpertS2 小时前
CI/CD 熔断机制:如何通过编排级熔断器提升开发者效率
java·linux·运维
zy happy3 小时前
VMware虚拟机添加新的硬盘
java·linux·jvm·docker