【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集合工具类实现)相关推荐

  1. Java学习笔记⑥(scanner的使用、Random的使用、ArrayList集合)

    一.scanner的使用 package cn.itcast.day07.demo01; import java.util.Scanner;//1.导包 Scanner类的功能:可以实现键盘输入数据, ...

  2. Java学习笔记10---访问权限修饰符如何控制成员变量、成员方法及类的访问范围...

    1.Java有三种访问权限修饰符,分别为public.protected.private,还有一种为缺省权限修饰符的情况,记为default.其中,可以由public和default来修饰类:这四种修 ...

  3. Java学习笔记Day02

    Java学习笔记Day02 一.细化Hello程序 1.详解代码 //公有的类,叫做Hello public class Hello{//主方法public static void main(Stri ...

  4. Java学习笔记--StringTokenizer的使用

    2019独角兽企业重金招聘Python工程师标准>>> Java Tips: 使用Pattern.split替代String.split String.split方法很常用,用于切割 ...

  5. Java学习笔记:2022年1月10日

    Java学习笔记:2022年1月10日 ​ 摘要:这篇笔记主要记录了学习<Java核心技术 卷一>的第四章时的一些心得,主要阐述了对象与类这一部分的内容.需要注意的是,这一章的内容需要精心 ...

  6. java学习笔记13--反射机制与动态代理

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note13.html,转载请注明源地址. Java的反射机制 在Java运行时环境中,对于任意 ...

  7. java学习笔记15--多线程编程基础2

    本文地址:http://www.cnblogs.com/archimedes/p/java-study-note15.html,转载请注明源地址. 线程的生命周期 1.线程的生命周期 线程从产生到消亡 ...

  8. 《Java学习笔记(第8版)》学习指导

    <Java学习笔记(第8版)>学习指导 目录 图书简况 学习指导 第一章 Java平台概论 第二章 从JDK到IDE 第三章 基础语法 第四章 认识对象 第五章 对象封装 第六章 继承与多 ...

  9. 【Java】Java学习笔记(2)——Java面向对象基础作业函数题

    本人私人博客:Megalomania,大部分文章会现在博客上传,有不足之处欢迎指正. 学校小学期Java课程的练习题,留个档便于以后需要时候有例子可以回忆,写的烂的地方请多多包含 1.求两个数值之和 ...

  10. Java学习笔记(原创)

    Java学习笔记(原创) 2011-12-01 16:37:00|  分类: Java|举报|字号 订阅 下载LOFTER客户端 基本知识 一. Java基础 1. java语言的特点: ①简单:没有 ...

最新文章

  1. FPGA管脚分配需要考虑的因数
  2. java设计模式_工厂方法
  3. Cocoa的MVC架构分析 cocoa的mvc实现
  4. 【专升本计算机】甘肃省专升本计算机基础--判断题--汇编(737道带答案)
  5. [scikit-learn 机器学习] 8. 非线性分类和决策树
  6. 阿里巴巴 DevOps 工具体系
  7. 地图统计_博客 城市访问量统计并且通过Echarts+百度地图展示
  8. callback回调使用 vue_Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸
  9. 交通灯matlab程序,毕业论文设计(交通灯).doc
  10. 分销系统的用户关系数据库设计~
  11. 程序设计的最基本的三种结构
  12. python生成树状图_使用python的分层聚类树状图
  13. ABAP 计算时间差
  14. 如何查看Excel文件最大行数
  15. 软件测试实例-如何测试一个杯子
  16. LeetCode久不久来一题系列之Add Two Numbers
  17. Qt5学习之位置函数
  18. Twitter新任80后印度裔CEO,为啥是他?
  19. 前后端交互之——AJAX提交
  20. CC00027.elasticsearch——|HadoopElasticSearch.V27|——|ELK.v27|集群|QueryDSL|高亮|

热门文章

  1. 朋友圈发布时间(Date、DateFormat、Calendar)
  2. Publish over SSH 插件配置
  3. 对抗样本的创建和防御
  4. WP-Super-Cache的使用
  5. 视频演示SHAtter越狱iOS 4.1
  6. wordpress企业站模板
  7. 如何使用谷歌搜索API来获取结果
  8. 链接形式的客服代码 QQ客服代码
  9. 【独家分享】QQ常见网络骗术***战
  10. Qt编写小清新风格界面