目录
如想了解并学习顺序表,请查阅:ArrayList(顺序表)的介绍及自我实现(包括ArrayList如何扩容)
我们学习了顺序表ArrayList之后,那我们具体如何在实际中运用起来这个结构呢?
有如下问题:在日常生活中,我们都玩过扑克牌,那现在能否自己定义一个扑克牌类,并实现4个人玩扑克牌这样的操作(包括发牌,洗牌,展示牌)?
先定义一个扑克牌类(Card),其中包括两个属性:数值范围(rank(1~13)代表A~K),花色(suit);还包括重写的toString方法和数值转换方法(因为在扑克牌中没有1,11,12,13,要将这几个数字转换成A,J,Q,K)。
首先要初始化一副牌,我们可以将其定义为一个顺序表ArrayList,其中的元素为Card,然后通过遍历的方式,把所有花色和数字的牌都添加到这副牌中,就是初始化完成了。
现在,在这副牌中所有牌都是按顺序的,所以在给玩家发牌之前我们要先进行洗牌操作,可以通过官方定义好的shuffle方法完成洗牌操作。
四名玩家也是分别用四个顺序表来表示,表中存储的牌即代表他们手中的牌。
利用顺序表中的remove和add方法,将牌堆中的牌发给玩家。
利用addAll和clear方法,将牌返还牌堆,并将玩家手中的牌清空。
最后,结合洗牌,发牌,收牌操作,完成操作扑克牌。
- public class Card {
- private int rank; //值1->13 代表A->k
- private String suit; //花色♥、♣、♦、♠
-
- public Card(String suit,int rank) {
- this.suit = suit;
- this.rank = rank;
- }
-
- @Override
- public String toString() {
- return String.format("扑克[%s %s]",this.suit,rankStr());
- }
-
- private String rankStr(){
- if(rank==1){
- return "A";
- }
- else if(rank>=2&&rank<=10){
- return String.valueOf(rank);
- }else if(rank==11){
- return "J";
- }else if(rank==12){
- return "Q";
- }else{
- return "K";
- }
- }
-
- //用于测试
- public static void main(String[] args) {
- Card card = new Card("♥", 11);
- System.out.println(card); // card.toString()
- }
- }
为了方便理解,这里有些名称使用了中文,如有需要可以自己进行更改。
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Collections;
-
- public class TestCard {
- public static void main(String[] args) {
- // 定义一副牌,元素是 Card 对象
- List
一副牌 = new ArrayList<>(); - // 这副牌现在的空的(empty)
- // 初始化这副牌,一共 52 张
- String[] 所有的花色 = { "♥", "♠", "♦", "♣" };
- // 遍历所有的花色
- for (String suit : 所有的花色) { // 循环 4 次
- // 遍历 A -> K
- for (int rank = 1; rank <= 13; rank++) { // 循环 13 次
- // 定义一张牌
- Card card = new Card(suit, rank); // 执行 52 次
- // 把牌添加到 这副牌中
- 一副牌.add(card);
- }
- }
-
- // 打印
- System.out.println(一副牌); // 一副牌.toString()
-
-
- // 进行洗牌(shuffle)操作,直接使用官方定义的方法
- // Collections 和 Collection
- // 类似
- // Arrays 和 Array 的关系
- // Collections 提供了很多方便操作 Collection 的工具方法(静态的)
- // Arrays 提供了很多方便操作 数组(Array)的工具方法(静态的)
- Collections.shuffle(一副牌);
-
- // 打印,洗牌后
- System.out.println("洗牌后:"+一副牌); // 一副牌.toString()
-
- //发牌
- //定义四名玩家
- List
playerA=new ArrayList<>(); - List
playerB=new ArrayList<>(); - List
playerC=new ArrayList<>(); - List
playerD=new ArrayList<>(); -
- //发牌
- System.out.println("发牌前:"+一副牌.size());
- for (int i=0;i<5;i++){
- //按照A->B->C->D发牌
- //顺序表的头部就是牌堆顶部
- //从顺序表头部取出一张牌->顺序表的头删操作
- Card card=一副牌.remove(0);
- //发给对应的玩家A
- playerA.add(card);
-
- //发牌给B
- card=一副牌.remove(0);
- playerB.add(card);
-
- //发牌给C
- card=一副牌.remove(0);
- playerC.add(card);
-
- //发牌给D
- card=一副牌.remove(0);
- playerD.add(card);
- }
- System.out.println("发牌后:"+一副牌.size());
-
- //分别打印每个人手中的牌
- System.out.println(playerA);
- System.out.println(playerB);
- System.out.println(playerC);
- System.out.println(playerD);
-
- //收牌
- 一副牌.addAll(playerB);
- playerB.clear();
-
- 一副牌.addAll(playerB);
- playerB.clear();
-
- 一副牌.addAll(playerB);
- playerB.clear();
-
- 一副牌.addAll(playerB);
- playerB.clear();
-
- System.out.println(一副牌);
- System.out.println("收完牌:"+一副牌.size());
- Collections.shuffle(一副牌);
- System.out.println(一副牌);
- }
- }
由于截图无法左右滚动,未显示完全。
如有建议或想法,欢迎一起讨论学习~