详细知识讲解请跳转:【JAVA数据结构】(ArrayList)顺序表-CSDN博客
一. 简单的洗牌算法
特殊知识须记:
java
List < List<E> >
该语法情况比较特殊,相当于一个"二维数组"存着一个个线性表的结构,如图
这是用于洗牌中三个人的牌分配
基本流程:
我们想实现的是一副牌(去鬼牌),三个人玩,每个人开始五张牌,轮流摸。
以上述图片为例:
步骤一:设置牌类
先定义一个Card牌类,存放数字和花色
java
public class Card {
public int rank;//数字
public String suit;//花色
//构造方法
public Card(int rank, String suit) {
this.rank = rank;
this.suit = suit;
}
//重写toString,方便更好查看打印的数据
@Override
public String toString() {
return String.format("[%s,%d]",suit,rank);
}
}
步骤二:设置操作牌的类,实现买牌,洗牌,发牌操作:
买牌
java
public class CardDemo {
//固定一下花色
public static final String[] SUITS = {"♠", "♥", "♣", "♦"};
//买一副顺序完整的新牌
public static List<Card> NewDeck(){
//先设置好 52张空牌
//设置大小为52的动态顺序表,存放类型为Card牌类
List<Card> Deck = new ArrayList<>(52);
//再将4个花色和13种数字的数据依次填到牌里
for (int i = 0; i < SUITS.length; i++) {
for (int j = 0; j <= 13 ; j++) {
//分别用数值接收数字和花色
int rank = j;
String suit = SUITS[i];
//将得到的数据存到一张卡牌上
Card card = new Card(rank,suit);
//在空牌添加一组卡牌数据
Deck.add(card);
}
}
//注意返回值!
return Deck;
}
洗牌
java
//随机洗牌
//随机交换牌
public static void swap(List<Card> cards,int i ,int r){
Card tmp = cards.get(i);
//i下标的值设置为r下标所对应的数
cards.set(i,cards.get(r));
//同上,r下标的值设置为 i下标所对应的数
cards.set(r,tmp);
}
public static void Shuffle (List<Card> deck){
// i是顺序表的数所对应的下标
//从后开始随机遍历(从i=0开始随机范围无法达到整个数组)
for (int i = deck.size()-1; i > 0; i--) {
Random random = new Random();
//随机在0~i以内的下标值
int r = random.nextInt(i);
//将随机的下标对应的数 和 i下标的数 交换位置
swap(deck,i,r);
}
}
发牌
java
public static void main(String[] args) {
//整理好新牌
List<Card> New = NewDeck();
System.out.println(New);
//洗牌
Shuffle(New);
System.out.println(New);
//发牌
//三人轮流拿牌,一人五张
List<List<Card>> hands = new ArrayList<>();
//三个人各自手中的牌
List<Card> hand1 = new ArrayList<>();
List<Card> hand2 = new ArrayList<>();
List<Card> hand3 = new ArrayList<>();
hands.add(hand1);
hands.add(hand2);
hands.add(hand3);
//每个人拿5张
for (int i = 0; i < 5 ; i++) {
//每次三个人每人拿一张牌
for (int j = 0; j < 3; j++) {
//每次拿掉第一张牌的数据
Card card = New.remove(0);
//将第一张牌数据给此时这个人手中
hands.get(j).add(card);
}
}
//打印分完牌之后每个人手中的牌
System.out.println("第一个人:" + hands.get(0));
System.out.println("第二个人:" + hands.get(1));
System.out.println("第三个人:" + hands.get(2));
System.out.println("剩下的牌:" + New);
}