- <p>/*
- 需求: 实现扑克牌的洗牌 发牌 效果
- 首先定义一个扑克牌的类,定义了扑克牌的花色,点数,能容纳不定牌数的数组,以及查看扑克牌的方法
- 然后定义一个牌组类,继承于扑克牌类,用单例设计模式,内存中只能有1副牌,并且初始化为52张4花色13点数的牌组
- 这个类有洗牌和发牌的方法
- 最后定义一个手牌类,继承于扑克牌类,牌组类对象发牌的时候该类被创建,并得到所发的牌,该类还应该有一个理牌的方法
- */
- import java.util.*;
- class Card
- {
- private String[] point = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
- private String[] suit = {"黑桃","红桃","梅花","方片"};
- int[][] cards; //一维数组中,第一个为花色,第二个为点数,第三个为位置标示符
- public void show()
- {
- for (int i=0;i<cards.length ;i++ )
- {
- System.out.println(suit[cards[i][0]]+"_"+point[cards[i][1]]+"_"+cards[i][2]);
- }
- }
- }
- class Deck extends Card
- {
- private static int x=52;
- private Deck()
- {
- super.cards = new int[x][3];
- for (int i=0 ; i<4 ;i++ )
- {
- for (int j=0; j<13 ; j++)
- {
- super.cards[j+i*13][0] = i;
- super.cards[j+i*13][1] = j;
- super.cards[j+i*13][2] = j+i*13;
- }
- }
- }
- private static Deck d = new Deck();
- public static Deck getDeck() //单例设计模式,内存中只能有一副牌
- {
- return d;
- }
- public int getNum() //可以得到牌组剩余的张数
- {
- return x;
- }
- public void shuffle() //洗牌
- {
- x=52;
- Random ran = new Random();
- for (int i=0;i<x ;i++ )
- {
- cards[i][2] = ran.nextInt() % super.cards.length; //产生一个随机数,并把它赋给扑克牌的位置标识符
- }
- sort(); //根据位置标识符从小到大排列牌组
- }
- public Hands[] deal(int pnum,int cnum) //返回一个手牌类数组,参数pnum是参与人数,cnum是没人发的牌数
- {
- Hands[] hands;
- if (x<pnum*cnum) //如果牌组中剩余的牌不够发则提示并跳出
- {
- System.out.println("牌组的牌不够,请重新洗牌");
- return null;
- }
- /*
- 这里我不知道用什么办法能定义带参数的类的数组,只能想到这样写,不知道大家有什么更好的办法?
- */
- hands = new Hands[pnum]; //定义手牌类数组
- for (int i=0;i<pnum ;i++ )
- {
- hands[i]=new Hands(cnum); //初始化这个数组的元素
- }
- for (int i=0; i<cnum ; i++ )
- {
- for (int j=0;j<pnum ;j++)
- {
- hands[j].cards[i][0]=super.cards[x-(i*cnum+j)-1][0]; //牌从数组的最后开始发,这样下标,0到(x-pnum*cnum),就是剩余的牌
- hands[j].cards[i][1]=super.cards[x-(i*cnum+j)-1][1];
- hands[j].cards[i][2]=super.cards[x-(i*cnum+j)-1][2];
- }
- }
- x=x-pnum*cnum;
- return hands;
- }
- private void sort() //根据位置标识符,重新排序牌组
- {
- for (int i=0;i<x-1 ;i++ )
- {
- int n=i;
- for (int j=i+1;j<x ;j++ )
- {
- if (super.cards[n][2]>super.cards[j][2])
- {
- n = j;
- }
- }
- if (n!=i)
- {
- int[] temp = super.cards[i];
- super.cards[i] = super.cards[n];
- super.cards[n] = temp;
- }
- }
- }
- }
- class Hands extends Card
- {
- int x;
- Hands(int n)
- {
- x=n;
- super.cards = new int[n][3];
- }
- public void tidy()
- {
- for (int i=0;i<x-1 ;i++ )
- {
- int n=i;
- for (int j=i+1;j<x ;j++ )
- {
- if (super.cards[n][1]>super.cards[j][1])//根据牌的点数大小排序
- {
- n = j;
- }
- }
- if (n!=i)
- {
- int[] temp = super.cards[i];
- super.cards[i] = super.cards[n];
- super.cards[n] = temp;
- }
- }
- }
- }
- class Demo
- {
- public static void main(String[] args) //测试方法可以无视
- {
- Deck d = Deck.getDeck();
- d.shuffle();
- d.show();
- Hands[] h = d.deal(5,6);
- for (int i=0;i<5 ;i++ )
- {
- System.out.println("---------------------------------------------------------------------------------------------");
- h[i].show();
- h[i].tidy();
- System.out.println("---------------------------------------------------------------------------------------------");
- h[i].show();
- }
- d.deal(5,6);
- System.out.println(d.getNum());
- }
- }
- </p>
复制代码 在论坛上看到的这个题,用自己的方法写的。
浪费了一个晚上的脑细胞,感觉对面向对象的思想理解还不到位,中间反复修改了好几次,无法很好的将事物的描述转成代码
希望大家对以上的代码给点建议
这个注释大家将就着看 |
|