模拟斗地主真人在线发牌

模拟斗地主真人在线发牌

前言

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

我们现在用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( );
    }
}

原文地址:https://www.cnblogs.com/tfper/p/9902548.html

时间: 2024-10-10 12:44:22

模拟斗地主真人在线发牌的相关文章

模拟斗地主洗牌发牌

(一)案例介绍: 按照斗地主的规则,完成洗牌发牌的动作. 具体规则: 1.组装54张扑克牌 2.将54张扑克牌的顺序打乱 3.三个玩家参与游戏,三人交替摸牌,没人17张牌,最后三张留作底牌. 4.查看三人各自手中的牌(按照牌的大小排序).底牌 手中扑克牌从大到小的摆放顺序:大王,小王,2,A,K,Q,J,10,9,8,7,6,5,4,3 (二)案例需求分析 1.准备牌 完成数字与牌的映射关系 使用双列Map(HashMap)集合,完成一个数字与字符串字牌的对应关系(相当于一个字典). 2.洗牌

模拟斗地主洗牌、发牌(含有排序和不排序的)

不排序的: package cn.idcast5; import java.util.ArrayList; import java.util.Collections; //模拟斗地主洗牌发牌 //分析 //A 创建一个牌盒 //B 装牌 //C 洗牌 //D 发牌 //E 看牌 public class Shiyue31 { public static void main(String[] args) { // 创建一个牌盒 ArrayList<String> array = new Arra

map接口和模拟斗地主

集合嵌套 先创建集合和存入数字(person是故有自创类) 第一种1.keySet+增强for 第二种//2.keySet+Iterator entry方法1.entry+增强for 第二种4.entry+Iterator Collections集合工具类 模拟斗地主洗牌发牌 思路: 原文地址:https://www.cnblogs.com/www1842564021/p/12123669.html

代码实现:模拟斗地主洗牌和发牌并对牌进行排序的代码实现

package com.loaderman.test; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.TreeSet; public class Test{ /** * * A:案例演示 * 模拟斗地主洗牌和发牌并对牌进行排序的代码实现 * * 分析: * 1,买一副扑克,其实就是自己创建一个集合对象,将扑克牌存储进去 * 2,洗牌 * 3,

代码实现:模拟斗地主洗牌和发牌,牌没有排序

package com.loaderman.test; import java.util.ArrayList; import java.util.Collections; public class Test { /** * * A:案例演示 * 模拟斗地主洗牌和发牌,牌没有排序 * * 分析: * 1,买一副扑克,其实就是自己创建一个集合对象,将扑克牌存储进去 * 2,洗牌 * 3,发牌 * 4,看牌 */ public static void main(String[] args) { //1

java 18 - 12 模拟斗地主洗牌、发牌,并对发的牌进行排序

1 /* 2 模拟斗地主的发牌功能(发牌完毕后发到手上的牌是有顺序的) 3 分析: 4 A:创建一个HashMap集合 5 B:创建一个ArrayList集合 6 C:创建两个字符串,一个是花色,一个是牌的数字 (发牌得有一盒牌) 7 为了方便以后的排序,创建这两个字符串的时候,按照大小顺序排列(斗地主中的大小顺序) 8 大小王除外 9 D:把这两个字符串放进HashMap集合中(拼接一起 花色+牌号) 同时给每个放进去牌进行编码0--52并存储 10 同时也给ArrayList集合中存储编码,

ArrayList模拟斗地主的洗牌,发牌和看牌

/* * ArrayList模拟斗地主的洗牌,发牌和看牌 * * 分析: * 1.创建一个牌盒 * 2.装牌 * 3.洗牌 * 4.发牌 * 5.看牌 */ 代码: import java.util.ArrayList; import java.util.Collections; /** * ArrayList模拟斗地主的洗牌,发牌和看牌 * @author TP * */ public class Doudizhu { /* * ArrayList模拟斗地主的洗牌,发牌和看牌 * * 分析:

Map集合、HashMap集合、LinkedHashMap集合、Hashtable集合、Collections工具类和模拟斗地主洗牌和发牌

1.Map集合概述和特点 * A:Map接口概述  * 查看API可以知道:  * 将键映射到值的对象  * 一个映射不能包含重复的键  * 每个键最多只能映射到一个值 * B:Map接口和Collection接口的不同  * Map是双列的,Collection是单列的  * Map的键唯一,Collection的子体系Set是唯一的  * Map集合的数据结构值针对键有效,跟值无关;Collection集合的数据结构是针对元素有效 2.Map集合的功能概述 * A:Map集合的功能概述  *

54张牌模拟斗地主

54张牌模拟斗地主 package demo; import java.util.Random; /** * 54张牌洗牌和发牌 * */ public class Puker { public static void main(String[] args) { Random random = new Random(); // 初始化数组 String[] puker = { "♠A", "♠2", "♠3", "♠4", &