本篇简要介绍如何洗牌和发牌。
这2个算法都很简单,有兴趣的同学可以写得更好一点。
关键点说明
a.洗牌算法的思路就是,构造54张牌,打乱牌N次,这个算法可能不够随机。
b.发牌算法的思路就是,从洗好的牌中,按规律发给3个玩家,比如1好玩家就取第1、4、7等17张牌。
c.3个玩家,谁取到id为1的这张牌,谁就是“地主”。
1.初始化
/**
* 初始化
*/
private void deal() {
shuffle();
divide();
}
2.洗牌
/**
* 洗牌
*/
private void shuffle() {
for (int i = 0; i < 54; i++) {
Card card = new Card(i + 1);
allCards.add(card);
}
System.out.println("洗牌之前:");
CardUtil.printCards(allCards);
// 洗牌,交换1000次
for (int i = 0; i <= 1000; i++) {
Collections.shuffle(allCards);// 打乱牌的位置
}
System.out.println("洗牌之后:");
CardUtil.printCards(allCards);
}
3.发牌
//发牌
private void divide() {
// 1号玩家的牌
for (int j = 0; j < 17; j++) {
Card card = allCards.get(j * 3);
myCards.add(card);
if (myCards.get(j).id == 1) {
diZhu = 1;
}
}
// 2号玩家的牌
for (int j = 0; j < 17; j++) {
Card card = allCards.get(j * 3 + 1);
rightCards.add(card);
if (rightCards.get(j).id == 1) {
diZhu = 2;
}
}
// 3号玩家的牌
for (int j = 0; j < 17; j++) {
Card card = allCards.get(j * 3 + 2);
leftCards.add(card);
if (leftCards.get(j).id == 1) {
diZhu = 3;
}
}
for (int i = 51; i < 54; i++) {
Card card = allCards.get(i);
topCards.add(card);
Card card2 = new Card(card.id);
copyOfTopCards.add(card2);
}
CardUtil.sortCards(myCards);
CardUtil.sortCards(leftCards);
CardUtil.sortCards(rightCards);
}
4.打印牌
/**
* 打印牌
*/
private void printCards() {
System.out.println("玩家1的牌:");
CardUtil.printCards(myCards);
System.out.println("玩家2的牌:");
CardUtil.printCards(leftCards);
System.out.println("玩家3的牌:");
CardUtil.printCards(rightCards);
System.out.println("底牌:");
CardUtil.printCards(topCards);
}
5.运行洗牌发牌程序
public static void main(String[] args) {
DealingDevice one = new DealingDevice();
one.printCards();
logger.info("没有排序的牌:");
ArrayList<Card> allCards2 = one.getAllCards();
CardUtil.printCards(allCards2);
logger.info("排序之后的牌:");
CardUtil.sortCards(allCards2);
CardUtil.printCards(allCards2);
}
6.程序运行结果
洗牌之前:
方块A(A0.gif) 方块2(20.gif) 方块3(30.gif) 方块4(40.gif) 方块5(50.gif) 方块6(60.gif) 方块7(70.gif) 方块8(80.gif) 方块9(90.gif) 方块10(100.gif) 方块J(J0.gif) 方块Q(Q0.gif) 方块K(K0.gif) 梅花A(A1.gif) 梅花2(21.gif) 梅花3(31.gif) 梅花4(41.gif) 梅花5(51.gif) 梅花6(61.gif) 梅花7(71.gif) 梅花8(81.gif) 梅花9(91.gif) 梅花10(101.gif) 梅花J(J1.gif) 梅花Q(Q1.gif) 梅花K(K1.gif) 红桃A(A2.gif) 红桃2(22.gif) 红桃3(32.gif) 红桃4(42.gif) 红桃5(52.gif) 红桃6(62.gif) 红桃7(72.gif) 红桃8(82.gif) 红桃9(92.gif) 红桃10(102.gif) 红桃J(J2.gif) 红桃Q(Q2.gif) 红桃K(K2.gif) 黑桃A(A3.gif) 黑桃2(23.gif) 黑桃3(33.gif) 黑桃4(43.gif) 黑桃5(53.gif) 黑桃6(63.gif) 黑桃7(73.gif) 黑桃8(83.gif) 黑桃9(93.gif) 黑桃10(103.gif) 黑桃J(J3.gif) 黑桃Q(Q3.gif) 黑桃K(K3.gif) 小王XiaoWang(smallJoker.gif) 大王DaWang(bigJoker.gif)
洗牌之后:
红桃7(72.gif) 红桃J(J2.gif) 方块J(J0.gif) 大王DaWang(bigJoker.gif) 黑桃5(53.gif) 梅花Q(Q1.gif) 黑桃2(23.gif) 梅花6(61.gif) 红桃2(22.gif) 方块K(K0.gif) 红桃5(52.gif) 红桃6(62.gif) 梅花4(41.gif) 黑桃K(K3.gif) 梅花J(J1.gif) 梅花9(91.gif) 红桃3(32.gif) 方块10(100.gif) 方块8(80.gif) 方块Q(Q0.gif) 黑桃10(103.gif) 黑桃9(93.gif) 红桃4(42.gif) 方块9(90.gif) 黑桃3(33.gif) 黑桃6(63.gif) 黑桃7(73.gif) 梅花K(K1.gif) 红桃8(82.gif) 梅花5(51.gif) 方块2(20.gif) 红桃9(92.gif) 红桃Q(Q2.gif) 小王XiaoWang(smallJoker.gif) 红桃A(A2.gif) 梅花A(A1.gif) 梅花8(81.gif) 方块5(50.gif) 方块4(40.gif) 方块3(30.gif) 方块6(60.gif) 黑桃4(43.gif) 黑桃J(J3.gif) 梅花3(31.gif) 梅花2(21.gif) 梅花7(71.gif) 方块7(70.gif) 方块A(A0.gif) 红桃K(K2.gif) 黑桃Q(Q3.gif) 红桃10(102.gif) 梅花10(101.gif) 黑桃8(83.gif) 黑桃A(A3.gif)
玩家1的牌:
方块3(30.gif) 黑桃3(33.gif) 梅花4(41.gif) 梅花7(71.gif) 红桃7(72.gif) 方块8(80.gif) 梅花8(81.gif) 梅花9(91.gif) 黑桃9(93.gif) 黑桃J(J3.gif) 方块K(K0.gif) 梅花K(K1.gif) 红桃K(K2.gif) 方块2(20.gif) 黑桃2(23.gif) 小王XiaoWang(smallJoker.gif) 大王DaWang(bigJoker.gif)
玩家2的牌:
方块 4(40.gif) 黑桃4(43.gif) 梅花5(51.gif) 红桃6(62.gif) 黑桃7(73.gif) 方块9(90.gif) 方块10(100.gif) 红桃10(102.gif) 黑桃10(103.gif) 方块J(J0.gif) 梅花J(J1.gif) 梅花Q(Q1.gif) 红桃Q(Q2.gif) 方块A(A0.gif) 梅花A(A1.gif) 梅花2(21.gif) 红桃2(22.gif)
玩家3的牌:
梅花3(31.gif) 红桃3(32.gif) 红桃4(42.gif) 方块5(50.gif) 红桃5(52.gif) 黑桃5(53.gif) 方块6(60.gif) 梅花6(61.gif) 黑桃6(63.gif) 方块7(70.gif) 红桃8(82.gif) 红桃9(92.gif) 红桃J(J2.gif) 方块Q(Q0.gif) 黑桃Q(Q3.gif) 黑桃K(K3.gif) 红桃A(A2.gif)
底牌:
梅花10(101.gif) 黑桃8(83.gif) 黑桃A(A3.gif)
红桃7(72.gif) 十月 11, 2013 1:16:41 下午 cn.fansunion.ddz.client.DealingDevice main
INFO: 没有排序的牌:
红桃J(J2.gif) 方块J(J0.gif) 大王DaWang(bigJoker.gif) 黑桃5(53.gif) 梅花Q(Q1.gif) 黑桃2(23.gif) 梅花6(61.gif) 红桃2(22.gif) 方块K(K0.gif) 红桃5(52.gif) 红桃6(62.gif) 梅花4(41.gif) 黑桃K(K3.gif) 梅花J(J1.gif) 梅花9(91.gif) 红桃3(32.gif) 方块10(100.gif) 方块8(80.gif) 方块Q(Q0.gif) 黑桃10(103.gif) 黑桃9(93.gif) 红桃4(42.gif) 方块9(90.gif) 黑桃3(33.gif) 黑桃6(63.gif) 黑桃7(73.gif) 梅花K(K1.gif) 红桃8(82.gif) 梅花5(51.gif) 方块2(20.gif) 红桃9(92.gif) 红桃Q(Q2.gif) 小王XiaoWang(smallJoker.gif) 红桃A(A2.gif) 梅花A(A1.gif) 梅花8(81.gif) 方块5(50.gif) 方块4(40.gif) 方块3(30.gif) 方块6(60.gif) 黑桃4(43.gif) 黑桃J(J3.gif) 梅花3(31.gif) 梅花2(21.gif) 梅花7(71.gif) 方块7(70.gif) 方块A(A0.gif) 红桃K(K2.gif) 黑桃Q(Q3.gif) 红桃10(102.gif) 梅花10(101.gif) 黑桃8(83.gif) 黑桃A(A3.gif)
十月 11, 2013 1:16:41 下午 cn.fansunion.ddz.client.DealingDevice main
INFO: 排序之后的牌:
方块3(30.gif) 梅花3(31.gif) 红桃3(32.gif) 黑桃3(33.gif) 方块4(40.gif) 梅花4(41.gif) 红桃4(42.gif) 黑桃4(43.gif) 方块5(50.gif) 梅花5(51.gif) 红桃5(52.gif) 黑桃5(53.gif) 方块6(60.gif) 梅花6(61.gif) 红桃6(62.gif) 黑桃6(63.gif) 方块7(70.gif) 梅花7(71.gif) 红桃7(72.gif) 黑桃7(73.gif) 方块8(80.gif) 梅花8(81.gif) 红桃8(82.gif) 黑桃8(83.gif) 方块9(90.gif) 梅花9(91.gif) 红桃9(92.gif) 黑桃9(93.gif) 方块10(100.gif) 梅花10(101.gif) 红桃10(102.gif) 黑桃10(103.gif) 方块J(J0.gif) 梅花J(J1.gif) 红桃J(J2.gif) 黑桃J(J3.gif) 方块Q(Q0.gif) 梅花Q(Q1.gif) 红桃Q(Q2.gif) 黑桃Q(Q3.gif) 方块K(K0.gif) 梅花K(K1.gif) 红桃K(K2.gif) 黑桃K(K3.gif) 方块A(A0.gif) 梅花A(A1.gif) 红桃A(A2.gif) 黑桃A(A3.gif) 方块2(20.gif) 梅花2(21.gif) 红桃2(22.gif) 黑桃2(23.gif) 小王XiaoWang(smallJoker.gif) 大王DaWang(bigJoker.gif)
相关阅读
斗地主算法的设计与实现–项目介绍&如何定义和构造一张牌
原文参见: http://FansUnion.cn/articles/2735