目录
前言:
本篇文章将分析学习Map后的一个小功能。适合先了解map后观看。
感谢大家的观看。
一、题目
设计实现一个斗地主游戏,该游戏可以生成牌,洗牌,发牌,三名玩家可以看到自己的底牌,也可以看到最后三张牌。
1.1 具体要求:
- 生成:生成54张扑克牌(四种花色*13+大小王);
- 洗牌:将五十四张牌随机打乱;
- 发牌:准备三名玩家,三人交替摸牌,最后三张底牌不能摸;
- 底牌:三人可以查看自己的牌和底牌,按照大小顺序展示。
1.2 题目分析:
思考:需要几个集合,分别保存什么样的数据?
-花色信息、点数信息、组合好的牌放在什么地方?
思考:如何比较每张牌的大小,相同数值的牌如何比较大小?
-给牌添加对应的权重值。
思考:洗牌需要用什么方法才能将集合中的元素顺序打乱?
思考:如何发牌,有什么注意事项?
二、输出展示
---将输出结果放在这里方便大家对程序有个方向。
我们需要输出底牌和三名玩家的手牌,并按照大小顺序排序。
三、程序框架
---简易的代码和注释,大家可以在此基础上扩展。
3.1 封装扑克类
//封装扑克类
class Card{
//花色
String color;
//点数
String number;
//权重(比大小所用)
int weight;
//构造器...set、get...
//重写:toString
//重写:......
//......
}
因为扑克牌中有JQKA2等不好比较大小,所以我们设置了成员--权重,用以比较他们的大小。
注意:
--这里也可以看出来我们这里的(key--value)关系。
--扑克牌--权重,扑克牌不相同,但是权重可以相同。
--比如♥三和♠三的权重都是一样的。
3.2 发牌测试类
Public class Test{
//牌--权重
Map<Card,Integer> map=new TreeMap<>();
//向map中添加元素
//...
//打乱
//集合工具类中的打乱方法
//需要先将集合的key存储在list中
Collections.shuffle(list);
//三人交替拿牌
List<Card> play1=new ArrayList<>();
List<Card> play2=new ArrayList<>();
List<Card> play3=new ArrayList<>();
//......
//直接取出底牌
List<Card> dipai=list.subList(51, 54);
//获取权重(key-->value),开始排序
//......
}
利用Card去找权重,完成排序。
注意:
--Collections.shuffle(list);是Collections工具类提供的静态方法,用于打乱。
--用权重排序需要重写自然排序,还需要考虑权重相同花色问题。
四、代码演示
---一千个伯乐有一千个哈利波特,大家的代码可以正常运行就行。
4.1 封装扑克类
//扑克牌类
public class Card implements Comparable<Card>{
//花色
private String color;
//点数
private String number;
//权重
private int weight;
//-------------构造器
public Card() {
}
public Card(String color, String number) {
this.color = color;
this.number = number;
}
//------------get、set
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
// 关键:重写equals方法
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Card card = (Card) o;
return Objects.equals(color, card.color) && Objects.equals(number, card.number);
}
// 关键:重写hashCode方法
@Override
public int hashCode() {
return Objects.hash(color, number);
}
// 关键:重写compareTo方法
@Override
public int compareTo(Card o) {
int num;
num=this.weight-o.weight;
if(num==0){
num=colormath(this.color)-colormath(o.color);
}
return num;
}
//花色比较
public int colormath(String color){
if(color.equals("红桃")){return 1;}
else if(color.equals("方片")){return 2;}
else if(color.equals("黑桃")){return 3;}
else if(color.equals("梅花")){return 4;}
return 0;
}
//重写toString
@Override
public String toString() {
return color + number +" ";
}
}
4.2 发牌测试类
public class Test {
public static void main(String[] args) {
Map<Card,Integer> map=new TreeMap<>();
//调用添加方法,在代码最下面
Add.addCard(map,"红桃");
Add.addCard(map,"方片");
Add.addCard(map,"黑桃");
Add.addCard(map,"梅花");
Card card1=new Card("大丑","大丑");card1.setWeight(17);
map.put(card1,17);
Card card2=new Card("小丑","小丑");card2.setWeight(16);
map.put(card2,16);
//System.out.println("总"+map.size());
//System.out.println(map);
//打乱
//将map的key存入list
List<Card> list = new ArrayList<>(map.keySet());
Collections.shuffle(list);
//保留三张,开始拿牌,一人17张
// List<Card> play1=list.subList(0, 17);
// List<Card> play2=list.subList(17, 34);
// List<Card> play3=list.subList(34, 51);
// List<Card> dipai=list.subList(51, 54);
//三人交替拿牌
List<Card> play1=new ArrayList<>();
List<Card> play2=new ArrayList<>();
List<Card> play3=new ArrayList<>();
List<Card> dipai=list.subList(51, 54);
for(int i=0;i<list.size()-4;i++){
Card card=list.get(i);
switch (i%3) {
case 0:
play1.add(card);
break;
case 1:
play2.add(card);
break;
case 2:
play3.add(card);
break;
default:
break;
}
}
//获取权重,开始排序
play1.sort(Comparator.comparingInt(card -> map.get(card)));
play2.sort(Comparator.comparingInt(card -> map.get(card)));
play3.sort(Comparator.comparingInt(card -> map.get(card)));
System.out.println("玩家一:"+play1);
System.out.println("玩家二:"+play2);
System.out.println("玩家三:"+play3);
dipai.sort(Comparator.comparingInt(card->map.get(card)));
System.out.println("底牌:"+dipai);
}
}
//添加方法
class Add{
public static void addCard(Map<Card,Integer> map,String color){
for(int i=3;i<16;i++){
String s=String.valueOf(i);
if(i==14){
Card card14=new Card(color,"A"); card14.setWeight(i);
map.put(card14,i);continue;
}
else if(i==15){
Card card15=new Card(color,"2");card15.setWeight(i);
map.put(card15,i);continue;
}
else if(i==11){
Card card11=new Card(color,"J");card11.setWeight(i);
map.put(card11,i);continue;
}
else if(i==12){
Card card12=new Card(color,"Q");card12.setWeight(i);
map.put(card12,i);continue;
}
else if(i==13){
Card card13=new Card(color,"K");card13.setWeight(i);
map.put(card13,i);continue;
}
else {
Card card = new Card(color, s);card.setWeight(i);
map.put(card,i);
}
}
}
}
上述代码的基本思想:
将花色和点数是牌的基本特征作为唯一key键,可以相同用于比较的权重作为value值,通过get方法将权重值输入对应Card对象,最后通过重写的自然排序完成牌面大小的输出。
虽然,用集合完成斗地主发牌程序只是一个“小练习”,但是却是我们从理论到实践的一大步。它不仅帮助我们巩固了知识,更是让我们明白“编程解决实际问题”的乐趣。
你还能想到运用学过的知识可以完成什么小程序呢?
当然,集合只是Java学习中的一小部分,后续我们将会学习:并发集合(如:ConcurrentHashMap,应对多线程场景)、Stream API(简化集合的遍历与处理)等。
希望大家多多努力。
OK,本篇内容到此结束!!感谢大家的观看。
风铃响,故人归;
秋风秋风快快回。