洗牌程序

洗牌程序

程序主要包含三个部分:

  1. 通用牌类 Card,没有特殊花色的牌,像扑克里的“跑得快”可直接使用;
  2. 扑克 Poker,继承自 Card,加入大小王两张牌,像“斗地主”可使用;
  3. 麻将 Mahjong,继承自 Card,加入特殊花色的牌,如东风、北风、红中、白板等。

以下为代码:

package org.iword.card;

/**
 * @文件名: org.iword.Main.java
 * @作者 : iword
 * @日期 : 2014年6月25日 上午2:17:56
 * @版本 : 1.0
 * @描术 :
 * 
 *     ALL RIGHTS RESERVED,COPYRIGHT(C) FCH LIMITED 2014
 */

public class Main {
    public static void main(String[] args)
    {
        String[] num = { "A ", "2 ", "3 ", "4 ", "5 ", "6 ", "7 ", "8 ", "9 ",
                "10", "J ", "Q ", "K " };
        String[] suits = { "红桃", "黑桃", "方块", "梅花" };
        String[] otherCards = { "大王  ", "小王  " };
        Poker poker = new Poker(suits, num, otherCards);

        String[] numMj = { "一", "二", "三", "四", "五", "六", "七", "八", "九" };
        String[] suitsMj = { "条", "饼", "万" };
        String[] otherCardsMj = { "东风", "西风", "南风", "北风", "发财", "红中", "白板" };
        Mahjong mahjong = new Mahjong(suitsMj, numMj, otherCardsMj);

        // 显示洗好的扑克牌
        shuffle(poker);
        // 显示洗好的麻将牌
        shuffle(mahjong);
    }

    // 洗牌
    private static void shuffle(Card card)
    {
        card.start();
    }
}

// 通用牌类
package org.iword.card;

import java.util.Random;

/**
 * @文件名: org.iword.Card.java
 * @作者 : iword
 * @日期 : 2014年6月25日 上午1:16:23
 * @版本 : 1.0
 * @描术 : 定义一般的牌,如扑克里的“跑得快”,不包含特殊的花色牌,如扑克里的“斗地主”所需要的大小王。
 * 
 *     ALL RIGHTS RESERVED,COPYRIGHT(C) FCH LIMITED 2014
 */

public class Card {
    private String[] suits; // 牌的花色,如黑桃、红桃等
    private String[] num; // 牌的编号,如A, 2, 3等
    protected String[] cards; // 将牌的花色和牌的编号组合存储形成一副牌
    protected int length; // 牌的张数,cards 的长度

    // 构造函数
    public Card(String[] suits, String[] num)
    {
        this.suits = suits;
        this.num = num;
        this.length = suits.length * num.length;
    }

    // 初始化牌,如果继承此类,应视情况覆写此方法
    protected void initialize()
    {
        this.cards = new String[this.length];
        int index = 0;
        for (int i = 0; i < num.length; i++) {
            for (int j = 0; j < suits.length; j++) {
                // 将花色和编号组合成一张牌进行存储
                cards[index++] = suits[j] + num[i];
            }
        }
    }

    // 交换 arr[i] 与 arr[j] 的值
    private void swap(String[] arr, int i, int j)
    {
        String temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    // 洗牌
    private void shuffle()
    {
        Random random = new Random(); // 生成生机数
        for (int i = 0; i < this.length; i++) {
            swap(this.cards, i, random.nextInt(this.length));
        }
    }

    // 显示牌
    private void show()
    {
        StringBuilder stringBuilder = new StringBuilder();
        for (int i = 0; i < this.length; i++) {
            if (0 == i % 10) {
                stringBuilder.append("\n");
            }
            stringBuilder.append(this.cards[i]).append(" ");
        }
        System.out.println(stringBuilder.toString());
    }

    // 供调用的入口
    public void start()
    {
        initialize();
        shuffle();
        show();
    }
}

// 扑克
package org.iword.card;

/**
 * @文件名: org.iword.Poker.java
 * @作者 : iword
 * @日期 : 2014年6月25日 上午2:26:28
 * @版本 : 1.0
 * @描术 : 继承 Card 类定义包含大小王的扑克牌
 * 
 *     ALL RIGHTS RESERVED,COPYRIGHT(C) FCH LIMITED 2014
 */

public class Poker extends Card {
    private String[] otherCards; // 扑克中的特殊花色牌,大王和小王

    public Poker(String[] suits, String[] num, String[] otherCards)
    {
        super(suits, num);
        this.otherCards = otherCards;
        this.length += otherCards.length; // 加上特殊花色牌的数量
    }

    // 初始化
    @Override
    protected void initialize()
    {
        super.initialize();
        int index = 0;
        while (null != this.cards[index]) {
            index++;
        }
        // 加入特殊花色的牌
        for (int i = 0; i < this.otherCards.length; i++) {
            this.cards[index++] = this.otherCards[i];
        }
    }
}

// 麻将
package org.iword.card;

/**
 * @文件名: org.iword.Mahjong.java
 * @作者 : iword
 * @日期 : 2014年6月25日 上午2:47:11
 * @版本 : 1.0
 * @描术 : 继承 Card 类定义麻将牌
 * 
 *     ALL RIGHTS RESERVED,COPYRIGHT(C) FCH LIMITED 2014
 */

public class Mahjong extends Card {
    private String[] otherCards; // 特殊花色牌,如东风、白板等
    private static final int NUM_PER_CARD = 4; // 麻将每种牌有4张

    public Mahjong(String[] suits, String[] num, String[] otherCards)
    {
        super(suits, num);
        this.otherCards = otherCards;
        // 每一张牌有 4 个,加上特殊牌的数量之后,总数量要乘以 4
        this.length = (this.length + otherCards.length) * NUM_PER_CARD;
    }

    // 初始化麻将牌
    @Override
    protected void initialize()
    {
        super.initialize();
        int index = 0;
        while (null != this.cards[index]) {
            index++;
        }
        // 加入特殊花色的牌
        for (int i = 0; i < this.otherCards.length; i++) {
            this.cards[index++] = this.otherCards[i];
        }
        int length = index;
        for (int i = 1; i < NUM_PER_CARD; i++) {
            System.arraycopy(this.cards, 0, this.cards, i * index, length);
        }
    }
}

以前看书记得有这么有一道洗牌的题,今天有空再写一遍,发在这里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值