java居然也能实现简单斗地主功能

具体实现的功能效果如图

出于无聊,就想着斗地主能否通过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());
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值