本篇简要介绍如何洗牌和发牌。
这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("没有排序的牌:"); ArrayList6.程序运行结果allCards2 = one.getAllCards(); CardUtil.printCards(allCards2); logger.info("排序之后的牌:"); CardUtil.sortCards(allCards2); CardUtil.printCards(allCards2); }
洗牌之前:
方块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)
相关阅读
面向对象实现斗地主程序的核心算法,包括洗牌、发牌、判断牌型、比较牌的大小、游戏规则等。
原文参见: