黑马程序员技术交流社区

标题: 练习:模拟斗地主的洗牌、发牌、看牌过程 [打印本页]

作者: fmi110    时间: 2015-9-6 09:25
标题: 练习:模拟斗地主的洗牌、发牌、看牌过程
a
  1. /**
  2. * 需求:模拟实现斗地主的分牌情形
  3. * 分析:        1 模拟牌盒,存储54张牌,0-53 每个数字分别对应一张牌,用Map存储
  4. *                         2 将0-53序号随机分发到三个人手中,欲实现序号的随机排序,考虑使用Collections.shuffle()
  5. *                         因此序号使用ArrayList存储
  6. *                         3 看牌,并且实现玩家手上的拍由小到大排序,所以考虑使用TreeSet存储
  7. */
  8. package fmi1;

  9. import java.util.ArrayList;
  10. import java.util.Collections;
  11. import java.util.HashMap;
  12. import java.util.TreeSet;

  13. public class PokerSimulate {

  14.         /**
  15.          * @param args
  16.          */
  17.         public static void main(String[] args) {
  18.                 //建立牌盒
  19.                 String[] color = {"♦","♣","♥","♠"};//花色
  20.                 String[] size ={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};//大小
  21.                 //建立集合存牌
  22.                 HashMap<Integer, String> hm = new HashMap<Integer,String>();
  23.                 //循环组牌并存至集合
  24.                 int key = 0;
  25.                 for(String s1:size){
  26.                         for(String s2:color){
  27.                                 String value = s2 + s1;
  28.                                 hm.put(key, value);
  29.                                 key++;
  30.                         }
  31.                 }
  32.                 hm.put(key++, "LKing");
  33.                 hm.put(key, "BKing");
  34.                 //输出牌
  35.                 printPoke(hm);
  36.                 //建立ArrayList实现牌的序号的随机分布
  37.                 ArrayList<Integer> al = new ArrayList<Integer>();
  38.                 //存序号
  39.                 for(int i = 0;i < 54;i++){
  40.                         al.add(i);
  41.                 }
  42.                 //洗牌
  43.                 Collections.shuffle(al);
  44.                 //新建3个玩家和一个底牌,即TreeSet集合
  45.                 TreeSet<Integer> gamer1 = new TreeSet<Integer>();
  46.                 TreeSet<Integer> gamer2 = new TreeSet<Integer>();
  47.                 TreeSet<Integer> gamer3 = new TreeSet<Integer>();
  48.                 TreeSet<Integer> dipai = new TreeSet<Integer>();
  49.                 //发牌
  50.                 for(int i = 0;i<al.size();i++){
  51.                         if(i >= al.size()-3)
  52.                                 dipai.add(al.get(i));
  53.                         else if(i%3==0)
  54.                                 gamer1.add(al.get(i));
  55.                         else if(i%3==1)
  56.                                 gamer2.add(al.get(i));
  57.                         else
  58.                                 gamer3.add(al.get(i));
  59.                 }
  60. //                System.out.println(gamer1);
  61. //                System.out.println(gamer2);
  62. //                System.out.println(gamer3);
  63. //                System.out.println(dipai);
  64.                 //看牌
  65.                 System.out.println("玩家1:");
  66.                 checkPoker(gamer1,hm);
  67.                 System.out.println("玩家2:");
  68.                 checkPoker(gamer2,hm);
  69.                 System.out.println("玩家3:");
  70.                 checkPoker(gamer3,hm);
  71.                 System.out.println("底牌:");
  72.                 checkPoker(dipai,hm);
  73.         }

  74.         private static void checkPoker(TreeSet<Integer> gamer,
  75.                         HashMap<Integer, String> hm) {
  76.                 for(int key:gamer){
  77. //                        System.out.print(key+" ");
  78.                         System.out.print(hm.get(key)+" ");
  79.                 }
  80.                 System.out.println();
  81.                
  82.         }

  83.         private static void printPoke(HashMap<Integer, String> hm) {
  84.                 System.out.print("扑克牌:");
  85.                 for (int i = 0; i < hm.size(); i++) {
  86.                         if (i % 4 == 0)
  87.                                 System.out.println();
  88.                         System.out.print(hm.get(i) + "\t");
  89.                 }
  90.                 System.out.println();
  91.         }

  92. }
复制代码



作者: fmi110    时间: 2015-9-6 09:26
运行结果
  1. 扑克牌:
  2. ♦3        ♣3        ♥3        ♠3       
  3. ♦4        ♣4        ♥4        ♠4       
  4. ♦5        ♣5        ♥5        ♠5       
  5. ♦6        ♣6        ♥6        ♠6       
  6. ♦7        ♣7        ♥7        ♠7       
  7. ♦8        ♣8        ♥8        ♠8       
  8. ♦9        ♣9        ♥9        ♠9       
  9. ♦10        ♣10        ♥10        ♠10       
  10. ♦J        ♣J        ♥J        ♠J       
  11. ♦Q        ♣Q        ♥Q        ♠Q       
  12. ♦K        ♣K        ♥K        ♠K       
  13. ♦A        ♣A        ♥A        ♠A       
  14. ♦2        ♣2        ♥2        ♠2       
  15. LKing        BKing       
  16. 玩家1:
  17. ♣3 ♦4 ♠5 ♦6 ♣7 ♥7 ♠7 ♦9 ♣10 ♠J ♣Q ♥Q ♦K ♦A ♦2 ♠2 LKing
  18. 玩家2:
  19. ♦3 ♥3 ♠4 ♦5 ♣6 ♦8 ♣9 ♥9 ♥10 ♦J ♣J ♥J ♠Q ♣K ♣A ♥A ♣2
  20. 玩家3:
  21. ♠3 ♣4 ♥4 ♣5 ♥5 ♥6 ♦7 ♥8 ♠8 ♠9 ♦10 ♦Q ♥K ♠K ♠A ♥2 BKing
  22. 底牌:
  23. ♠6 ♣8 ♠10
复制代码

作者: cemabenteng    时间: 2015-9-6 10:33
基础班的内容
作者: 月夜听雨    时间: 2015-9-6 10:54
刚开始学  来看看
作者: ln0491    时间: 2015-9-6 10:59
学习了。。。。。。
作者: fmi110    时间: 2015-9-6 11:12
cemabenteng 发表于 2015-9-6 10:33
基础班的内容

对头
作者: 枕草虫    时间: 2015-9-6 12:12
学习了      
作者: AAAFFF    时间: 2015-9-6 12:29
               好吧还没学到     
作者: mah707    时间: 2015-9-6 13:05
一看,你就是看的是刘意老师的基础课程喽
作者: thriver2010    时间: 2015-9-6 13:08
全是自己敲的吗?学习了
作者: fmi110    时间: 2015-9-6 14:52
thriver2010 发表于 2015-9-6 13:08
全是自己敲的吗?学习了

看完视频后  自己默写的
作者: Woo    时间: 2015-9-6 15:23
感觉很实用
作者: 枕草虫    时间: 2015-9-6 15:30
本帖最后由 枕草虫 于 2015-9-6 15:32 编辑
  1. package Test;
  2. import java.util.*;
  3. /**
  4. * 思路:
  5. * 1、        建立54张牌,然后存放到List集合当中打乱
  6. * 2、        将54张牌遍历致51号,分别存入3个TreeSet集合当中,将剩下的存入令一个集合当中
  7. * 3、        遍历3个集合,与底牌集
  8. * 然而输出的时候,顺序不对
  9. *
  10. * 那么想到楼主的思路,先建立一个从小到大顺序的集合,然后将打乱的脚标 分给三个玩家
  11. *
  12. *思路:
  13. *1、建立牌堆:建立ArrayList集合,将数字+花色 作为一个元素 按照从3-K-A-2,还有小王,大王的顺序存储到集合当中
  14. *2、发牌:建立一个脚标集合,利用Collections.shuffle(list)方法,然后将打乱的脚标分给三个玩家,然后拿着分好的脚标去牌堆中找元素
  15. *3、因为最后输出还是要排序,所以玩家使用TreeSet集合
  16. * */
  17. public class PockeDemo {

  18.         public static void main(String[] args) {
  19.                 // TODO Auto-generated method stub
  20.                 //建立牌堆
  21.                 List<String> li = creatPoker();
  22.                
  23.                 //建立脚标集合
  24.                 ArrayList<Integer> al = new ArrayList<Integer>();
  25.                 for(int i = 0 ;i < 54; i++)
  26.                         al.add(i);
  27.                 //打乱脚标集合的顺序
  28.                 Collections.shuffle(al);
  29.                
  30.                 //将脚标分给三个玩家
  31.                 TreeSet<Integer> gamer1 = new TreeSet<Integer>();
  32.                 TreeSet<Integer> gamer2 = new TreeSet<Integer>();
  33.                 TreeSet<Integer> gamer3 = new TreeSet<Integer>();
  34.                 TreeSet<Integer> dipai = new TreeSet<Integer>();
  35.                
  36.                 fenPeiIndex(al,gamer1,gamer2,gamer3,dipai);
  37.                
  38.                
  39.                 //遍历每个玩家的脚标,并到洗好的牌中去找
  40.                 System.out.println("玩家1:");
  41.                 zhuaPai(li,gamer1);
  42.                 System.out.println();
  43.                
  44.                 System.out.println("玩家2:");
  45.                 zhuaPai(li,gamer2);
  46.                 System.out.println();
  47.                
  48.                 System.out.println("玩家3:");
  49.                 zhuaPai(li,gamer3);
  50.                 System.out.println();
  51.                
  52.                 System.out.println("底牌:");
  53.                 zhuaPai(li,dipai);
  54.                
  55.         }
  56.        
  57.        
  58.         //建立顺序的牌
  59.         public static List<String> creatPoker(){
  60.                 ArrayList<String> al = new ArrayList<String>();
  61.                
  62.                 String[] color = {"♦","♣","♥","♠"};
  63.                 String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
  64.                
  65.                 for(String s1 : num)
  66.                         for(String s2 : color)
  67.                                 al.add(s1+s2);
  68.                
  69.                 al.add("小王");
  70.                 al.add("大王");
  71.                
  72.                 return al;
  73.         }
  74.         //分配脚标给玩家
  75.         public static void fenPeiIndex(ArrayList<Integer> al,
  76.                                                         TreeSet<Integer> gamer1,
  77.                                                         TreeSet<Integer> gamer2,
  78.                                                         TreeSet<Integer> gamer3,
  79.                                                         TreeSet<Integer> dipai){
  80.                
  81.                 int count = 0;
  82.                 for(int i : al){
  83.                         if(count<51){
  84.                                 if(count%3 == 0)
  85.                                         gamer1.add(i);
  86.                                 else if(count%3 == 1)
  87.                                         gamer2.add(i);
  88.                                 else
  89.                                         gamer3.add(i);
  90.                         }
  91.                         else
  92.                                 dipai.add(i);
  93.                         count++;
  94.                 }
  95.                
  96.         }
  97.         //抓牌
  98.         public static void zhuaPai(List<String> li,TreeSet<Integer> gamer){
  99.                 for(int i : gamer){
  100.                         System.out.print(li.get(i)+"\t");
  101.                 }
  102.         }
  103. }
复制代码

多谢楼主,学习了,来交作业

作者: fmi110    时间: 2015-9-6 18:35
枕草虫 发表于 2015-9-6 15:30
多谢楼主,学习了,来交作业

写的很好  都封装进函数了
作者: Glc90    时间: 2015-9-6 21:08
好吧 还没学到

作者: cemabenteng    时间: 2015-9-7 21:36
fmi110 发表于 2015-9-6 11:12
对头

加油吧!!!

作者: fmi110    时间: 2015-9-7 21:41
cemabenteng 发表于 2015-9-7 21:36
加油吧!!!

你已在就业班??感觉怎么样啊?
作者: cemabenteng    时间: 2015-9-7 21:45
fmi110 发表于 2015-9-7 21:41
你已在就业班??感觉怎么样啊?

进度非常快,特别快,每天敲不完的代码,好好珍惜基础班轻松的时间吧
作者: fmi110    时间: 2015-9-7 21:47
cemabenteng 发表于 2015-9-7 21:45
进度非常快,特别快,每天敲不完的代码,好好珍惜基础班轻松的时间吧

你就业班上到第几天了?是北京校区?
作者: fmi110    时间: 2015-9-7 21:48
cemabenteng 发表于 2015-9-7 21:45
进度非常快,特别快,每天敲不完的代码,好好珍惜基础班轻松的时间吧

话说 你还有时间逛论坛啊
作者: cemabenteng    时间: 2015-9-8 23:31
fmi110 发表于 2015-9-7 21:47
你就业班上到第几天了?是北京校区?

还有两个月,北京
作者: 兴许不接客    时间: 2015-9-9 12:20
学习了········
作者: 李振在黑马    时间: 2015-9-9 17:06
哇哦!看来就业班很充实啊。提前准备把。
作者: zhangcheng0403    时间: 2015-9-9 18:13
不错啊!!
作者: 我来了    时间: 2015-9-9 20:03
还没学到,顿时感觉亚历山大
作者: fmi110    时间: 2015-9-9 20:19
李振在黑马 发表于 2015-9-9 17:06
哇哦!看来就业班很充实啊。提前准备把。

(⊙o⊙)…这是基础班的内容
作者: fmi110    时间: 2015-9-9 20:20
我来了 发表于 2015-9-9 20:03
还没学到,顿时感觉亚历山大

哈 学到了  你就会发现其实没那么难  就是把几部分的内容合一块
作者: fjb0902    时间: 2015-9-9 20:41
好帖好帖好帖,重要的说了三遍
作者: fmi110    时间: 2015-9-9 20:55
fjb0902 发表于 2015-9-9 20:41
好帖好帖好帖,重要的说了三遍

谢谢 谢谢 谢谢
作者: 淡忘、悲年华    时间: 2015-9-9 21:03
♥♣♦♠
作者: 我来了    时间: 2015-9-10 21:41
抓紧努力中




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2