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个人抓到的牌打印一下