记一次Java小练习: 扑克游戏Demo
最近发现慕课网挺不错,在学知识的同时还能够实践编写程序.
0.问题描述
慕课视频课程里有这样一个小作业,内容如下:
1.创建一副扑克牌, 不包括大小王
2.创建两名玩家, 玩家有ID,姓名,手牌(扑克牌集合)等属性
3.洗牌: 打乱扑克牌顺序
4.发牌: 每个玩家发两张牌
5.比输赢
规则为:两个人分别取自己最大的手牌,然后在比较这两张牌,牌大的玩家获胜.
关于牌的大小顺序,点数有小到大2,3,...,Q,K,A.先比较点数大小,点数大的是大牌.
若点数相等,在按花色比大小: 黑桃>红桃>草花>方片
举例: 红桃A > 黑桃Q, 原因是A的点数比Q大
草花3 > 方片3, 原因是两者点数一样, 但草花>方片
1.开始Thinking
这里边,可以这样子:
1. 每一张扑克牌看作一个类,索性叫它Poker类吧,有点数和花色属性
2. 一副扑克牌就是一个泛型集合,集合元素是Poker类
3. 每一个玩家都有ID,姓名等属性,因此来一个Player类
4. 洗牌: 给每一张扑克牌一个编号,编号就像这样: 1, 2, ..., 52 只需要打乱这52个编号就ok啦
5. 比较牌的大小,我们可以让Poker类实现Comparable接口,重写compareTo()方法
2.代码Implementation
好了,废话少说.
Poker类:
enum Suit {
SPADE,HEART, DIAMOND, CLUB;
}
public class Poker implements Comparable<Poker> {
int index;
int point;
Suit suit;
String name;
Poker(int index) {
this.index = index;
calcSuit();
calcPoint();
calcName();
}
Poker(Suit suit, int point) {
this.suit = suit;
this.point = point;
calcIndex();
calcName();
}
void setIndex(int index) {
this.index = index;
calcSuit();
calcPoint();
calcName();
}
void calcSuit() {
switch ((this.index - 1)/13) {
case 0:
this.suit = Suit.SPADE;
break;
case 1:
this.suit = Suit.HEART;
break;
case 2:
this.suit = Suit.DIAMOND;
break;
case 3:
this.suit = Suit.CLUB;
break;
}
}
void calcPoint() {
this.point = index % 13;
// 如果index % 13 = 0, 要将point设置为13
if (this.point == 0) this.point = 13;
}
void calcIndex() {
if (suit == Suit.SPADE) {
this.index = point;
} else if (suit == Suit.HEART) {
this.index = 13 + point;
} else if (suit == Suit.DIAMOND) {
this.index = 26 + point;
} else if (suit == Suit.CLUB) {
this.index = 39 + point;
}
}
void calcName() {
StringBuilder string = new StringBuilder();
switch (