创建一副扑克牌,四种花色,每种花色13张牌A~K,有三个玩家,每人手中五张牌,实现随机发牌的功能。
设计思路:一张牌中包含两个要素,点数(rank)和花色(suit),创建数组SUITS包含四种花色即: {"♥","♠","♣","♦"},在点数中除去'A'、'J'、'Q'、'K'这四种特殊的点数单另罗列以外,其余点数使用循环遍历即可。创建好一副扑克牌后,要打乱这副牌的的顺序,java中有现成的方法Collections.shuffle();其实质是调用swap方法从llist的最后一位与前面的随机交换。接下来依次给三个玩家发放手牌,最终打印输出各个玩家的手牌即可。
shuffle()源码:
public static void shuffle(List<?> list) {
Random rnd = r;
if (rnd == null)
r = rnd = new Random();
shuffle(list, rnd);
}
@SuppressWarnings({"rawtypes", "unchecked"})
public static void shuffle(List<?> list, Random rnd) {
int size = list.size();
if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
for (int i=size; i>1; i--)
swap(list, i-1, rnd.nextInt(i));
} else {
Object arr[] = list.toArray();
for (int i=size; i>1; i--)
swap(arr, i-1, rnd.nextInt(i));
ListIterator it = list.listIterator();
for (int i=0; i<arr.length; i++) {
it.next();
it.set(arr[i]);
}
}
}
扑克牌游戏代码:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
class Card{
public String suit;
public String rank;
public Card(String suit, String rank) {
this.suit = suit;
this.rank = rank;
}
@Override
public String toString() {
return "(" + suit + "," + rank + ")";
}
}
public class CardDemo {
public static final String[] SUITS= {"♥","♠","♣","♦"};
public static List<Card> buyPoker() {
List<Card> poker = new ArrayList<>();
//构建四种花色
for(int i = 0;i<4;i++) {
for(int j = 2;j<=10;j++) {
//j+""即把int类型转换为String类型
poker.add(new Card(SUITS[i],j+""));
}
poker.add(new Card(SUITS[i], "J"));
poker.add(new Card(SUITS[i], "Q"));
poker.add(new Card(SUITS[i], "K"));
poker.add(new Card(SUITS[i], "A"));
}
return poker;
}
public static void main(String[] args) {
//1.创建一副牌
System.out.println("创建一副牌");
List<Card> poker = buyPoker();
//2.洗牌,打乱顺序,java中有现成的方式
Collections.shuffle(poker);
System.out.println(poker);
//3.发牌(三个人,每人5张牌)
List<List<Card>>players = new ArrayList<>();
//三个新增列表表示三个玩家的三幅手牌
players.add(new ArrayList<Card>());
players.add(new ArrayList<Card>());
players.add(new ArrayList<Card>());
//依次给三个玩家发牌
for(int cardIndex = 0;cardIndex<5;cardIndex++) {
for(int playerIndex = 0;playerIndex<3;playerIndex++) {
//players.get(playerIndex).add(poker.remove(0));
//详细实现方法如下所示:
//①.玩家抽取一张牌
List<Card> playerCards = players.get(playerIndex);
//②.获取最上方的一张牌
Card curCard = poker.remove(0);
//③.把最上方的牌交给当前玩家
playerCards.add(curCard);
}
}
//4.输出玩家手牌
System.out.println("1号:");
System.out.println(players.get(0));
System.out.println("2号:");
System.out.println(players.get(1));
System.out.println("3号:");
System.out.println(players.get(2));
}
}
运行结果: