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