Java模拟斗地主发牌看牌

166 阅读3分钟

Java模拟斗地主发牌看牌


首先做准备工作

建立一个Card类,设置成员变量牌的花色color和值point 进行封装并设置无参有参构造

设置一个字符串数组放置3个玩家

  String[] players=**new** String[3];

设置一个数组存放花色

 String[] color= {"♠","♥","♣","♦"};

设置一个数组存放牌值

String[]points={"2","3","4","5","6","7","8","9","10","J","Q","K","A"};

设置一个牌盒 存放牌

List<Card> cards=**new** ArrayList<Card>();

设置一个牌盒存放三张底牌

Card[] bottomCards=**new** Card[3];

设置一个map集合表示每个玩家和其手中对应的手牌

Map<String, List<Card>> maps=new HashMap<String, List<Card>>();

还需要设置一个外部比较器用来对各个玩家的手牌进行排序

我们把整个过程分成4步(只进行到看牌)

1. 加入2.洗牌3.发牌并排序4.看牌


1. 加入

public void addPlayers(String...names) {
	if(names.length>=3) {
		players[0]=names[0];
		players[1]=names[1];
		players[2]=names[2];
	}else {
		for(int i=0;i<names.length;i++) {
			players[i]=names[i];
		}
		for(int i=names.length;i<players.length;i++) {
			players[i]="电脑"+(int)(Math.random()*10000);
		}
	}
}

这里设置可变参数names

当人数大于等于3时 赋值玩家一,玩家二,玩家三。

当人数小于3时赋值玩家和电脑,不足三人时自动补位电脑


2. 洗牌

  public void shuffleCards() {
	for(int i=0;i<color.length;i++) {
		for(int j=0;j<points.length;j++) {
			Card cc=new Card(color[i], points[j]);
			cards.add(cc);
		}
	}
	cards.add(new Card("大王", "大哥"));
	cards.add(new Card("小王", "小弟"));
	//随机洗牌
	Collections.shuffle(cards);
}

这里使用嵌套循环4个花色和13张牌(除大小王)结合来生成扑克牌并用cc来接到结果放入牌盒cards中,然后继续加入大小王利用新建Card对象

最后使用collections中的shuffle方法对牌盒中 的牌进行乱序(洗牌)


3. 发牌并排序

    public void sendCrads() {
	//留三张底牌
	bottomCards[0]=cards.get(cards.size()-1);//53(下标)
	bottomCards[1]=cards.get(cards.size()-2);//52
	bottomCards[2]=cards.get(cards.size()-3);//51
	//给三个玩家发牌并给他排序
	List<Card> p1cards=new ArrayList<Card>();
	List<Card> p2cards=new ArrayList<Card>();
	List<Card> p3cards=new ArrayList<Card>();
	for(int i=0;i<cards.size()-3;i++) {
		if(i%3==0) {
			p1cards.add(cards.get(i));
		}
		if(i%3==1) {
			p2cards.add(cards.get(i));
		}
		if(i%3==2) {
			p3cards.add(cards.get(i));
		}
	}
	//排序
	Bijiao cc=new Bijiao();
	Collections.sort(p1cards, cc);
	Collections.sort(p2cards, cc);
	Collections.sort(p3cards, cc);
	
	maps.put(players[0], p1cards);
	maps.put(players[1], p2cards);
	maps.put(players[2], p3cards);
}

发牌之前首先要留三张底牌

使用之前设置的底牌牌盒分别把下标53,52,51处的牌认定为底牌并放入底牌盒中

然后设置三个玩家的牌盒 p1cards,p2cards,p3cards

使用加强for来对除底牌外的牌进行分配,分为三份,可以用模三的方法来判断

分发给各个玩家手牌之后,需要对玩家手牌进行排序,这里需要使用之前说过的外部比较器,对于怎么比较牌值和花色最下面会说。

分别把玩家一、玩家二、玩家三、手中的牌进行排序,然后放入map集合键值对中,<玩家,玩家手中的牌(即玩家牌盒)>


4. 看牌

 public void lookAllCards() {
	System.out.println("底牌:"+Arrays.toString(bottomCards));
	for (String p : players) {
		System.out.println(p+"手牌:");
		System.out.println(maps.get(p));
	}
}

这里首先看底牌遍历出三张底牌

然后使用加强for来看每个玩家的手牌

Main:

public static void main(String[] args) {
	PUke aa=new PUke();
	aa.addPlayers("小博","小肖","小杰");
	aa.shuffleCards();
	aa.sendCrads();
	aa.lookAllCards();
}

设置三个玩家并调用其4个方法即步骤完成


完整代码如下:
Card类:

private String color;
private String point;
public String getColor() {
	return color;
}
public void setColor(String color) {
	this.color = color;
}
public String getPoint() {
	return point;
}
public void setPoint(String point) {
	this.point = point;
}
public Card() {
	super();
}
public Card(String color, String point) {
	super();
	this.color = color;
	this.point = point;
}
@Override
public String toString() {
	return color + point ;
}

 

外部比较器:

@Override
public int compare(Card o1, Card o2) {
	if(this.getPoint(o1)!=this.getPoint(o2)) {
		return this.getPoint(o2)-this.getPoint(o1);
	}
	return this.getColor(o2)-this.getColor(o1);
}
//返回指定参数卡片的点数转成的整数
public  int getPoint(Card card) {
	//如果card的点数是3456789 10 则对应的转成整数并返回
	//如果card的点数是J 返回11
	//如果card的点数是Q 返回12
	//如果card的点数是K 返回13
	//如果card的点数是A 返回14
	//如果card的点数是2 返回15
	//如果card的点数是小弟 返回50
	//如果card的点数是大哥 返回100
	int point=0;
	switch (card.getPoint()) {
	case "J":
		point=11;
		break;
	case "Q":
		point=12;
		break;
	case "K":
		point=13;
		break;
	case "A":
		point=14;
		break;
	case "2":
		point=15;
		break;
	case "小弟":
		point=50;
		break;
	case "大哥":
		point=100;
		break;

	default:
		point=Integer.parseInt(card.getPoint());
		break;
	}
	return point;
}
//返回指定参数卡片的花色转成的整数
public int getColor(Card card) {
	//{"♠","♥","♣","♦"}
	int num=0;
	switch (card.getColor()) {
	case "♠":
		num=4;
		break;
	case "♥":
		num=3;
		break;

	case "♣":
		num=2;
		break;

	case "♦":
		num=1;
		break;
	}
	return num;
}

扑克牌桌:

 

String[] players=new String[3];//玩家
String[] color= {"♠","♥","♣","♦"};//花色
String[] points= {"2","3","4","5","6","7","8","9","10","J","Q","K","A"};//点数
List<Card> cards=new ArrayList<Card>();//牌盒
Card[] bottomCards=new Card[3];//底牌
Map<String, List<Card>> maps=new HashMap<String, List<Card>>();//每个玩家及其手中的牌
//1.加入
public void addPlayers(String...names) {
	if(names.length>=3) {
		players[0]=names[0];
		players[1]=names[1];
		players[2]=names[2];
	}else {
		for(int i=0;i<names.length;i++) {
			players[i]=names[i];
		}
		for(int i=names.length;i<players.length;i++) {
			players[i]="电脑"+(int)(Math.random()*10000);
		}
	}
}
//2.洗牌
public void shuffleCards() {
	for(int i=0;i<color.length;i++) {
		for(int j=0;j<points.length;j++) {
			Card cc=new Card(color[i], points[j]);
			cards.add(cc);
		}
	}
	cards.add(new Card("大王", "大哥"));
	cards.add(new Card("小王", "小弟"));
	//随机洗牌
	Collections.shuffle(cards);
}
//3.发牌
public void sendCrads() {
	//留三张底牌
	bottomCards[0]=cards.get(cards.size()-1);//53(下标)
	bottomCards[1]=cards.get(cards.size()-2);//52
	bottomCards[2]=cards.get(cards.size()-3);//51
	//给三个玩家发牌并给他排序
	List<Card> p1cards=new ArrayList<Card>();
	List<Card> p2cards=new ArrayList<Card>();
	List<Card> p3cards=new ArrayList<Card>();
	for(int i=0;i<cards.size()-3;i++) {
		if(i%3==0) {
			p1cards.add(cards.get(i));
		}
		if(i%3==1) {
			p2cards.add(cards.get(i));
		}
		if(i%3==2) {
			p3cards.add(cards.get(i));
		}
	}
	//排序
	Bijiao cc=new Bijiao();
	Collections.sort(p1cards, cc);
	Collections.sort(p2cards, cc);
	Collections.sort(p3cards, cc);
	
	maps.put(players[0], p1cards);
	maps.put(players[1], p2cards);
	maps.put(players[2], p3cards);
}
//4.看牌
public void lookAllCards() {
	System.out.println("底牌:"+Arrays.toString(bottomCards));
	for (String p : players) {
		System.out.println(p+"手牌:");
		System.out.println(maps.get(p));
	}
}
public static void main(String[] args) {
	PUke aa=new PUke();
	aa.addPlayers("小博","小肖","小杰");
	aa.shuffleCards();
	aa.sendCrads();
	aa.lookAllCards();
}

代码运行结果

image.png

外部比较器:

牌值和花色难以比较,所以在外部比较器里设置了两个方法

把牌值和花色都转化为整数型来进行比较,这里采用的是降序

需要注意的一个小点就是需要在Card类中重写tostring,不然不会出现我们想要的结果,可以自己来试一试