黑马程序员技术交流社区
标题:
一个洗牌,发牌的小程序
[打印本页]
作者:
林晓泉
时间:
2012-11-3 02:43
标题:
一个洗牌,发牌的小程序
<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>
复制代码
在论坛上看到的这个题,用自己的方法写的。
浪费了一个晚上的脑细胞,感觉对面向对象的思想理解还不到位,中间反复修改了好几次,无法很好的将事物的描述转成代码
希望大家对以上的代码给点建议
这个注释大家将就着看
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2