Java小练习——斗地主发牌
这是自己在java学习中做的一个小练习,其中存在的问题欢迎大家批评指正。
使用面向对象思维模拟斗地主洗牌发牌的过程(熟悉list集合的使用)。下面主要介绍其中的一些方法,如果需要源码的话,可以自己去网盘下,提取码:v3cz。
初始化卡牌数组
创建54张牌的Card对象,放入list集合中。
private String[] f = { "♠", "♣", "♥", "♦" };
// private String[] f = { "黑桃", "梅花", "红心", "方块" };
private String[] p = { "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2" };
private String[] b = { "小王", "大王" };
private List<Card> cards = new ArrayList<Card>();
/**
* 初始化卡牌数组
*/
private void initCards() {
int id = 0;
int value = -1;
for (int i = 0; i < p.length; i++) {
value = i;
for (int j = 0; j < f.length; j++) {
id++;
cards.add(new NormalCard(id, p[i], value, f[j]));
}
}
for (int i = 0; i < b.length; i++) {
id++;
value++;
cards.add(new BossCard(id, value, b[i]));
}
}
洗牌
这里调用Collections类中的shuffle()方法,对卡牌数组中的元素进行打乱,模拟洗牌。这里我是调用了三次,没什么别的原因,主要是我愿意0.0。
/**
* 洗牌
*
* @param cards
*/
private void shuffleCards() {
Collections.shuffle(cards);
Collections.shuffle(cards);
Collections.shuffle(cards);
}
选地主
地主是随机选的,使用Random类随机(0,1,2)中的一个,然后选择对应的索引的玩家作为地主。
private List<Player> players = new ArrayList<Player>() {
{
add(new Player(0, "yasuo", false, new ArrayList<Card>()));
add(new Player(1, "lrelia", false, new ArrayList<Card>()));
add(new Player(2, "Nicole", false, new ArrayList<Card>()));
}
};
/**
* 选地主
*/
private void getBoss() {
Random r = new Random();
int a = r.nextInt(3);
players.get(a).setBoss(true);
}
发牌
发牌就是简单的条件判断语句,一人一张发,最后三张给地主。
/**
* 发牌
*/
private void dealCard() {
for (int i = 0; i < cards.size() - 3; i++) {
if (i % 3 == 0) {
players.get(0).getHandCards().add(cards.get(i));
} else if (i % 3 == 1) {
players.get(1).getHandCards().add(cards.get(i));
} else {
players.get(2).getHandCards().add(cards.get(i));
}
}
for (Player player : players) {
if (player.isBoss()) {
for (int i = cards.size() - 3; i < cards.size(); i++) {
player.getHandCards().add(cards.get(i));
}
}
}
}
排序
排序使用的是list集合中的sort方法,在实现comparator接口时使用的是lambda表达式。
/**
* 排序
*/
private void sort() {
for (Player player : players) {
player.getHandCards().sort((c1,c2)->c2.getValue()-c1.getValue());;
}
}