java面向对象の初体验之扑克牌小Demo
在初学java之时听到最多的就是面向对象编程,什么是面向对象呢?和c语言的面向过程有什么区别呢?今天我将用一个扑克牌小Demo的诞生来为大家演示,程序的功能很简单:能随机生成两张牌并比较两张牌的大小。
作为一个编程小白,听到这个要求的时候我是这样做的:不管三七二十一先把psvm敲到新创建好的类中,然后便陷入了沉思,过了很久从main函数中憋出了几十行代码,竟然能勉强跑的起来,然后长呼一口气,宣布大功告成,便向周围人吹嘘了起来,这时一位大牛走了过来,瞥了一眼,叹了口气,劝我还是回去学c语言吧,我不服,向其刨根问底,最终经其指点我在思想完成了从面向过程向面向对象初步转变。
接下来我将从三个方面讲述我的转变。
需求分析
首先拿到这个问题先分析程序的需求:1.生成一副牌。2.随机抽取一张牌。3.比较两张牌的大小。
框架搭建
其次根据需求建立起程序的大致框架。在这里我用的是一款在线绘图软件ProcessOn(这种软件网上很多随便找一个自己用的习惯的就行),用软件自带的UML类图工具将程序的大致框架作以绘制。效果为下图:
四个中间化横线的长方形表示四个类:
Poker类表示单张扑克牌,单张扑克牌拥有点数,花色属性,能够和其他其他扑克牌比较大小(一般比点数,点数相同比花色)。
PokerNumber类表示一张扑克牌的点数以及权重,权重的设置方便后续比较两张牌大小。
PokerSuit类表示一张扑克牌的花色和权重,当点数相同时根据花色(黑桃,红桃,梅花,方片)来比较两张牌大小。
PokerManager类表示扑克牌生成器,可以生成一副牌(当前只满足生成52张牌),并从中随机抽取一张牌。
代码搬运
最后当框架搭建完毕之后就会发现,我们要做的就只剩下照着UML类图搬运我们的代码就行了。最后贴上PokerManager类中的实现生成一副牌,和随机抽取一副牌功能的代码,剩余的代码我将上传到Nicely/poker (gitee.com),感兴趣的可以查看。
public class PokerManager {
//pokers中存放生成的牌
ArrayList<Poker> pokers = new ArrayList<Poker>();
//扑克牌点数
String[] number = {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};
//扑克牌花色
String[] suit = {"♦","♣","♥","♠"};
public PokerManager(){
//生成52张扑克牌
for(int i = 0; i< number.length;i++){
for(int j = 0; j< suit.length;j++){
PokerNumber numberObj = new PokerNumber(number[i], i);
PokerSuit suitObj = new PokerSuit(suit[j],j );
Poker poker = new Poker(numberObj,suitObj);
//存入pokers中
pokers.add(poker);
}
}
//洗牌
//Collections.shuffle(pokers);
}
//随机抽一张牌
public Poker getPoker(){
Random random = new Random();
int index = random.nextInt(pokers.size());
Poker poker= (Poker) pokers.get(index);
pokers.remove(index);
return poker;
}
}