• 模拟斗地主真人在线发牌


    模拟斗地主真人在线发牌

    前言

    要斗地主先得有牌吧,没牌斗个鸡毛,所以先让厂家生产一副扑克牌。然后呢,哥们三个今天想斗地主了,你得去超市买一副 崭新 的扑克牌吧。这样就可以进入玩耍阶段了,先得洗牌,后摸牌,在把最后三张牌压箱底,好了这样就开始展现技艺了.....

    我们现在用java集合的知识模拟斗地主的发牌,和上述流程是一模一样的。

    设计过程

    • 造一副扑克

      一副扑克有54张牌,有四种花色,从A到K,还有大小王。先定义一个nums集合来装扑克牌的数字,然后定义一个color集合装四种花色,保证它们的添加顺序选择ArrayList集合

      //用num表示扑克牌中的数字
      ArrayList<String> nums = new ArrayList<>();		Collections.addAll(nums,"A","2","3","4","5","6","7","8","9","10","J","Q","K");
      //用color表示扑克牌中的花色
      ArrayList<String> colors = new ArrayList<>();
      Collections.addAll(colors, "红桃","梅花","黑桃","方片");
      

      把花色和数字拼装在一起,需要一个Map来表示一个关系对,同时给每张牌定个序号,后面直接可以用序号操作牌

      //制造一副扑克牌(将数字和花色组合起来)
      Map<Integer,String> cards = new HashMap<>();
      int index = 0; ///给每个扑克牌定个序号index
      for(String number : nums){
          for(String color : colors){
              cards.put(index++, color + number);
          }
      }
      
    • 买一副崭新的扑克牌

      新的扑克牌肯定是按照序号排好的,所以我们把序号装在一个集合中

      //买一副新的扑克牌来玩耍
      ArrayList<Integer> card = new ArrayList<>();
      for(int i = 0; i <= 53; i++){//初始化牌的序号
          card.add(i);
      }
      
    • 洗牌

      洗牌也就是把card集合中的所存储的序号打乱,集合的工具类Collections中有一个方法shuffle可以完成

      Collections.shuffle(card);
      
    • 发牌

      这时候肯定得有三个玩家啊,我们创建是三个玩家,玩家其实也就是扑克牌序号的一个引用,为了简单创建一个Integer类型的,另外,为了把牌到时候可以拍个序,这时候可以用到TreeSet集合存储,它默认自然排序。底牌也可以这样存储。

      TreeSet<Integer> player1 = new TreeSet<>();
      TreeSet<Integer> player2 = new TreeSet<>();
      TreeSet<Integer> player3 = new TreeSet<>();
      //拿出三张牌当做底牌
      TreeSet<Integer> itcards = new TreeSet<>();
      

      发牌算法就是用牌的序号模上3,等于0发给一个人,等于1发给另外一个人,把最后三张当做底牌

      for(int i = 0; i < card.size(); i++){
          if(i >= card.size() - 3){//把后三张牌当做底牌
              itcards.add(card.get(i));
          }else if(i % 3 == 0){
              player1.add(i);
      
          }else if(i % 3 == 1){
              player2.add(card.get(i));
      
          }else{
              player3.add(card.get(i));
          }
      }
      
    • 展示牌

      我们可以看到,其实玩家和底牌也就是打乱的54个序号组成的,并且一个序号对应的是一张扑克牌,所以玩家其实就相当于是扑克牌Map中的key,而value就是扑克牌的名字了。所以遍历玩家这个TreeSet集合,找到Map中的key,根据key很容易找到value。

    源代码

    public class CardsGame {
    	public static void main(String[] args) {
    		//用num表示扑克牌中的数字
    		ArrayList<String> nums = new ArrayList<>();
    		Collections.addAll(nums,"A","2","3","4","5","6","7","8","9","10","J","Q","K");
    		
    		//用color表示扑克牌中的花色
    		ArrayList<String> colors = new ArrayList<>();
    		Collections.addAll(colors, "红桃","梅花","黑桃","方片");
    		
    		//制造一副扑克牌(将数字和花色组合起来)
    		Map<Integer,String> cards = new HashMap<>();
    		int index = 0; ///给每个扑克牌定个序号index
    		for(String number : nums){
    			for(String color : colors){
    				cards.put(index++, color + number);
    			}
    		}
    		//再把大小王加上,一副完整的扑克就ok了
    		cards.put(index++, "大王");
    		cards.put(index++, "小王");
    		
    		//买一副新的扑克牌来玩耍
    		ArrayList<Integer> card = new ArrayList<>();
    		for(int i = 0; i <= 53; i++){//初始化牌的序号
    			card.add(i);
    		}
    		
    		//愉快的玩耍
    		//洗牌
    		Collections.shuffle(card);
    
    		TreeSet<Integer> player1 = new TreeSet<>();
    		TreeSet<Integer> player2 = new TreeSet<>();
    		TreeSet<Integer> player3 = new TreeSet<>();
    		//拿出三张牌当做底牌
    		TreeSet<Integer> itcards = new TreeSet<>();
    		
    		//发牌
    		for(int i = 0; i < card.size(); i++){
    			if(i >= card.size() - 3){//把后三张牌当做底牌
    				itcards.add(card.get(i));
    			}else if(i % 3 == 0){
    				player1.add(i);
    				
    			}else if(i % 3 == 1){
    				player2.add(card.get(i));
    				
    			}else{
    				player3.add(card.get(i));
    			}
    		}
    		
    		//排序并打印每个人得到的牌
    		print("张三",player1,cards);
    		print("李四",player2,cards);
    		print("王五",player3,cards);
    		print("底牌",itcards,cards);
    	}
    
    
    	private static void print(String name, TreeSet<Integer> player, Map<Integer, String> cards) {
    		System.out.print(name + ": ");
    		//得到三个玩家的牌和底牌
    		for(Integer index : player){
    			String result = cards.get(index);
    			System.out.print(result + " ");
    		}
    		System.out.println( );
    	}
    }
    
    
  • 相关阅读:
    python活力练习Day 31
    携程笔试题3--2020-09-08
    双指针应用
    华为笔试题之排序去重
    java架构师学习路线-Mybatis一级缓存源码分析
    java架构师学习之spring boot对比spring mvc有什么区别
    spring Cloud 开发内存占用过高时java架构师该如何解决
    java高级架构师教程-使用Maven配置Spring
    java高级架构师教程-Spring Boot快速入门
    java高级架构师教程-使用Java编程引导JPA
  • 原文地址:https://www.cnblogs.com/tfper/p/9902548.html
Copyright © 2020-2023  润新知