简单的扑克牌类

设计要求

结合面向对象设计原则,分析和设计模拟扑克游戏的洗牌过程。

  1. 编程定义一个表示扑克牌的类 Poke,用 suit 来表示扑克牌的花色,用 face 来表示扑克牌的牌面值,每副牌为 52 张,不考虑包含大小王。
  2. 假设扑克牌游戏需要 2 副(或2副以上)的牌,实现 Poke 类中的静态方法,模拟备牌、洗牌、发牌,以及将这些扑克牌分给参加游戏的所有人,并将参加扑克牌游戏的所有人的扑克牌输出。

设计思路

备牌:
获取牌的副数 n,新建一个 52n大小的空字符串数组 cards来保存 52n张扑克牌。通过给数组赋值的形式将牌面信息加入到字符串数组中。

  1. cards初始化长度为 52n

  2. 对于赋值,找到数组序号与对应牌面关系,即可利用 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内的整数 ij,交换 cards[i]cards[j],这个过程要重复多次。
发牌:
获取参与人数 m,找出某人与牌序列的数值关系,将该张牌抽出,放进一个新的字符串数组 card中并打印即可。

  1. card的初始化长度为 牌数/人数,并向上取整。

    (int)Math.ceil((double)cards.length/m)

  2. 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 ♠2345678910 ♠J ♠Q ♠K ♦A ♦2345678910 ♦J ♦Q ♦K ♥A ♥2345678910 ♥J ♥Q ♥K ♣A ♣2345678910 ♣J ♣Q ♣K 
♠A ♠2345678910 ♠J ♠Q ♠K ♦A ♦2345678910 ♦J ♦Q ♦K ♥A ♥2345678910 ♥J ♥Q ♥K ♣A ♣2345678910 ♣J ♣Q ♣K 
♠A ♠2345678910 ♠J ♠Q ♠K ♦A ♦2345678910 ♦J ♦Q ♦K ♥A ♥2345678910 ♥J ♥Q ♥K ♣A ♣2345678910 ♣J ♣Q ♣K 
显示分配给每个人的牌:1位玩家的牌:♦794 ♥A ♥A ♥34524844 ♥J ♦J ♦Q ♦J ♣9722位玩家的牌:♣635879 ♦A ♣10997 ♦K ♣26 ♦A ♣J ♦44853位玩家的牌:♠Q ♥A ♥Q ♣K ♣9 ♥K ♥K ♠K ♠25 ♠J ♥Q ♣A ♠39 ♠K ♥875 ♥Q 
第4位玩家的牌:♥77543 ♦J ♠Q ♠A ♣Q ♥910 ♣A ♥10361072 ♥J ♠A 
第5位玩家的牌:♥28106 ♦K ♦8 ♣K ♣A ♣23 ♣J ♣43 ♠K ♦Q ♦10268 null 
第6位玩家的牌:♦106575953267235384 ♦K ♥2 null 
第7位玩家的牌:♠9241086 ♠Q ♦Q ♦A ♠1010 ♥J ♥58 ♠J ♦8 ♠J ♠4 ♠A null 
第8位玩家的牌:♣Q ♦610 ♥K ♠673 ♣J ♥610758 ♣K ♣3 ♣Q ♦996 null 
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值