从零开始写游戏之斗地主-数据结构-CSDN博客
文章浏览阅读461次,点赞5次,收藏9次。最近看游戏直播的过程中,老是看到主播在玩欢乐斗地主。突发奇想,我能不能用Java写一个斗地主的游戏呢?说干就干!Java天下第一(开玩笑的)。
斗地主这个玩法大家都知道A~K各4张,再加上大小王各一张,总共54张牌。有两个阵营:地主和农民,其中两个农民各持有17张牌,地主持有21张牌。根据上面的信息以及平常斗地主时的经历,我们就能先一步构想出斗地主设计的一些数据结构了。
数据结构
扑克牌-Poker
我们都知道一张扑克牌有着两种属性:大小以及花色。当然了,大小王肯定是排除在外滴。所以自然而然就能写出扑克牌对应的类了。扑克牌大小以及花色都能用一个枚举来声明:
@GetterpublicenumPokerCardEnums{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);privatefinalString name;privatefinalint rank;privatefinalboolean hasSuit;PokerCardEnums(String name,int rank,boolean hasSuit){this.name = name;this.rank = rank;this.hasSuit = hasSuit;}}@GetterpublicenumSuitEnums{/** * 黑桃 */SPADES("♠"),/** * 红桃 */HEARTS("♥"),/** * 梅花 */CLUBS("♣"),/** * 方块 */DIAMONDS("♦");privatefinalString desc;SuitEnums(String desc){this.desc = desc;}}此时就能写出一张扑克牌的数据结构了:
@Data@NoArgsConstructor@AllArgsConstructorpublicclassPoker{privatePokerCardEnums pokerCard;privateSuitEnums suit;@OverridepublicStringtoString(){return(Objects.nonNull(suit)? suit.getDesc():"")+ pokerCard.getName();}}在扑克牌这个类中,也是重写了toString()方法,用于可视化的显示当前是哪一张牌。
牌堆-PokerPile
牌堆,是每一位斗地主玩家当前所持有的牌。那么肯定有个属性来区分当前牌堆的持有人的角色:userType。那么角色我们也可以用一个枚举类来实现:
@GetterpublicenumUserType{FARMER(“农民”),LANDLORD(“地主”);privatefinalString desc;UserType(String desc){this.desc = desc;}}然后得有一个列表来存放当前持有的扑克牌:pokerList。两个重要的元素有了,那么出牌的顺序也需要加上:order
publicclassPokerPile{/** * 当前玩家角色 */privateUserType userType;/** * 当前持有的牌 */privateList<Object> pokerList;/** * 出牌顺序 */privateInteger order;}
出牌记录-PlayingRecord
对于出牌记录来说,只需要简单的记录下这轮次所处的牌以及当前轮次就行了。
publicclassPlayingRecord{/** * 本次所出的牌 */privateList<Poker> usePokerList;/** * 当前的轮次 */privateInteger rounds;}
记牌器-CardRecorder
这个记牌器的数据结构我想了比较久,突然想到一种比较奇技淫巧的方法。那就是一幅扑克牌总是会分配给三位玩家,那么我们只需要将这副牌存起来,然后在玩家出牌的时候,将这一张或这一次所出的扑克牌的状态设置成已经使用,剩下来没有使用的就自然而然能知道了。这个时候,需要把往扑克牌增加一个新的属性use是否已经使用这张扑克牌。此时就能在记牌器中写出获取尚未使用的扑克牌的方法了。
publicclassCardRecorder{/** * 一副扑克牌 */privateList<Poker> pokerList;/** * 返回尚未使用的扑克牌 * * @return 尚未使用的扑克牌 */publicList<Poker>getUnusedPokerList(){return pokerList.stream().filter(poker ->!poker.isUse()).collect(Collectors.toList());}}
总结
现在已经构思好斗地主所涉及的数据结构了,那么下一篇文章就会开始玩法的代码开发了!代码仓库:https://github.com/AzirZsk/FightTheLandlord
Xxl-Job定时任务调度失败的排查与解决 3389
一文带你读懂RocketMQ5中定时消息实现原理 1541
ChatGPT介绍 1309
新版攻略-如何发布Java代码到中央仓库中 1219
【Java引用规范】强软引用 1028
RocketMQ特性详解 3篇
Java引用关系 2篇
ThreadLocal详解 2篇
Java 数据结构 1篇
Java底层 3篇
Spring Framework 2篇
Spring Aop 1篇
深入源码,探究#、$号替换符的区别CSDN-Ada助手: Java 技能树或许可以帮到你:https://edu.csdn.net/skill/java?utm_source=AI_act_java
深度探索RocketMQ5:定时消息新特性解析【上】qq_41685877: 哥们很棒!
一个开源的工具类轮子是怎么造出来的CSDN-Ada助手: 恭喜作者第20篇博客《一个开源的工具类轮子是怎么造出来的》,阅读了您的分享,深感受益匪浅。持续创作是非常了不起的事情,希望您能坚持下去,继续分享您的见解和经验。或许下一步可以探讨一下如何优化开源工具类轮子的性能,或者分享一些实用的开源工具类轮子的应用场景。期待您更多的精彩内容,谢谢您的分享!
Redisson中分布式锁的实现原理CSDN-Ada助手: 恭喜您在博客中分享了Redisson中分布式锁的实现原理,让读者们更加深入地了解了这一领域的知识。希望您能继续坚持创作,分享更多有价值的内容给大家。或许下一步可以探讨一下Redisson在分布式系统中的应用场景,或者是与其他分布式锁实现进行比较分析,为读者提供更全面的视角。期待您更多的精彩文章!愿您在创作道路上不断进步,谢谢您的分享!
深度探索RocketMQ5:定时消息新特性解析【上】CSDN-Ada助手: 恭喜作者发布了第15篇博客,内容深度探索RocketMQ5的定时消息新特性,非常值得学习!希望作者能够继续保持创作的热情和耐心,为大家带来更多有深度的技术分享。下一步建议可以考虑探索RocketMQ5其他新功能或者与其他消息中间件的对比分析,期待作者的更多精彩内容!
Netty系列之为什么Netty是网络编程的首选
用好Interceptor,你也能写一个MybatisPlus
深入源码,探究#、$号替换符的区别
2024年20篇2023年1篇2021年4篇2020年2篇- RocketMQ特性详解 3篇
- Java引用关系 2篇
- ThreadLocal详解 2篇
- Java 数据结构 1篇
- Java底层 3篇
- Spring Framework 2篇
- Spring Aop 1篇
FAQ
gg撲克台灣可以玩嗎?
最多美國人在打的撲克APP,Club GG你可不能錯過了! 不論你在台灣、香港、馬來西亞、美國等等地區遊玩,而且不需要下載模擬器,直接下載程式即
台灣可以玩德州撲克嗎?
以往德州撲克在台灣許多人眼裡就是賭博,甚至有許多不好的刻板印象。 但經過多位前輩的努力爭取下,如今德州撲克不僅在台灣是合法的競技比賽,更是國際
線上德州撲克可以賺錢嗎?
投入德州撲克能賺多少錢,要看自己本身有沒有熱忱和付出多少,心態、情緒、撲克資金控管、撲克技術,以及天時、地利、人和等因素都會影響最終獲利。 以
神來也德州撲克要錢嗎?
MyCard娛樂中心» 神來也德州撲克 千萬撲克玩家鬥心機,按一下就入桌! 正宗撲克玩法,免註冊,免費體驗Texas Poker!
撲克牌幾張?
遊戲的目標是最先打完手上全部的牌。 第一位玩家需要打出一至三張牌,背面向上,覆蓋在桌上,並告訴全部玩家所出的是甚麼牌,例如「一張Q」。 出牌的玩
桌遊是賭博嗎?
當你玩的遊戲偶然性質越低、人為影響越高,就越不容易被視為賭博。 如果是一些燒腦的桌遊、象棋等等,大家都是在同一個起跑點,勝負的因素也不靠運氣,
台灣可以玩德州撲克嗎?
以往德州撲克在台灣許多人眼裡就是賭博,甚至有許多不好的刻板印象。 但經過多位前輩的努力爭取下,如今德州撲克不僅在台灣是合法的競技比賽,更是國際
德州撲克1bb是多少錢?
左邊第二位玩家叫做大盲(Big Blind),簡稱【BB】。 在還沒發牌前,小盲位要先支付0.5個大盲注,大盲位要先支付1個大盲注。 起始盲注大小
德州撲克 犯法 嗎?
根據社會秩序維護法第84條規定:「於非公共場所或非公眾得出入之職業賭博場所,賭博財物者,處新臺幣九千元以下罰鍰。」 如果只是朋友聚會的暫時性娛