Java实现斗地主发牌功能,关照发牌,针对发牌,正常发牌

每次斗地主,总感觉被腾讯针对,给我发不到好牌!于是,自己动手实现了一个发牌功能,能针对某个人,给他发不好的牌,也可以鼓励菜鸡,发一手吊炸天的牌。

主要有四个类:

  • 纸牌类:Card
  • 玩家类:Palyer
  • 游戏桌类:Machine
  • 荷官类:Croupier
package com.bonc.xcloud.procedure.doudi;

/**
 * 扑克牌类
 * 
 * @author 191013
 *
 */
public class Card implements Comparable<Card> {
	private int id;
	private String cardName;
	private static int count;

	public Card(String cardName) {
		super();
		count++;
		this.cardName = cardName;
		this.id = count;// 这个顺序就是创建牌的顺序
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getCardName() {
		return cardName;
	}

	public void setCardName(String cardName) {
		this.cardName = cardName;
	}

	public static int getCount() {
		return count;
	}

	public static void setCount(int count) {
		Card.count = count;
	}

	@Override
	public int compareTo(Card card) {
		return this.id - card.id;
	}

	@Override
	public String toString() {
		return getCardName();
	}
}

package com.bonc.xcloud.procedure.doudi;

import java.util.ArrayList;
import java.util.List;

/**
 * 玩家实体类
 * 
 * @author 191013
 *
 */
public class Palyer {
	private String palyerName;
	List<Card> cardList = null;

	public Palyer(String palyString) {
		this.palyerName = palyString;
		this.cardList = new ArrayList<Card>();
	}

	public List<Card> getCardList() {
		return cardList;
	}

	public void setCardList(List<Card> cardList) {
		this.cardList = cardList;
	}

	public String getPalyerName() {
		return palyerName;
	}

	public void setPalyerName(String palyerName) {
		this.palyerName = palyerName;
	}

	public void addCard(Card card) {
		cardList.add(card);
	}

}

package com.bonc.xcloud.procedure.doudi;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

/**
 * 发牌机器
 * 
 * @author 191013
 *
 */
public class Machine {

	public Machine() {
		super();
	}

	/**
	 * 创建一副牌
	 * 
	 * @return allCard
	 */
	public List<Card> createCardList() {
		String[] collor = { "♥", "♠", "♦", "♣" };
		String[] number = { "2", "A", "K", "Q", "J", "10", "9", "8", "7", "6", "5", "4", "3" };
		List<Card> allCard = new ArrayList<Card>();

		// 这里要注意添加顺序
		allCard.add(new Card("大王"));
		allCard.add(new Card("小王"));
		for (String n : number) {
			for (String c : collor) {
				Card card = new Card(n + c);
				allCard.add(card);
			}
		}
		return allCard;
	}

	/**
	 * 洗牌
	 * 
	 * @param allCards
	 */
	public void shuffle(List<Card> allCards) {
		if (allCards != null) {
			Collections.shuffle(allCards);
		}
	}

	/**
	 * 常规发牌
	 * 
	 * @param allPalyers 所有玩家
	 */
	public void generalDealCard(List<Card> allCard, List<Palyer> allPalyers, List<Card> end) {
		if (allPalyers.size() != 3) {
			System.out.println("玩家数量不是三人!");
			return;
		}

		// 洗牌
		shuffle(allCard);

		int count = 1;
		for (Card c : allCard) {
			if (count % 3 == 1 && count < 52)
				allPalyers.get(0).addCard(c);
			else if (count % 3 == 2 && count < 52)
				allPalyers.get(1).addCard(c);
			else if (count % 3 == 0 && count < 52)
				allPalyers.get(2).addCard(c);
			else
				end.add(c);
			count++;
		}
	}

	/**
	 * 针对某个玩家发牌
	 * 
	 * @param allPalyers
	 * @param end
	 * @param specialName
	 */
	public void specialDealCard(List<Card> allCard, List<Palyer> allPalyers, List<Card> end, String specialName) {
		if (allPalyers.size() != 3) {
			System.out.println("玩家数量不是三人!");
			return;
		}

		Palyer specialPalyer = null;
		Palyer palyer2 = null;
		Palyer palyer3 = null;

		for (Palyer p : allPalyers) {
			if (p.getPalyerName().equals(specialName)) {
				specialPalyer = p;
			} else {
				if (palyer2 == null) {
					palyer2 = p;
				} else if (palyer3 == null) {
					palyer3 = p;
				}
			}
		}

		if (specialPalyer == null) {// 给的名字不在当前参与的玩家中
			generalDealCard(allCard, allPalyers, end);
			return;
		}

		// 洗牌
		shuffle(allCard);

		for (int i = 0; i < 54; i++) {
			if (i % 3 == 0 && i < 51) {
				specialPalyer.addCard(specialDealCardToPalyer(allCard, i));
			} else if (i % 3 == 1 && i < 51) {
				palyer2.addCard(allCard.get(i));
			} else if (i % 3 == 2 && i < 51) {
				palyer3.addCard(allCard.get(i));
			} else {
				end.add(allCard.get(i));
			}
		}

	}

	/**
	 * 对牌做手脚,让他得到不好的牌
	 * 
	 * @param allCard
	 * @param index
	 * @return
	 */
	public Card specialDealCardToPalyer(List<Card> allCard, int index) {
		HashMap<String, String> specialCard = new HashMap<String, String>();
		specialCard.put("大王", "");
		specialCard.put("小王", "");
		specialCard.put("2♠", "");
		specialCard.put("2♥", "");
		specialCard.put("2♦", "");
		specialCard.put("2♣", "");
		specialCard.put("A♠", "");
		specialCard.put("K♦", "");
		specialCard.put("Q♠", "");
		specialCard.put("J♠", "");

		int next = index + 1;
		while (next < allCard.size() && specialCard.containsKey(allCard.get(index).getCardName())) {
			Collections.swap(allCard, index, next);
			next++;
		}
		return allCard.get(index);
	}

	/**
	 * 照顾菜鸡发牌
	 * 
	 * @param allCard
	 * @param allPalyers
	 * @param end
	 * @param specialName
	 */
	public void careDealCard(List<Card> allCard, List<Palyer> allPalyers, List<Card> end, String specialName) {
		if (allPalyers.size() != 3) {
			System.out.println("玩家数量不是三人!");
			return;
		}
		Palyer specialPalyer = null;
		Palyer palyer2 = null;
		Palyer palyer3 = null;

		for (Palyer p : allPalyers) {
			if (p.getPalyerName().equals(specialName)) {
				specialPalyer = p;
			} else {
				if (palyer2 == null) {
					palyer2 = p;
				} else if (palyer3 == null) {
					palyer3 = p;
				}
			}
		}

		if (specialPalyer == null) {// 给的名字不在当前参与的玩家中
			generalDealCard(allCard, allPalyers, end);
			return;
		}

		// 洗牌
		shuffle(allCard);

		for (int i = 0; i < 54; i++) {
			if (i % 3 == 0 && i < 51) {
				specialPalyer.addCard(careDealCardToPalyer(allCard, i));
			} else if (i % 3 == 1 && i < 51) {
				palyer2.addCard(allCard.get(i));
			} else if (i % 3 == 2 && i < 51) {
				palyer3.addCard(allCard.get(i));
			} else {
				end.add(allCard.get(i));
			}
		}

	}

	/**
	 * 对牌做手脚,让他得到好牌
	 * 
	 * @param allCard
	 * @param index
	 * @return
	 */
	public Card careDealCardToPalyer(List<Card> allCard, int index) {
		HashMap<String, String> specialCard = new HashMap<String, String>();
		specialCard.put("大王", "");
		specialCard.put("小王", "");
		specialCard.put("2♠", "");
		specialCard.put("2♥", "");
		specialCard.put("2♦", "");
		specialCard.put("2♣", "");
		specialCard.put("10♠", "");
		specialCard.put("10♣", "");

		int next = index + 1;
		while (next < allCard.size() && (!specialCard.containsKey(allCard.get(index).getCardName()))) {
			Collections.swap(allCard, index, next);
			next++;
		}
		return allCard.get(index);
	}
}

package com.bonc.xcloud.procedure.doudi;

import java.util.Collections;
import java.util.List;

/**
 * 荷官,负责发牌,洗牌
 * 
 * @author 191013
 *
 */
public class Croupier {
	private Machine machine;
	private List<Card> allCard;

	public Croupier() {
		this.machine = new Machine();
		allCard = machine.createCardList();
	}

	/**
	 * 正常发牌
	 * 
	 * @param allPalyers
	 */
	public void generalDealCard(List<Palyer> allPalyers, List<Card> end) {
		// 发牌之前要保证每个玩家手里没有牌
		for (Palyer p : allPalyers) {
			if (p.getCardList() != null && p.getCardList().size() != 0) {
				p.getCardList().clear();
			}
		}
		// 底盒中也不能有底牌
		if (end != null && end.size() != 0) {
			end.clear();
		}
		machine.generalDealCard(allCard, allPalyers, end);
	}

	/**
	 * 给croupier一个名字,她会还你一个天台
	 * 
	 * @param allPalyers
	 * @param end
	 * @param specialName
	 */
	public void specialDealCard(List<Palyer> allPalyers, List<Card> end, String specialName) {
		// 发牌之前要保证每个玩家手里没有牌
		for (Palyer p : allPalyers) {
			if (p.getCardList() != null && p.getCardList().size() != 0) {
				p.getCardList().clear();
			}
		}
		// 底盒中也不能有底牌
		if (end != null && end.size() != 0) {
			end.clear();
		}
		machine.specialDealCard(allCard, allPalyers, end, specialName);
	}

	/**
	 * 给croupier一个名字,她会还你一个世界
	 * 
	 * @param allPalyers
	 * @param end
	 * @param specialName
	 */
	public void careDealCard(List<Palyer> allPalyers, List<Card> end, String specialName) {
		// 发牌之前要保证每个玩家手里没有牌
		for (Palyer p : allPalyers) {
			if (p.getCardList() != null && p.getCardList().size() != 0) {
				p.getCardList().clear();
			}
		}
		// 底盒中也不能有底牌
		if (end != null && end.size() != 0) {
			end.clear();
		}
		machine.careDealCard(allCard, allPalyers, end, specialName);
	}

	/**
	 * 看牌
	 * 
	 * @param allPalyers
	 * @param end
	 */
	public void printCard(List<Palyer> allPalyers, List<Card> end) {
		for (Palyer palyer : allPalyers) {
			Collections.sort(palyer.getCardList());
			System.out.println(palyer.getPalyerName() + " : " + palyer.getCardList().toString());
		}
		Collections.sort(end);
		System.out.println(end);
	}

}

Main中测试一下:

package com.bonc.xcloud.procedure.doudi;

import java.util.ArrayList;
import java.util.List;

public class Main {
	public static void main(String[] args) {
		List<Palyer> allPalyers = new ArrayList<Palyer>();
		List<Card> end = new ArrayList<Card>();

		System.out.println("黄氏赌场,讲究的就是公平、公正、公开,关心每一位赌徒的生命使我们义不容辞的责任:");
		Palyer p1 = new Palyer("菜原原");
		Palyer p2 = new Palyer("蔡徐坤");
		Palyer p3 = new Palyer("酱油甲");
		allPalyers.add(p1);
		allPalyers.add(p2);
		allPalyers.add(p3);

		// 澳门皇家赌场,性感荷官在线发牌
		Croupier croupier = new Croupier();

		// 发牌
		croupier.generalDealCard(allPalyers, end);
		// 看牌
		croupier.printCard(allPalyers, end);

		System.out.println("\n菜原原有点狂,将要被针对:");
		// 发牌
		croupier.specialDealCard(allPalyers, end, p1.getPalyerName());
		// 看牌
		croupier.printCard(allPalyers, end);

		System.out.println("\n菜原原哭了,觉得自己不应该狂,赶快照顾一下:");
		// 发牌
		croupier.careDealCard(allPalyers, end, p1.getPalyerName());
		// 看牌
		croupier.printCard(allPalyers, end);
	}
}

测试结果:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yelvens

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值