设计要求
结合面向对象设计原则,分析和设计模拟扑克游戏的洗牌过程。
- 编程定义一个表示扑克牌的类 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类代码
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();
}
}
输出结果
该扑克游戏需要几付扑克牌?
3
该扑克游戏有几个玩家?
8
显示所有的牌:
♠A ♠2 ♠3 ♠4 ♠5 ♠6 ♠7 ♠8 ♠9 ♠10 ♠J ♠Q ♠K ♦A ♦2 ♦3 ♦4 ♦5 ♦6 ♦7 ♦8 ♦9 ♦10 ♦J ♦Q ♦K ♥A ♥2 ♥3 ♥4 ♥5 ♥6 ♥7 ♥8 ♥9 ♥10 ♥J ♥Q ♥K ♣A ♣2 ♣3 ♣4 ♣5 ♣6 ♣7 ♣8 ♣9 ♣10 ♣J ♣Q ♣K
♠A ♠2 ♠3 ♠4 ♠5 ♠6 ♠7 ♠8 ♠9 ♠10 ♠J ♠Q ♠K ♦A ♦2 ♦3 ♦4 ♦5 ♦6 ♦7 ♦8 ♦9 ♦10 ♦J ♦Q ♦K ♥A ♥2 ♥3 ♥4 ♥5 ♥6 ♥7 ♥8 ♥9 ♥10 ♥J ♥Q ♥K ♣A ♣2 ♣3 ♣4 ♣5 ♣6 ♣7 ♣8 ♣9 ♣10 ♣J ♣Q ♣K
♠A ♠2 ♠3 ♠4 ♠5 ♠6 ♠7 ♠8 ♠9 ♠10 ♠J ♠Q ♠K ♦A ♦2 ♦3 ♦4 ♦5 ♦6 ♦7 ♦8 ♦9 ♦10 ♦J ♦Q ♦K ♥A ♥2 ♥3 ♥4 ♥5 ♥6 ♥7 ♥8 ♥9 ♥10 ♥J ♥Q ♥K ♣A ♣2 ♣3 ♣4 ♣5 ♣6 ♣7 ♣8 ♣9 ♣10 ♣J ♣Q ♣K
显示分配给每个人的牌:
第1位玩家的牌:♦7 ♦9 ♠4 ♥A ♥A ♥3 ♥4 ♣5 ♥2 ♦4 ♣8 ♣4 ♠4 ♥J ♦J ♦Q ♦J ♣9 ♣7 ♦2
第2位玩家的牌:♣6 ♥3 ♦5 ♠8 ♦7 ♥9 ♦A ♣10 ♠9 ♠9 ♥7 ♦K ♣2 ♦6 ♦A ♣J ♦4 ♥4 ♠8 ♥5
第3位玩家的牌:♠Q ♥A ♥Q ♣K ♣9 ♥K ♥K ♠K ♠2 ♠5 ♠J ♥Q ♣A ♠3 ♣9 ♠K ♥8 ♠7 ♦5 ♥Q
第4位玩家的牌:♥7 ♥7 ♠5 ♥4 ♦3 ♦J ♠Q ♠A ♣Q ♥9 ♦10 ♣A ♥10 ♠3 ♥6 ♠10 ♣7 ♦2 ♥J ♠A
第5位玩家的牌:♥2 ♠8 ♥10 ♠6 ♦K ♦8 ♣K ♣A ♣2 ♦3 ♣J ♣4 ♥3 ♠K ♦Q ♦10 ♠2 ♣6 ♥8 null
第6位玩家的牌:♦10 ♠6 ♦5 ♦7 ♥5 ♦9 ♣5 ♠3 ♦2 ♥6 ♠7 ♠2 ♣3 ♣5 ♣3 ♦8 ♣4 ♦K ♥2 null
第7位玩家的牌:♠9 ♣2 ♦4 ♠10 ♣8 ♦6 ♠Q ♦Q ♦A ♠10 ♣10 ♥J ♥5 ♥8 ♠J ♦8 ♠J ♠4 ♠A null
第8位玩家的牌:♣Q ♦6 ♥10 ♥K ♠6 ♣7 ♦3 ♣J ♥6 ♣10 ♠7 ♠5 ♣8 ♣K ♣3 ♣Q ♦9 ♥9 ♣6 null