洗牌程序
程序主要包含三个部分:
- 通用牌类 Card,没有特殊花色的牌,像扑克里的“跑得快”可直接使用;
- 扑克 Poker,继承自 Card,加入大小王两张牌,像“斗地主”可使用;
- 麻将 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);
}
}
}
以前看书记得有这么有一道洗牌的题,今天有空再写一遍,发在这里。