结合面向对象设计原则,分析和设计模拟扑克游戏的洗牌过程。
编程定义一个表示扑克牌的类 Poke,用 suit 来表示扑克牌的花色,用 face 来表示扑克牌的牌面值,每副牌为 52 张,不考虑包含大小王。假设扑克牌游戏需要 2 副(或2副以上)的牌,实现 Poke 类中的静态方法,模拟备牌、洗牌、发牌,以及将这些扑克牌分给参加游戏的所有人,并将参加扑克牌游戏的所有人的扑克牌输出。备牌: 获取牌的副数 n,新建一个 52n大小的空字符串数组 cards来保存 52n张扑克牌。通过给数组赋值的形式将牌面信息加入到字符串数组中。
cards初始化长度为 52n。
对于赋值,找到数组序号与对应牌面关系,即可利用 for 循环简单赋值。
令 suit = {"♠","♦","♥","♣"},face = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"},则有cards[i] = suit[(i/13)%4]+face[(i%13)]
洗牌: 随机生成两个 52n内的整数 i和 j,交换 cards[i]和 cards[j],这个过程要重复多次。 发牌: 获取参与人数 m,找出某人与牌序列的数值关系,将该张牌抽出,放进一个新的字符串数组 card中并打印即可。
card的初始化长度为 牌数/人数,并向上取整。
(int)Math.ceil((double)cards.length/m)
第i位玩家分得的第k张牌为card[k] = cards[i + m * k]。
示牌: 利用 for 循环将字符串数组内容输出即可。
Poke.java
import java.util.Random; public class Poke { public static String[] suit = {"♠","♦","♥","♣"}; public static String[] face = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; //备牌 public static String[] createCard(int number) { String[] cards =new String[number * 52]; for(int i= 0; i < number * 52; i++) { cards[i] = suit[(i/13)%4]+face[(i%13)]; } return cards; } //示牌 public static void display(String[] cards) { for(int i = 0; i<cards.length;i++) { if(i%52 == 0 && i > 0) System.out.print("\n"); System.out.print(cards[i]+" "); } System.out.print("\n"); } //交换两张牌位置 public static void swap(String[] cards,int i, int j) { String temp = new String(); temp = cards[i]; cards[i] = cards[j]; cards[j] = temp; } //洗牌 public static void shuffle(String[] cards) { for(int i = 0; i < 10000; i++) { Random ran = new Random(); int r1 = ran.nextInt(cards.length); int r2 = ran.nextInt(cards.length); swap(cards,r1,r2); } } //分牌 public static void distribute(String[] cards, int player) { for(int i = 0;i < player; i++) { String[] card = new String[(int)Math.ceil((double)cards.length/player)]; for(int k = 0; k < card.length && player * k+i < cards.length; k++) { card[k] = cards[player * k+i]; } System.out.print("第"+(i+1)+"位玩家的牌:"); display(card); } } @SuppressWarnings("resource") public static void main(String[] args) { System.out.println("该扑克游戏需要几付扑克牌?"); Scanner sc = new Scanner(System.in); int num = sc.nextInt(); String[] cards = Poke.createCard(num); System.out.println("该扑克游戏有几个玩家?"); Scanner sp = new Scanner(System.in); int per = sp.nextInt(); System.out.println("显示所有的牌:"); Poke.display(cards); Poke.shuffle(cards); System.out.println("显示分配给每个人的牌:"); Poke.distribute(cards,per); sc.close(); } }