本篇简要介绍如何洗牌和发牌。
这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