【Java学习笔记】斗地主规则抽牌模拟(利用LinkedList集合及Collections集合工具类实现)
【Java学习笔记】斗地主规则抽牌模拟(利用LinkedList集合及Collections集合工具类实现)
在这个需求下,我分别设计了3个类:PokerCard(扑克牌)类、PokerCardDeck(牌堆)类、Player(玩家)类。
一、属性分析
PokerCard(扑克牌)类中有两个属性:
//表示1副扑克牌的编号,整数类型,0-53private int id;//表示扑克牌的值,整数类型,3最小,大王最大,分别对应0-14private int cardValue;
PokerCardDeck(牌堆)类中有三个属性:
//表示牌堆,内容为PokerCard的LinkedList//采用LinkedList集合来表示扑克牌堆,它具有查找慢,增删快的特点,比较适合表示扑克牌堆private LinkedList<PokerCard> pokerCardDeck = new LinkedList<>();
Player(玩家)类中有三个属性:
//姓名,字符串类型private String name;//用分表示的钱,整数类型private int money;//表示手牌,一个PokerCardDeck类的对象集合private PokerCardDeck handCards = new PokerCardDeck();
二、方法分析
(一)PokerCard(扑克牌)类
在PokerCard(扑克牌)类中,除了基本的无参构造、geter、seter方法之外,着重讲四个核心方法:
一是有参构造,我可以通过扑克牌的编号来唯一确定其花色和值,那么有参构造只需要传递扑克牌的编号即可:
public PokerCard(int id) {this.id = id;//区分大小王,设id值为52、53分别为大小王,其值高于其他的牌,分别设为13、14if(id < 52){this.cardValue = id % 13;}else if(id == 52){this.cardValue = 13;}else {this.cardValue = 14;}}
二是翻译扑克牌的值为牌面值的方法,现实我们看到牌面值比如:“2”、“A”、“K”等等就知道哪张牌大,但计算机需要翻译一下,反之亦然:
//将扑克牌值转换成牌面值的字符串的方法private String translateCardValue (){String str = "";switch (this.cardValue){//大王与小王不需要翻译case 14:break;case 13:break;case 12:str = "2";break;case 11:str = "A";break;case 10:str = "K";break;case 9:str = "Q";break;case 8:str = "J";break;//3是最小的,值为0,所以牌面值就是cardValue值+3在转换成字符串default:str = (this.cardValue+3+"");}return str;}
三是重写toString方法,将花色+牌面值格式化输出:
//重写toString方法,根据id值判断以方便直接输出@Overridepublic String toString() {String str = "";switch (this.id / 13){case 0:str += "方块♦";break;case 1:str += "梅花♣";break;case 2:str += "红桃♥";break;case 3:str += "黑桃♠";break;default :if(id == 52){str += "joker";} else {str += "JOKER";}}str += this.translateCardValue();return str;}
四是为方便手牌的排序,我们需要让PokerCard实现Comparable接口,并重写其中的CompareTo方法:
public class PokerCard implements Comparable<PokerCard>{...}
//实现了Comparable接口,则必须重写compareTo方法,用于比较两个PokerCard对象的大小//扑克牌采用降序排序,故用o - this@Overridepublic int compareTo(PokerCard o) {//如果值相等,则比较id值,因为花色大的id值也大,相当于比花色if(o.getCardValue() == this.getCardValue()){return o.getId() - this.getId();}else {return o.getCardValue() - this.getCardValue();}}
(二)PokerCardDeck(牌堆)类
在PokerCardDeck(牌堆)类中,除了基本的构造方法、geter、seter方法之外,也着重讲四个核心方法:
一是填充牌堆方法:
//初始化填充牌堆,默认有1副牌public void fillDeck(){for (int i = 0; i < 54; i++) {this.pokerCardDeck.add(new PokerCard(i));}//执行一次洗牌方法shuffleDeck();}//fillDeck方法的重载,带参数n,表示有n副牌,保留功能public void fillDeck(int n){for(int j = 0;j < n ;j++){for (int i = 0; i < 54; i++) {this.pokerCardDeck.add(new PokerCard(i));}}//执行一次洗牌方法shuffleDeck();}
二是洗牌方法,Collections集合工具类中有现成的乱序方法shuffle,拿来用即可:
//利用Collections类中shuffle方法来乱序牌堆public void shuffleDeck(){Collections.shuffle(this.pokerCardDeck);}
三是排序方法,之前在PokerCard(扑克牌)类中实现接口并重写方法就为了能够正常使用Collections集合工具类中有现成的排序方法sort:
//利用Collections类中的sort方法进行排序public void sortDeck(){Collections.sort(this.pokerCardDeck);}
四是格式化打印牌堆的方法:
//格式化打印牌堆的方法,每隔5张牌换行public void printDeck(){//LinkedList是有序的,可以通过索引来访问数据for (int i = 0; i < pokerCardDeck.size(); i++) {if(i != 0 && i%5 == 0){System.out.println();}System.out.print(pokerCardDeck.get(i) + "\t");}System.out.println();}
(三)Player(玩家)类
在Player(玩家)类中,除了基本的无参构造、geter、seter方法之外,着重讲两个核心方法:
一是有参构造,钱数属性在这个例子中没有实际使用到,但也保留着相应的构造方法:
public Player(String name) {this.name = name;}public Player(String name, int money) {this.name = name;this.money = money;}
二是抽牌的方法,这里返回一个布尔值,用来表示抽牌是否成功:
//抽牌方法,从牌堆顶中弹出一张牌,Player手牌增加一张牌public boolean drawCard(PokerCardDeck pokerCardDeck){//抽牌规则采用1副牌的斗地主规则,留三张底牌共地主使用if(pokerCardDeck.getPokerCardDeck().size() == 3){return false;}this.handCards.getPokerCardDeck().add(pokerCardDeck.getPokerCardDeck().pop());return true;}//抽牌方法的重载,适用于n副牌的斗地主public boolean drawCard(PokerCardDeck pokerCardDeck,int n){if(pokerCardDeck.getPokerCardDeck().size() == (3*n)){return false;}this.handCards.getPokerCardDeck().add(pokerCardDeck.getPokerCardDeck().pop());return true;}
三、程序入口main
不罗嗦了,上代码:
public class Application {public static void main(String[] args) {PokerCardDeck deck = new PokerCardDeck();Player player1 = new Player("刘备");Player player2 = new Player("关羽");Player player3 = new Player("张飞");deck.fillDeck();//边判断边执行,drawCard方法返回的是布尔值while (player1.drawCard(deck) && player2.drawCard(deck) && player3.drawCard(deck)){}System.out.println(player1.getName() + "的牌是:");player1.getHandCards().sortDeck();player1.getHandCards().printDeck();System.out.println(player2.getName() + "的牌是:");player2.getHandCards().sortDeck();player2.getHandCards().printDeck();System.out.println(player3.getName() + "的牌是:");player3.getHandCards().sortDeck();player3.getHandCards().printDeck();System.out.println("3张底牌是:");deck.printDeck();}
}
程序运行的结果如下:
刘备的牌是:
joker 黑桃♠2 方块♦2 梅花♣A 方块♦A
黑桃♠K 方块♦K 黑桃♠J 梅花♣J 黑桃♠9
梅花♣9 红桃♥8 黑桃♠7 梅花♣7 红桃♥6
黑桃♠4 黑桃♠3
关羽的牌是:
JOKER 红桃♥2 黑桃♠A 红桃♥A 红桃♥K
梅花♣K 黑桃♠Q 梅花♣Q 方块♦Q 红桃♥J
方块♦J 方块♦9 红桃♥7 红桃♥5 红桃♥4
方块♦4 方块♦3
张飞的牌是:
梅花♣2 红桃♥Q 黑桃♠10 红桃♥10 方块♦10
黑桃♠8 梅花♣8 方块♦8 方块♦7 黑桃♠6
梅花♣6 黑桃♠5 梅花♣5 方块♦5 梅花♣4
红桃♥3 梅花♣3
3张底牌是:
方块♦6 梅花♣10 红桃♥9
3D这运气,实锤黑脸了。
20200706
【Java学习笔记】斗地主规则抽牌模拟(利用LinkedList集合及Collections集合工具类实现)相关推荐
- Java学习笔记⑥(scanner的使用、Random的使用、ArrayList集合)
一.scanner的使用 package cn.itcast.day07.demo01; import java.util.Scanner;//1.导包 Scanner类的功能:可以实现键盘输入数据, ...
- Java学习笔记10---访问权限修饰符如何控制成员变量、成员方法及类的访问范围...
1.Java有三种访问权限修饰符,分别为public.protected.private,还有一种为缺省权限修饰符的情况,记为default.其中,可以由public和default来修饰类:这四种修 ...
- Java学习笔记Day02
Java学习笔记Day02 一.细化Hello程序 1.详解代码 //公有的类,叫做Hello public class Hello{//主方法public static void main(Stri ...
- Java学习笔记--StringTokenizer的使用
2019独角兽企业重金招聘Python工程师标准>>> Java Tips: 使用Pattern.split替代String.split String.split方法很常用,用于切割 ...
- Java学习笔记:2022年1月10日
Java学习笔记:2022年1月10日 摘要:这篇笔记主要记录了学习<Java核心技术 卷一>的第四章时的一些心得,主要阐述了对象与类这一部分的内容.需要注意的是,这一章的内容需要精心 ...
- java学习笔记13--反射机制与动态代理
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...
- java学习笔记15--多线程编程基础2
本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...
- 《Java学习笔记(第8版)》学习指导
<Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...
- 【Java】Java学习笔记(2)——Java面向对象基础作业函数题
本人私人博客:Megalomania,大部分文章会现在博客上传,有不足之处欢迎指正. 学校小学期Java课程的练习题,留个档便于以后需要时候有例子可以回忆,写的烂的地方请多多包含 1.求两个数值之和 ...
- Java学习笔记(原创)
Java学习笔记(原创) 2011-12-01 16:37:00| 分类: Java|举报|字号 订阅 下载LOFTER客户端 基本知识 一. Java基础 1. java语言的特点: ①简单:没有 ...
最新文章
- FPGA管脚分配需要考虑的因数
- java设计模式_工厂方法
- Cocoa的MVC架构分析 cocoa的mvc实现
- 【专升本计算机】甘肃省专升本计算机基础--判断题--汇编(737道带答案)
- [scikit-learn 机器学习] 8. 非线性分类和决策树
- 阿里巴巴 DevOps 工具体系
- 地图统计_博客 城市访问量统计并且通过Echarts+百度地图展示
- callback回调使用 vue_Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸
- 交通灯matlab程序,毕业论文设计(交通灯).doc
- 分销系统的用户关系数据库设计~
- 程序设计的最基本的三种结构
- python生成树状图_使用python的分层聚类树状图
- ABAP 计算时间差
- 如何查看Excel文件最大行数
- 软件测试实例-如何测试一个杯子
- LeetCode久不久来一题系列之Add Two Numbers
- Qt5学习之位置函数
- Twitter新任80后印度裔CEO,为啥是他?
- 前后端交互之——AJAX提交
- CC00027.elasticsearch——|HadoopElasticSearch.V27|——|ELK.v27|集群|QueryDSL|高亮|