一副扑克牌(PlayingCards)
属性:4种花色×13种点数=52张牌deck
行为:洗牌shuffle()、发牌deal()、理牌sort()
单张扑克牌(Card)
属性:花色suit与点数face
行为:显示属性toString()、花色与点数排序次序compareTo()
import java.util.Arrays;
//模拟一张扑克牌
class Card implements Comparable<Card> {
// 花色(1至4代表方块、梅花、红桃、黑桃)
private int suit;
// 点数(1至13代表A、2、3、...、10、J、Q、K)
private int face;
// 构造方法,参数s和f分别表示牌的花色与点数
public Card(int s, int f){
suit = s;
face = f;
}
// 返回用字符串描述的牌面(重定义Object类的方法)
public String toString(){
// 先给出花色描述
String suitString = "";
if(suit==1) suitString = "方块";
else if(suit==2) suitString = "梅花";
else if(suit==3) suitString = "红桃";
else if(suit==4) suitString = "黑桃";
// 再给出点数描述
String faceString = "";
if(face == 1) faceString = "A";
else if(face == 11) faceString = "J";
else if(face == 12) faceString = "Q";
else if(face == 13) faceString = "K";
else faceString = Integer.toString(face);
return (suitString + faceString);
}
@Override
// 比较两张牌的大小以决定理牌的次序(实现Comparable接口的方法)
public int compareTo(Card other) {
int value1 = (this.face-1)+(this.suit-1)*13;
int value2 = (other.face-1)+(other.suit-1)*13;
if(value1 < value2)
return -1;
else if(value1==value2)
return 0;
else
return 1;
}}
class Poker{
public static final int FULLCARDNUM = 52;
private Card[] fullcard = new Card[FULLCARDNUM];
public Poker(){
initPoker();
}
//初始化整副牌
private void initPoker(){
for(int i=0; i<4; i++){
for(int j=0; j<13; j++){
fullcard[i*13+j] = new Card(i+1, j+1);
}
}
}
//打印整副牌
public void printPoker(){
for(int i=0; i<4; i++){
for(int j=0; j<13; j++){
System.out.print(fullcard[i*13+j].toString()+ ",");
}
System.out.println();
}
}
//洗牌
public void shuffle(){
// 连续多次交换牌
for (int count = 0; count < 200; count++) {
// 随机找两张牌的位置
int index1 = (int) (Math.random() * FULLCARDNUM);
int index2 = (int) (Math.random() * FULLCARDNUM);
// 交换这两张牌
Card temp = fullcard[index1];
fullcard[index1] = fullcard[index2];
fullcard[index2] = temp;
}
}
/*
另外一种常见洗牌方式是随机从一副牌中抽出连续一叠牌,将它们放在剩余牌的最上面,并且不断重复这一过程。(提示:由伪随机数确定数组中的两个位置,然后将数组中间的连续一段元素移到最前面)
*/
//发牌
public void deal(Card[] east, Card[] south,Card[] west, Card[] north){
// 将牌依次发给4家
for (int index = 0; index < FULLCARDNUM; index++) {
int who = index % 4; // 确定发牌给哪一家
int round = index / 4; // 确定正在发第几轮牌
if (who == 0) east[round] = fullcard[index];
else if (who == 1) south[round] = fullcard[index];
else if (who == 2) west[round] = fullcard[index];
else north[round] = fullcard[index];
}
// 为4家理牌
sort(east); sort(south); sort(west); sort(north);
}
// 理牌
public void sort(Card[] cards){
Arrays.sort(cards);
}
}
//桥牌娱乐主程序
public class Bridge {
// 定义符号常量以提高程序的可扩充性(一手牌的张数)
private static final int SUITMAX = Poker.FULLCARDNUM / 4;
// 显示各家手头上的牌面
public static void showHand(Card[] east, Card[] south,Card[] west, Card[] north){
System.out.println("东家的牌:");
for(int i=0; i<SUITMAX; i++)
System.out.print(east[i]+" ");
System.out.println("\n***********************************************");
System.out.println("南家的牌:");
for(int i=0; i<SUITMAX; i++)
System.out.print(south[i]+" ");
System.out.println("\n***********************************************");
System.out.println("西家的牌:");
for(int i=0; i<SUITMAX; i++)
System.out.print(west[i]+" ");
System.out.println("\n***********************************************");
System.out.println("北家的牌:");
for(int i=0; i<SUITMAX; i++)
System.out.print(north[i]+" ");
System.out.println("\n***********************************************");
}
// 主程序
public static void main(String[] args){
// 准备好一副扑克牌
Poker cards = new Poker();
cards.printPoker();
System.out.println("***********************************************");
// 洗牌
cards.shuffle();
cards.printPoker();
System.out.println("***********************************************");
// 发牌
Card[] east = new Card[SUITMAX];
Card[] south = new Card[SUITMAX];
Card[] west = new Card[SUITMAX];
Card[] north = new Card[SUITMAX];
cards.deal(east, south, west, north);
// 摊牌
showHand(east, south, west, north);
}
}
原文:
https://blog.csdn.net/moshowgame/article/details/6913137?utm_source=blogxgwz2