提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、需求
按照斗地主的规则,完成洗牌发牌的动作。具体规则:使用54张牌打乱顺序,三个玩家参与游戏,三个人交替摸牌,每人17张牌,最后三张留作底牌。
二、分析
1.纸牌类
每张牌由花色数字两部分组成,定义纸牌类,包含花色和数字两个属性。
2.准备牌
一副牌有54张,使用ArrayList集合存储所有的纸牌对象。
每张牌由花色数字两部分组成,可以使用花色数组与数字数组嵌套迭代完成每张牌的组装,并添加到集合中。
3.洗牌
使用Coolection类的shuffle()方法对集合元素随机打乱。
4.发牌
每个玩家对应一手牌,创建3个ArrayList集合分别存储每个玩家的纸牌,通过对3取模依次发牌,或者一次发17张。将最后3张牌直接存放于底牌集合中。
5.看牌
直接打印每个玩家集合,先排序。
三、代码
package hntou.hntou.demo01_iterator.case04;
public class Card implements Comparable<Card>{
private String number;
private String color;
private int id; //用于对象排序
public Card(){
}
public Card(String number, String color, int id) {
this.number = number;
this.color = color;
this.id = id;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return color+number;
}
@Override
public int compareTo(Card o) {
return o.getId()-this.getId();
}
}
package hntou.hntou.demo01_iterator.case04;
import java.util.ArrayList;
import java.util.Collections;
/**
* 斗地主综合案例
*/
public class FightTheLandlord {
/**
* 初始化纸牌
*/
private static ArrayList<Card> pokers = new ArrayList<>();
static {
pokers.add(new Card("", "🃏", 54));
pokers.add(new Card("", "🃏", 53));
String[] numbers = {"2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3"};
String[] color = {"♠️", "♥️", "♣️", "♦️"};
int id = 52;
//外循环牌号
for (String i : numbers) {
//内循环花色
for (String j : color) {
pokers.add(new Card(i, j, id));
id--;
}
}
}
public static void main(String[] args) {
System.out.println(pokers);
/**
* 洗牌
*/
Collections.shuffle(pokers);
System.out.println(pokers);
/**
* 发牌
*/
ArrayList<Card> player1 = push(0);
ArrayList<Card> player2 = push(1);
ArrayList<Card> player3 = push(2);
ArrayList<Card> bottom = push(3);
/**
* 看牌(排序)
*/
Collections.sort(player1);
Collections.sort(player2);
Collections.sort(player3);
System.out.println("玩家1:" + player1);
System.out.println("玩家2:" + player2);
System.out.println("玩家3:" + player3);
System.out.println("底牌:" + bottom);
}
/**
* 发牌 0、1、2 分别代表 前三个玩家 其他代表底牌
*/
public static ArrayList<Card> push(int count) {
ArrayList<Card> player = new ArrayList<>(17);
if (count == 0) {
for (int i = 0; i < 17; i++) {
player.add(pokers.get(i));
}
} else if (count == 1) {
for (int i = 17; i < 34; i++) {
player.add(pokers.get(i));
}
} else if (count == 2) {
for (int i = 34; i < 51; i++) {
player.add(pokers.get(i));
}
} else {
for (int i = 51; i < 54; i++) {
player.add(pokers.get(i));
}
}
return player;
}
}
四、效果图
五、总结
1.扑克牌内有花色、数字两个基本属性,一个id用于排序的属性。
2.初始化纸牌的时候放在static代码块内,FightTheLandlord类加载的时候就会把54张牌初始化。纸牌集合定义为静态变量共享。
3.两层循环把花色与数字组合。加入id用作后面排序,把大小王id分为54,53。因为初始化扑克牌的时候就是花色和数字都是从大到小排列的,所以从♠️2开始只需要依次赋值后再把id-,同理♦️3的值就是1最小。
4.洗牌用到了Collections工具类的shuffle方法(随机打乱List集合中元素的顺序)。
5.发牌就三个玩家从打乱的牌堆集合中从下标0依次开取,每人17张(一次性发17张)最后三张作为底牌。
6.查看牌之前先把分到的牌排序,就用到了Collections工具类的sort方法,Card类实现Comparable接口重写compareTo方法,自定义降序排序。