用java程序做一个简单的斗地主游戏,设计思路比较简单,首先要准备一副扑克牌(一个集合,包含54个对象),然后打乱扑克顺序(洗牌),均匀发牌到三个玩家及最后的三张底牌,就实现了发牌的效果。整体代码比较简短,展现方式配合页面效果,更加直观可视化,这边建了一个简单的SpringBoot项目,用thymeleaf模板引擎作为前端页面展示,效果参考以下图示:

斗地主java源代码 用java做斗地主发牌界面_java


文章目录

  • 一、前期准备
  • 二、代码开发


一、前期准备

1. 规则说明:每个对象(名称)的命名方式为【花色-牌面】,其中1234分别代表♠♥♣♦4个花色,A~K代表13个牌面,例如红桃6就是【2-6】。大王表示为【0-L】、小王表示为【0-S】

2. 准备一个Poker对象,包含:名称、排序1、排序2、图片路径,共4个字段。其中排序1为:0-14 分别代表王-3;排序2为:1-4 分别代表♠♥♣♦。排序规则为:先依据【排序1】升序,然后依据【排序2】升序

3. 根据以上规则准备每个图标,放入static->img下

4. 准备Poker集合的json字符串,放在常量中用于基础数据

二、代码开发

1. 新建一个Springboot项目,导入阿里的fastJson、导入thymeleaf的相关配置

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.83</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
server:
  port: 8088
spring:
  thymeleaf:
    cache: false
    encoding: utf-8
    mode: HTML5
    prefix: classpath:/templates/
    suffix: .html

2. 把提前准备好的54个图标放入到项目的static->img目录下

斗地主java源代码 用java做斗地主发牌界面_排序算法_02

3. 新建Poker对象

@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Poker {
    private String name;
    private Integer sort1;
    private Integer sort2;
    private String img;
}

4. 基础数据封装(基础数据已按上述规则2做好),用于Poker集合的解析

public class PokerUtil {

    private static final String POKER_STR = "[" +
            "{'img':'/img/0-L.png','name':'0-L','sort1':1,'sort2':1},{'img':'/img/0-S.png','name':'0-S','sort1':1,'sort2':2}," +
            "{'img':'/img/1-2.png','name':'1-2','sort1':2,'sort2':1},{'img':'/img/2-2.png','name':'2-2','sort1':2,'sort2':2}," +
            "{'img':'/img/3-2.png','name':'3-2','sort1':2,'sort2':3},{'img':'/img/4-2.png','name':'4-2','sort1':2,'sort2':4}," +
            "{'img':'/img/1-A.png','name':'1-A','sort1':3,'sort2':1},{'img':'/img/2-A.png','name':'2-A','sort1':3,'sort2':2}," +
            "{'img':'/img/3-A.png','name':'3-A','sort1':3,'sort2':3},{'img':'/img/4-A.png','name':'4-A','sort1':3,'sort2':4}," +
            "{'img':'/img/1-K.png','name':'1-K','sort1':4,'sort2':1},{'img':'/img/2-K.png','name':'2-K','sort1':4,'sort2':2}," +
            "{'img':'/img/3-K.png','name':'3-K','sort1':4,'sort2':3},{'img':'/img/4-K.png','name':'4-K','sort1':4,'sort2':4}," +
            "{'img':'/img/1-Q.png','name':'1-Q','sort1':5,'sort2':1},{'img':'/img/2-Q.png','name':'2-Q','sort1':5,'sort2':2}," +
            "{'img':'/img/3-Q.png','name':'3-Q','sort1':5,'sort2':3},{'img':'/img/4-Q.png','name':'4-Q','sort1':5,'sort2':4}," +
            "{'img':'/img/1-J.png','name':'1-J','sort1':6,'sort2':1},{'img':'/img/2-J.png','name':'2-J','sort1':6,'sort2':2}," +
            "{'img':'/img/3-J.png','name':'3-J','sort1':6,'sort2':3},{'img':'/img/4-J.png','name':'4-J','sort1':6,'sort2':4}," +
            "{'img':'/img/1-10.png','name':'1-10','sort1':7,'sort2':1},{'img':'/img/2-10.png','name':'2-10','sort1':7,'sort2':2}," +
            "{'img':'/img/3-10.png','name':'3-10','sort1':7,'sort2':3},{'img':'/img/4-10.png','name':'4-10','sort1':7,'sort2':4}," +
            "{'img':'/img/1-9.png','name':'1-9','sort1':8,'sort2':1},{'img':'/img/2-9.png','name':'2-9','sort1':8,'sort2':2}," +
            "{'img':'/img/3-9.png','name':'3-9','sort1':8,'sort2':3},{'img':'/img/4-9.png','name':'4-9','sort1':8,'sort2':4}," +
            "{'img':'/img/1-8.png','name':'1-8','sort1':9,'sort2':1},{'img':'/img/2-8.png','name':'2-8','sort1':9,'sort2':2}," +
            "{'img':'/img/3-8.png','name':'3-8','sort1':9,'sort2':3},{'img':'/img/4-8.png','name':'4-8','sort1':9,'sort2':4}," +
            "{'img':'/img/1-7.png','name':'1-7','sort1':10,'sort2':1},{'img':'/img/2-7.png','name':'2-7','sort1':10,'sort2':2}," +
            "{'img':'/img/3-7.png','name':'3-7','sort1':10,'sort2':3},{'img':'/img/4-7.png','name':'4-7','sort1':10,'sort2':4}," +
            "{'img':'/img/1-6.png','name':'1-6','sort1':11,'sort2':1},{'img':'/img/2-6.png','name':'2-6','sort1':11,'sort2':2}," +
            "{'img':'/img/3-6.png','name':'3-6','sort1':11,'sort2':3},{'img':'/img/4-6.png','name':'4-6','sort1':11,'sort2':4}," +
            "{'img':'/img/1-5.png','name':'1-5','sort1':12,'sort2':1},{'img':'/img/2-5.png','name':'2-5','sort1':12,'sort2':2}," +
            "{'img':'/img/3-5.png','name':'3-5','sort1':12,'sort2':3},{'img':'/img/4-5.png','name':'4-5','sort1':12,'sort2':4}," +
            "{'img':'/img/1-4.png','name':'1-4','sort1':13,'sort2':1},{'img':'/img/2-4.png','name':'2-4','sort1':13,'sort2':2}," +
            "{'img':'/img/3-4.png','name':'3-4','sort1':13,'sort2':3},{'img':'/img/4-4.png','name':'4-4','sort1':13,'sort2':4}," +
            "{'img':'/img/1-3.png','name':'1-3','sort1':14,'sort2':1},{'img':'/img/2-3.png','name':'2-3','sort1':14,'sort2':2}," +
            "{'img':'/img/3-3.png','name':'3-3','sort1':14,'sort2':3},{'img':'/img/4-3.png','name':'4-3','sort1':14,'sort2':4}" +
            "]";

    public static List<Poker> getPokerObjList() {
        return JSON.parseArray(POKER_STR, Poker.class);
    }
}

5. 核心方法(业务实现),代码中的注释写的比较全

@Controller
public class PokerController {

    @GetMapping({"","/index"})
    public String index(ModelMap mmap){
        List<String> list = getPokerList();
        List<String> aList = new ArrayList<>(); //玩家A的牌
        List<String> bList = new ArrayList<>(); //玩家B的牌
        List<String> cList = new ArrayList<>(); //玩家D的牌
        List<String> dList = new ArrayList<>(); //底牌
        for (int i = 0; i < list.size(); i++) {
            String poker = list.get(i);
            if (i >= list.size() - 3) {
                dList.add(poker);
            } else if (i % 3 == 0) {
                aList.add(poker);
            } else if (i % 3 == 1) {
                bList.add(poker);
            } else if (i % 3 == 2) {
                cList.add(poker);
            }
        }
        //调用基础牌数据
        List<Poker> pokerObjList = PokerUtil.getPokerObjList();
        mmap.put("a",getSinglePokerObjList(pokerObjList, aList));
        mmap.put("b",getSinglePokerObjList(pokerObjList, bList));
        mmap.put("c",getSinglePokerObjList(pokerObjList, cList));
        mmap.put("d",getSinglePokerObjList(pokerObjList, dList));
        return "index";
    }

    /**
     * 获取扑克牌信息,每次调用相当于洗牌
     * 说明:1.格式为【花色-牌面】;2.花色【0->王,1->♠,2->♥,3->♣,4->♦】
     * @return
     */
    public List<String> getPokerList() {
        List<String> list = new ArrayList<>();
        String[] colors = {"1", "2", "3", "4"}; //4个花色
        String[] numbers = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}; //13个牌面
        for (String color : colors) {
            for (String number : numbers) {
                list.add(color + "-" + number);
            }
        }
        list.add("0-L"); //大王
        list.add("0-S"); //小王
        //打乱顺序(洗牌)
        Collections.shuffle(list);
        return list;
    }

    /**
     * 牌型处理,排序、整理
     * @param pokers 完整54张基础牌数据集合
     * @param strs 某玩家牌名的集合
     * @return 整理好之后的17张牌集合
     */
    public List<Poker> getSinglePokerObjList(List<Poker> pokers, List<String> strs){
        List<Poker> collect = pokers.stream().filter(i -> strs.contains(i.getName()))
                .sorted(Comparator.comparing(Poker::getSort1)
                .thenComparing(Poker::getSort2)).collect(Collectors.toList());
        return collect;
    }
}

6. 前端页面简单开发

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<div class="over_div">
    <ul>
        <li> 玩家A</li>
    </ul>
    <th:block th:each="item : ${a}">
        <ul><li> <img th:src='${item.img}'></li></ul>
    </th:block>
</div>
<div class="over_div">
    <ul>
        <li> 玩家B</li>
    </ul>
    <th:block th:each="item : ${b}">
        <ul><li> <img th:src='${item.img}'></li></ul>
    </th:block>
</div>
<div class="over_div">
    <ul>
        <li> 玩家C</li>
    </ul>
    <th:block th:each="item : ${c}">
        <ul><li> <img th:src='${item.img}'></li></ul>
    </th:block>
</div>
<div class="over_div">
    <ul>
        <li> 底牌</li>
    </ul>
    <th:block th:each="item : ${d}">
        <ul><li> <img th:src="${item.img}"></li></ul>
    </th:block>
</div>
</body>
</html>
<style>
    img {
        height:80px;
        width:55px;
    }
    .over_div {
        width:1000px;
        height:200px;
        overflow:hidden;
        background-color:#436973;
    }
    .over_div ul {
        list-style:none;
        width:960px;
        height:auto;
    }
    .over_div li {
        float:left;
        width:55px;
        height:80px;
        margin-right:25px;
        margin-bottom:5px;
        background-color:#83B1DF;
        text-align:center;
        line-height:80px;
    }
</style>

7. 项目运行,查看效果

斗地主java源代码 用java做斗地主发牌界面_spring_03