题目描述
使用集合实现斗地主游戏的部分功能,要求如下:
(1)首先准备 54 张扑克牌并打乱顺序。
(2)由三个玩家交替摸牌,每人 17 张扑克牌,最后三张留作底牌。
(3)查看三个玩家手中的扑克牌和底牌。
(4)其中玩家手中的扑克牌需要按照大小顺序打印,规则如下:
手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
实现思路
- 封装一个扑克牌类、玩家类。针对于问题(4)排序,考虑到后面需要使用比较器定义比较规则,因此在扑克牌类中需要定义一个整型成员变量用来记录该张扑克牌的优先权重,定义比较器的时候使用该序列该进行比较即可实现扑克牌的排序功能(本题难点)
- 扑克牌对象的建立需要花色、号码、序列号:花色和号码分别用两个字符串数组存储并取出赋值给对象即可;序列号的选择根据对应的号码大小规则定义一个取值算法并赋值即可
- 使用Collctions集合中的shuffle()静态方法实现洗牌,sort()静态方法配合比较器实现排序
具体代码如下:
扑克牌Card类:
package com.lagou.subject03;
/**
* 扑克牌类
*/
public class Card {
private String num;
private String color;
private int seq; //用于存放扑克牌卡片的序列
public Card() {
}
public Card(String num, String color, int seq) {
this.num = num;
this.color = color;
this.seq = seq;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getSeq() {
return seq;
}
public void setSeq(int seq) {
this.seq = seq;
}
@Override
public String toString() {
return color + num;
}
}
玩家Player类:
package com.lagou.subject03;
import java.util.ArrayList;
/**
* 玩家类
*/
public class Player {
private String name;
private ArrayList<Card> myPokers;
public Player() {
}
public Player(String name, ArrayList<Card> myPokers) {
this.name = name;
this.myPokers = myPokers;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList<Card> getMyPokers() {
return myPokers;
}
public void setMyPokers(ArrayList<Card> myPokers) {
this.myPokers = myPokers;
}
}
游戏过程实现类:
package com.lagou.subject03;
import java.util.*;
/**
* 使用集合实现斗地主游戏的部分功能
* 使用集合List存放扑克牌
*/
public class Subject03Main {
public static void main(String[] args) {
//1、准备54张扑克牌
String[] colors = {"♠", "♥", "♣", "♦"};
String[] numbers = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
//2、创建List集合,将54张牌放入List集合中并且使用要求的排序将各张牌中存入序列
// 手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
List<Card> pokers = new ArrayList<>(54);
int seq; //用于存储序列
for (String color : colors) {
for (String number : numbers) {
//2-1、先定义该张牌的序列
if (number.equals("2")) {
seq = 3; //若是2,则序列为3
} else if (number.equals("A")) {
seq = 4; //若是A,则序列为4
} else if (number.equals("K")) {
seq = 5; //若是K,则序列为5
} else if (number.equals("Q")) {
seq = 6; //若是Q,则序列为6
} else if (number.equals("J")) {
seq = 7; //若是J,则序列为7
} else {
//先将其他数字的扑克牌转换为整数
int num = Integer.parseInt(number);
//将转换后的整数 * 3作为这些扑克牌的序列号
seq = num * 3;
}
//2-2、将牌添加进扑克牌集合中
pokers.add(new Card(number, color, seq));
}
}
pokers.add(new Card("大鬼", "", 1)); //添加大小鬼
pokers.add(new Card("小鬼", "", 2));
System.out.println("当前扑克牌有:" + pokers);
//3、洗牌打乱顺序
Collections.shuffle(pokers);
System.out.println("洗牌后的扑克牌:" + pokers);
//4、创建三个玩家并摸牌,每人17张,3张作为底牌
Player p1 = new Player("张三", new ArrayList<>());
Player p2 = new Player("关羽", new ArrayList<>());
Player p3 = new Player("刘备", new ArrayList<>());
ArrayList<Card> diPai = new ArrayList<>(3);
int i = 1; //计算发牌回合数
for (Card poker : pokers) {
if (i > pokers.size() - 3) {
diPai.add(poker);
} else if (i % 3 == 0) {
p1.getMyPokers().add(poker);
} else if (i % 3 == 1) {
p2.getMyPokers().add(poker);
} else {
p3.getMyPokers().add(poker);
}
i++;
}
//5、显示三个玩家摸到的牌
System.out.println("当前" + p1.getName() + "的牌有:" + p1.getMyPokers());
System.out.println("当前" + p2.getName() + "的牌有:" + p2.getMyPokers());
System.out.println("当前" + p3.getName() + "的牌有:" + p3.getMyPokers());
System.out.println("底牌是:" + diPai);
//6、将玩家手中的牌按照从大到小顺序排序打印
//6-1、定义比较器
Comparator<Card> comparator = (Card c1, Card c2) -> {
return c1.getSeq() - c2.getSeq();
};
//6-2、将三个玩家手中的牌进行顺序排列后并打印
//摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3
Collections.sort(p1.getMyPokers(), comparator);
Collections.sort(p2.getMyPokers(), comparator);
Collections.sort(p3.getMyPokers(), comparator);
System.out.println("排序后" + p1.getName() + "的牌有:" + p1.getMyPokers());
System.out.println("排序后" + p2.getName() + "的牌有:" + p2.getMyPokers());
System.out.println("排序后" + p3.getName() + "的牌有:" + p3.getMyPokers());
System.out.println("底牌是:" + diPai);
}
}