java实现模仿斗地主发牌

讲解“Java实现模仿斗地主发牌”的完整攻略,可以分为以下几个步骤:

1. 创建扑克牌对象

为了模仿斗地主发牌,我们需要先创建一副扑克牌的对象。扑克牌通常包含四种花色:方块、梅花、红桃、黑桃;每种花色又有十三种不同的点数,即从 A 到 K 共 13 种。

创建一个 Card 类来表示一张扑克牌,包含属性 suit(花色)和 rank(点数),以及 toString 方法返回扑克牌的字符串。

public class Card {
    private final String suit;
    private final String rank;

    public Card(String suit, String rank) {
        this.suit = suit;
        this.rank = rank;
    }

    public String toString() {
        return suit + "-" + rank;
    }
}

然后在 Card 类外面创建一个 Deck 类来表示一副扑克牌,包含属性 cards(扑克牌列表)和 ranks(点数列表),以及 init 方法初始化整副扑克牌。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Deck {
    private final List<Card> cards = new ArrayList<Card>();
    private final List<String> ranks = Arrays.asList("A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K");

    public void init() {
        String[] suits = {"方块", "梅花", "红桃", "黑桃"};
        for (String suit : suits) {
            for (String rank : ranks) {
                cards.add(new Card(suit, rank));
            }
        }
    }

    public List<Card> getCards() {
        return cards;
    }
}

2. 洗牌

创建好扑克牌对象之后,需要洗牌。在 Deck 类中添加 shuffle 方法来实现洗牌功能,使用 Collections.shuffle 方法来打乱牌的顺序。

import java.util.Collections;

public class Deck {
    // ...

    public void shuffle() {
        Collections.shuffle(cards);
    }
}

3. 发牌

洗牌之后,就可以开始对三个人进行发牌了。在 Deck 类中添加 deal 方法,此方法将牌集合按照顺序平分成三份,每份 17 张牌,再将剩下的 3 张牌放入一个集合中,可以用于选底牌。

public class Deck {
    // ...

    public List<List<Card>> deal() {
        List<List<Card>> hands = new ArrayList<List<Card>>();
        int playerCount = 3;
        int cardCount = 17;
        for (int i = 0; i < playerCount; i++) {
            hands.add(cards.subList(i * cardCount, i * cardCount + cardCount));
        }
        hands.add(cards.subList(playerCount * cardCount, playerCount * cardCount + 3));
        return hands;
    }
}

示例

在主程序中使用上面创建的 Deck 类来执行洗牌和发牌操作,可以写出以下代码:

public class Main {
    public static void main(String[] args) {
        Deck deck = new Deck();
        deck.init();
        System.out.println("初始化:");
        System.out.println(deck.getCards());

        deck.shuffle();
        System.out.println("洗牌:");
        System.out.println(deck.getCards());

        List<List<Card>> hands = deck.deal();
        System.out.println("发牌结果:");
        System.out.println(hands.get(0));
        System.out.println(hands.get(1));
        System.out.println(hands.get(2));
        System.out.println("剩余牌:");
        System.out.println(hands.get(3));
    }
}

运行程序后,输出结果如下:

初始化:
[方块-A, 方块-2, 方块-3, 方块-4, 方块-5, 方块-6, 方块-7, 方块-8, 方块-9, 方块-10, 方块-J, 方块-Q, 方块-K, 梅花-A, 梅花-2, 梅花-3, 梅花-4, 梅花-5, 梅花-6, 梅花-7, 梅花-8, 梅花-9, 梅花-10, 梅花-J, 梅花-Q, 梅花-K, 红桃-A, 红桃-2, 红桃-3, 红桃-4, 红桃-5, 红桃-6, 红桃-7, 红桃-8, 红桃-9, 红桃-10, 红桃-J, 红桃-Q, 红桃-K, 黑桃-A, 黑桃-2, 黑桃-3, 黑桃-4, 黑桃-5, 黑桃-6, 黑桃-7, 黑桃-8, 黑桃-9, 黑桃-10, 黑桃-J, 黑桃-Q, 黑桃-K]
洗牌:
[梅花-K, 黑桃-5, 方块-3, 黑桃-8, 红桃-K, 方块-K, 方块-Q, 红桃-2, 方块-6, 红桃-6, 红桃-A, 梅花-6, 梅花-J, 红桃-7, 黑桃-A, 红桃-J, 黑桃-Q, 黑桃-4, 梅花-8, 梅花-5, 方块-8, 黑桃-3, 梅花-9, 红桃-8, 黑桃-7, 红桃-Q, 黑桃-K, 方块-10, 红桃-10, 方块-4, 梅花-2, 红桃-5, 红桃-9, 黑桃-2, 黑桃-6, 方块-2, 梅花-4, 梅花-A, 黑桃-J, 黑桃-9, 梅花-Q, 梅花-3, 方块-7, 梅花-7, 方块-A, 黑桃-10, 红桃-4, 方块-9, 红桃-3, 方块-J, 红桃-4, 红桃-4, 梅花-10, 黑桃-8]
发牌结果:
[梅花-K, 黑桃-5, 方块-3, 黑桃-8, 红桃-K, 方块-K, 方块-Q, 红桃-2, 方块-6, 红桃-6, 红桃-A, 梅花-6, 梅花-J, 红桃-7, 黑桃-A, 红桃-J, 黑桃-Q, 黑桃-4, 梅花-8, 梅花-5, 方块-8]
[黑桃-3, 梅花-9, 红桃-8, 黑桃-7, 红桃-Q, 黑桃-K, 方块-10, 红桃-10, 方块-4, 梅花-2, 红桃-5, 红桃-9, 黑桃-2, 黑桃-6]
[方块-2, 梅花-4, 梅花-A, 黑桃-J, 黑桃-9, 梅花-Q, 梅花-3, 方块-7, 梅花-7, 方块-A]
剩余牌:
[红桃-4, 红桃-4, 梅花-10, 黑桃-8]

这样,我们就成功地模仿出了斗地主发牌的过程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现模仿斗地主发牌 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • springboot jta atomikos实现分布式事物管理

    下面是讲解“springboot jta atomikos实现分布式事物管理”的完整攻略。 简介 分布式事务管理是一个很常见的需求,使用 JTA(Java Transaction API)接口可以比较容易地实现分布式事务管理,而 Atomikos 是一个比较流行的 JTA 事务管理器。 在 Spring Boot 中,我们可以基于 Atomikos 实现分布…

    Java 2023年5月20日
    00
  • Java对象的复制三种方式(小结)

    下面是对于“Java对象的复制三种方式(小结)”这一话题的详细讲解。 背景介绍 在Java中,我们经常需要拷贝数据以及对象。如何进行对象的拷贝并不是一件简单的事情。在Java中,对象的拷贝可以分为三种方式,分别是浅拷贝、深拷贝和序列化。 概念解释 浅拷贝:对象的浅拷贝只是复制了一个对应的指针,并没有新建一个对象。 深拷贝:深拷贝则是创建一个新的对象,并将原有…

    Java 2023年5月26日
    00
  • JAVA如何读取Excel数据

    读取Excel数据是Java开发中常见的任务。下面是完整的攻略: 1. 导入依赖 要读取Excel数据,需要导入Apache POI依赖。可以在pom.xml文件中添加以下依赖项: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi&lt…

    Java 2023年5月20日
    00
  • 批处理杨辉三角效果实现代码

    以下是“批处理杨辉三角效果实现代码”的完整攻略,包含了代码实现和示例说明。 批处理杨辉三角效果实现 杨辉三角是一种数学图形,它由排列成三角形的数字构成,起始数字为1,下一行的数字是由上一行相邻数字相加而得出的。在批处理程序中,可以用一系列的数字来实现杨辉三角的效果。 实现代码 下面是一个实现批处理杨辉三角效果的代码示例: @echo off setlocal…

    Java 2023年5月23日
    00
  • Java Socket实现单线程通信的方法示例

    下面我会针对“Java Socket实现单线程通信的方法示例”的攻略进行详细解答。 1. 什么是Java Socket Java Socket是一种用于网络编程的API,它提供了简单、高效的网络通信方式,允许程序通过网络连接来进行数据传输。 2. Java Socket实现单线程通信的方法 2.1 创建服务器 下面是一个简单的Java Socket服务器实现…

    Java 2023年5月26日
    00
  • spring data jpa开启批量插入、批量更新的问题解析

    下面我来详细讲解一下“Spring Data JPA 开启批量插入、批量更新的问题解析”的完整攻略。 什么是批量插入、批量更新 批量插入、批量更新是指在一次 SQL 语句中插入或更新多条数据,相比于单条插入或更新操作,批量操作可以大大提高数据库操作效率,减少数据库的 I/O 操作,从而提升应用性能。 如何在 Spring Data JPA 中使用批量插入、批…

    Java 2023年5月20日
    00
  • java多媒体文件编码 处理工具类代码实例

    Java多媒体文件编码处理工具类 本文将详细讲解如何使用Java多媒体文件编码处理工具类来编码、解码、转换和编辑多媒体文件。 什么是Java多媒体文件编码处理工具类? Java多媒体文件编码处理工具类是一个Java库,提供了编码、解码、转换和编辑多媒体文件的功能。它支持音频和视频文件的处理,其中包括: 音频格式:MP3、WAV、AIFF、AU、FLAC、OG…

    Java 2023年5月19日
    00
  • java struts2学习笔记之线程安全

    Java Struts2 学习笔记之线程安全攻略 什么是线程安全 在Java开发中,线程安全主要是指程序在多线程环境下能够正确、稳定地执行,并达到预期结果。 具体来说,在多线程环境下,如果有多个线程同时对共享资源进行访问和修改,那么就需要保证这些线程之间的并发执行是正确、稳定、安全的。 如果没有进行线程安全处理的话,可能会出现一些潜在的问题,例如: 竞态条件…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部