题目:
按照斗地主的规则,完成洗牌发牌的动作。
具体规则:
使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
1.创建Card对象类
package com.sy.day02.work;
/**
* @Author: ShenYang
* @Date: 2023-06-13-16:40
* @Description: TODO
* <p>
* comment:
**/
public class Card{
//牌型
private String type;
//牌值
private String value;
//牌大小
private Integer size;
@Override
public String toString() {
return type+value+" ";
}
public Card(String type, String value, Integer size) {
this.type = type;
this.value = value;
this.size = size;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
this.size = size;
}
}
2.创建主类(包含deal()发牌方法)
package com.sy.day02.work;
import java.util.*;
/**
* @Author: ShenYang
* @Date: 2023-06-13-16:38
* @Description: TODO
* <p>
* comment:
* 2.按照斗地主的规则,完成洗牌发牌的动作。
* * * 具体规则:
* * * 使用54张牌打乱顺序,三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。
**/
public class Card_Test {
public static void main(String[] args) {
//无序、唯一
HashSet<Card> set = new HashSet<>();
//创建54张不同的牌,加入牌型、大小
String[] type = new String[]{"黑桃", "红桃", "方片", "梅花"};
for(String t: type){
for (int i=1; i<=13; i++){
if (i==1){
set.add(new Card(t, "A", 14));
}else if(i==11){
set.add(new Card(t, "J", 11));
}else if(i==12){
set.add(new Card(t, "Q", 12));
}else if(i==13){
set.add(new Card(t, "K", 13));
}else if(i==2){
set.add(new Card(t, "2", 15));
}else {
set.add(new Card(t, i+"", i));
}
}
}
set.add(new Card("大", "王", 17));
set.add(new Card("小", "王", 16));
//打印原始牌库
System.out.println(set);
List<Card> set1 = new ArrayList<>();
List<Card> set2 = new ArrayList<>();
List<Card> set3 = new ArrayList<>();
List<Card> set4 = new ArrayList<>();
//发牌方法
deal(set, set1, set2, set3, set4);
//自定义排序规则,对玩家的手牌从小到大排序
Comparator comparator = new Comparator<Card>() {
@Override
public int compare(Card o1, Card o2) {
return o1.getSize()> o2.getSize()?1:(o1.getSize()==o2.getSize()?0:-1);
}
};
Collections.sort(set1, comparator);
Collections.sort(set2, comparator);
Collections.sort(set3, comparator);
Collections.sort(set4, comparator);
System.out.println("玩家一 :");
Iterator<Card> iterator1 = set1.iterator();
while (iterator1.hasNext()){
System.out.print(iterator1.next().toString());
}
System.out.println('\n');
System.out.println("玩家二 :");
Iterator<Card> iterator2 = set2.iterator();
while (iterator2.hasNext()){
System.out.print(iterator2.next().toString());
}
System.out.println('\n');
System.out.println("玩家三 :");
Iterator<Card> iterator3 = set3.iterator();
while (iterator3.hasNext()){
System.out.print(iterator3.next().toString());
}
System.out.println('\n');
System.out.println("底牌 :");
Iterator<Card> iterator4 = set4.iterator();
while (iterator4.hasNext()){
System.out.print(iterator4.next().toString());
}
}
static void deal(HashSet<Card> set, List<Card> set1, List<Card> set2, List<Card> set3, List<Card> set4){
//set 为所有牌, set1, set2, set3 表示3个玩家, set4是最后3张底牌
//set储存时顺序打乱一次,转换成List
List list = new ArrayList<>(set);
//第二次打乱,Collections工具
Collections.shuffle(list);
//随机数取牌,相当于第三次打乱
Random random = new Random();
//轮流抽牌,各17张
for(int i=0; i<17; ++i){
set1.add((Card)list.remove(random.nextInt(list.size())));
set2.add((Card)list.remove(random.nextInt(list.size())));
set3.add((Card)list.remove(random.nextInt(list.size())));
}
set4.add((Card) list.get(0));
set4.add((Card) list.get(1));
set4.add((Card) list.get(2));
}
}
结果:
