1.创建单张牌
一张牌需要有花色和数字,并且我们需要将一张牌的信息显示出来
public class Card {
public String rank;//数字
public String suit;//花色
public String toString(){//显示花色的方法
return String.format("[%s %s]",suit,rank);
}
}
定义一个Card类表示一张牌,Card的成员变量rank表示牌的大小,suit表示牌的花色,toString是将牌的信息通过格式化为字符串的形式返回
2.定义花色和大小的数组
public static final String[]SUIT={"♥","♠","♣","♦"};
public static final String[]RANK={"A","2","3","4","5","6","7","8","9","10","J","Q","k"};
3.买一副牌
这是一副没有大小王的牌,有52张
private static List<Card>buyDeck(){
List<Card>deck=new ArrayList<>(52);
for (int i = 0; i <4 ; i++) {
for (int j = 0; j <13 ; j++) {
Card card=new Card();
card.rank=RANK[j];
card.suit=SUIT[i];
deck.add(card);
}
}
return deck;
}
1.创建一个52个Card大小空间的顺序表
2.两层for循环设置牌的花色和大小
3.每一次循环后,将Card尾插到deck里
4.将创建好的牌返回
4.洗牌
遍历每一张牌的位置,将当前位置的牌随机与其他位置的牌交换
交换方法:
private static void swap(List<Card>deck,int i,int j){
Card t=deck.get(i);
deck.set(i,deck.get(j));
deck.set(j, t);
}
参数为装有52张牌的顺序表和需要交换位置的两张牌的下标·
洗牌算法:
private static void shuffle(List<Card>deck){
Random ra=new Random();
for (int i = 1;i <deck.size(); i++) {
int x= ra.nextInt(52);
swap(deck,x,i);
}
}
1.创建一个Random类的对象
2.遍历每一张牌
3.每遍历一张牌,生成一个0到51的数字,该数字作为与当前位置牌要交换的牌的下标
4.调用swap方法,将两位置的牌进行交换
5.抓牌与测试
public static void main(String[] args) {
List<Card>deck=buyDeck();//买一副牌
System.out.println("刚买的新牌");
System.out.println(deck);//将新买的牌打印一下
//洗牌
shuffle(deck);
System.out.println("洗牌后");
System.out.println(deck);//将洗完的牌打印一下
List<List<Card>>hands=new ArrayList<>();
hands.add(new ArrayList<>());
hands.add(new ArrayList<>());
hands.add(new ArrayList<>());
for (int i = 0; i <6 ; i++) {
for (int j = 0; j <3 ; j++) {
hands.get(j).add(deck.remove(0));
}
}
System.out.println("A抓的牌:");
System.out.println(hands.get(0));
System.out.println("B抓的牌:");
System.out.println(hands.get(1));
System.out.println("C抓的牌:");
System.out.println(hands.get(2));
System.out.println("剩余的牌:");
System.out.println(deck);
}
抓牌:
1.创建一个关于List<Card>的数组,数组的每一个元素代表每一个人手里的牌
2.将3个顺序表添加到hands里
3.两层for循环表示每人每次抓一张牌,总共抓6次
4.分别将3个人抓到的牌打印一下