首先创建牌的属性Card类
public class Card {private String suit;//牌的花色private int rank;//牌的面值public Card(String suit, int rank) {this.suit = suit;this.rank = rank;}@Overridepublic 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);}
}
第一次
第二次
可见每次都具有随机性