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();
}
代码运行结果
外部比较器:
牌值和花色难以比较,所以在外部比较器里设置了两个方法
把牌值和花色都转化为整数型来进行比较,这里采用的是降序
需要注意的一个小点就是需要在Card类中重写tostring,不然不会出现我们想要的结果,可以自己来试一试