出于无聊,就想着斗地主能否通过java程序来写,后面思考了下确实可以实现,目前只实现了发牌的功能,出牌和智能出牌的代码尚未写,有兴趣的朋友可以和我一起试试看,具体代码还比较简单,具体代码如下
package com.xinwei.oms;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import org.assertj.core.util.Lists;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class CardTest {
/**
* 思路:
* 所有的牌就是一个集合,把所有的牌放入集合,然后打乱顺序
* 实际的值就是棋牌的实际大小值[实际值,显示值] 0-14([0,3][1,4]...[8,J][9,Q][10,K][11,A][12,2][13,小王][14,大王]
* 实际显示的牌 = 显示的颜色 + 显示的值
* 发牌: 所有的牌 % 3 余数就是每个人对应的牌,然后最后三张留作底牌集合
* 叫牌:谁叫的分高,那就是谁是地主,把底牌集合添加到地主手中并且按照地主优先的顺序进行人员分组即可
* 校验出牌是否符合标准:校验牌的有效性(单个牌,顺子、炸弹、三带一,四带二),并且返回牌的类型
* 出牌:按顺序出牌,首先校验出牌的有效性,其次每次另外两个要不起的时候,最新出牌集合即为空
* 接牌:判断是不是串联的顺子,并且判断长度是不是一致,其次判断起始值是不是比之前的要大
* 集合为空为胜利方,并计算积分
*/
@Data
public static class Card{
//实际的数值
private Integer factNum;
//图片
private String image;
//显示的值
private String showValue;
//是否可为顺子
private Boolean straight;
public Card(String color,Integer factNum){
this.factNum = factNum ;
this.straight = true ;
if(factNum < 8){
this.setShowValue(color+(factNum+3));
}else{
CardEnum cardEnum = CardEnum.get(factNum);
this.straight = cardEnum.getStraight();
if(factNum > 12){
this.setShowValue(cardEnum.getValue());
}else{
this.setShowValue(color+cardEnum.getValue());
}
}
}
}
@Data
public static class User{
//用户id
private Integer id;
//头像
private String avatar;
//姓名
private String name;
//分数
private Integer grade;
//是否是地主
private Boolean farmer;
//基数
private Integer base;
//倍数
private Integer multiple;
//手中的牌
private List<Card> cardList;
public User(String name){
this.name = name;
this.grade = 2000;
this.farmer = false ;
this.base = 100;
this.multiple = 2 ;
this.cardList = Lists.newArrayList();
}
}
@Data
public class LastCard{
//用户id
private Integer uid;
//类型 王炸 > 炸弹 > 其他类型牌
private Integer type;
//出的牌
private List<Card> cardList;
}
public static void main(String[] args) {
//获取所有牌
List<Card> allCard = getAllCard();
//打乱牌
Collections.shuffle(allCard);
//获取用户
List<User> userList = getUserList();
List<Card> lastCardList = Lists.newArrayList();
//开始发牌
sendCard(allCard,userList,lastCardList);
//看牌
showCard(userList,lastCardList);
}
@AllArgsConstructor
@Getter
public enum CardEnum{
J(8,"J",true),
Q(9,"Q",true),
K(10,"K",true),
A(11,"A",true),
T(12,"2",false),
S(13,"小王",false),
B(14,"大王",false);
private Integer index;
private String value;
private Boolean straight;
public static CardEnum get(Integer index){
CardEnum[] cardEnums = CardEnum.values();
for (CardEnum cardEnum : cardEnums) {
if(index == cardEnum.getIndex()){
return cardEnum;
}
}
return null;
}
}
/**
* 获取所有的牌
* @return
*/
public static List<Card> getAllCard(){
List<Card> allCardList = new ArrayList<>();
allCardList.add(new Card(null,CardEnum.S.getIndex()));
allCardList.add(new Card(null,CardEnum.B.getIndex()));
String[] colorList = new String[]{"♥","♦","♣","♠"};
for (int i = 0; i < 13; i++) {
for (String color : colorList) {
Card card = new Card(color,i);
allCardList.add(card);
}
}
return allCardList;
}
/**
* 获取牌友
* @return
*/
public static List<User> getUserList(){
return Arrays.asList(new User("周星驰"),new User("刘德华"),new User("周润发"));
}
/**
* 发牌
* @param allCard
* @param userList
* @param lastCardList
*/
public static void sendCard( List<Card> allCard,List<User> userList,List<Card> lastCardList){
for (int i = 0; i < allCard.size(); i++) {
if(i > allCard.size() - 4){
lastCardList.add(allCard.get(i));
}else{
int userIndex = i % userList.size();
User user = userList.get(userIndex);
user.getCardList().add(allCard.get(i));
}
}
}
/**
* 看牌
* @param userList
* @param lastCardList
*/
public static void showCard(List<User> userList,List<Card> lastCardList){
for (User user : userList) {
List<Card> cardList = user.getCardList();
cardList.sort((c1,c2)->{
if(c1.getFactNum() > c2.getFactNum()){
return 0;
}
return -1;
});
List<String> userCardList = cardList.stream().map(Card::getShowValue).collect(Collectors.toList());
System.out.println(user.getName()+"的牌为:"+userCardList.toString());
}
System.out.println("底牌为:"+lastCardList.stream().map(Card::getShowValue).collect(Collectors.toList()).toString());
}
}