首先创建牌的属性Card类
public class Card {
private String suit;//牌的花色
private int rank;//牌的面值
public Card(String suit, int rank) {
this.suit = suit;
this.rank = rank;
}
@Override
public String toString() {
return "{" + suit + rank + "}";
}
}
在牌的功能类CardFunc中依次实现买牌(创建牌),洗牌,发牌等功能
买牌方法:
这里为了好表示就去除了大王和小王,剩余52张牌,可以通过循环依次创建
public class Cardfunc {
//花色的种类
public static final String[] suits = {"♥", "♠", "♣", "♦"};
//买牌
public List<Card> buyCard() {
List<Card> cardList = new ArrayList<>();
for (int i = 1; i < 13; i++) {
for (int j = 0; j < 4; j++) {
int rank = i;
String suit = suits[j];
Card card = new Card(suit, rank);
cardList.add(card);
}
}
return cardList;
}
}
测试类测试一下
public class Test {
public static void main(String[] args) {
Cardfunc cardfunc = new Cardfunc();
//买牌
System.out.println("洗牌前");
List<Card> cardList = cardfunc.buyCard();
System.out.println(cardList);
}
}
接下来实现洗牌功能
//洗牌
public void shuffle(List<Card> cardList) {
Random random = new Random();
for (int i = cardList.size() - 1; i > 0; i--) {
int index = random.nextInt(i);
swap(cardList, i, index);
}
}
//被调用的交换方法
private void swap(List<Card> cardlist, int i, int j) {
Card tmp = cardlist.get(i);
cardlist.set(i, cardlist.get(j));
cardlist.set(j, tmp);
}
randdom.nextInt(i)会返回一个大于等于0小于i的数字
上述for循环的逻辑就是从第52张牌与前依次面随机一张牌交换,从而实现洗牌功能
测试一下:
public class Test {
public static void main(String[] args) {
Cardfunc cardfunc = new Cardfunc();
//买牌
System.out.println("洗牌前");
List<Card> cardList = cardfunc.buyCard();
System.out.println(cardList);
//洗牌
System.out.println("洗牌后");
cardfunc.shuffle(cardList);
System.out.println(cardList);
}
}
实现发牌方法:
//发牌
public List<List<Card>> play(List<Card> cardList) {
//选手一
List<Card> hand0 = new ArrayList<>();
//选手三
List<Card> hand1 = new ArrayList<>();
//选手二
List<Card> hand2 = new ArrayList<>();
List<List<Card>> hand = new ArrayList<>();
hand.add(hand0);
hand.add(hand1);
hand.add(hand2);
//三个人 每个人轮流摸五张牌
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 3; j++) {
Card card = cardList.remove(0);
hand.get(j).add(card);
}
}
return hand;
}
List<List<Card>>类似与一个二维数组,如下图
测试一下:
public class Test {
public static void main(String[] args) {
Cardfunc cardfunc = new Cardfunc();
//买牌
System.out.println("洗牌前");
List<Card> cardList = cardfunc.buyCard();
System.out.println(cardList);
//洗牌
System.out.println("洗牌后");
cardfunc.shuffle(cardList);
System.out.println(cardList);
//3个人 每个人轮流摸5张牌
List<List<Card>> ret = cardfunc.play(cardList);
for (int i = 0; i < ret.size(); i++) {
System.out.println("第" + (i + 1) + "个人的牌" + ret.get(i));
}
System.out.println("剩下的牌");
System.out.println(cardList);
}
}
第一次
第二次
可见每次都具有随机性