JAVA 单张牌出牌逻辑 实现斗地主

JAVA 单张牌出牌逻辑 实现斗地主

  1. Card类
public class Card {
    Integer degree;
    String color;
    public Card(Integer degree, String color) {
        this.degree = degree;
        this.color = color;
    }
    public Card() {
    }
}
  1. Player类
import java.util.ArrayList;
public class Player {
    String name;
    ArrayList<Card> cards;
}
  1. Landlord类 (main)
import java.util.*;

public class Landlord {
    ArrayList<Player> Players = new ArrayList<Player>();
    HashMap<Integer, ArrayList<Card>> cards = new HashMap<Integer, ArrayList<Card>>();
    String[] colors = "♥-♠-♦-♣".split("-");
    String[] nums = "3-4-5-6-7-8-9-10-J-Q-K-A-2".split("-");

    public Landlord() {
        Player player1 = new Player();
        player1.name = "农民1";
        player1.cards = new ArrayList<>();
        Players.add(player1);

        Player player2 = new Player();
        player2.name = "农民2";
        player2.cards = new ArrayList<>();
        Players.add(player2);

        Player player3 = new Player();
        player3.name = "农民3";
        player3.cards = new ArrayList<>();
        Players.add(player3);

        Player surplus = new Player();
        surplus.name = "底牌";
        surplus.cards = new ArrayList<>();
        Players.add(surplus);
    }

    public void setCards() {
        Integer index = 1;
        for (String num : nums) {
            ArrayList<Card> colours = new ArrayList<Card>();
            for (String color : colors) {
                colours.add(new Card(index, num + color));
            }
            cards.put(index++, colours);
        }
        ArrayList<Card> colours = new ArrayList<Card>();
        colours.add(new Card(index, "小王"));
        cards.put(index++, colours);
        colours = new ArrayList<Card>();
        colours.add(new Card(index, "大王"));
        cards.put(index, colours);
        int i = 1;
    }

    //    根据手牌等级插入排序
    public void sortCards() {
        for (int i = 0; i < 4; i++) {
            ArrayList<Card> cards = new ArrayList<>();
            for (Card c : Players.get(i).cards) {
                insertSort(cards, c);
            }
            Players.get(i).cards = cards;
        }
    }

    public void insertSort(ArrayList<Card> cards, Card card) {
        if (cards.isEmpty()) {
            cards.add(card);
            return;
        }
        for (int i = 0; i < cards.size(); i++) {
            if (card.degree < cards.get(i).degree) {  //这张卡的等级比遍历到的卡的等级低,则插入当前位置
                cards.add(i, card);
                return;
            }
        }
        //遍历完都没找到插入位置,就要放到最后
        cards.add(card);
        return;
    }

    //    随机发牌,先随机选择卡牌等级,再选择随机花色
    public void distributeCards() {
        Random random = new Random();
        HashMap<Integer, ArrayList<Card>> cardsClone = (HashMap<Integer, ArrayList<Card>>) cards.clone();
        int p;
        for (p = 0; p < 3; p++) {   // 三个玩家
            for (int i = 1; i <= 17; i++) {
                List<Integer> keysAsArray = new ArrayList<Integer>(cardsClone.keySet());//获取卡组的键的数组
                int i1 = keysAsArray.get(random.nextInt(keysAsArray.size()));  //左闭右开 获取现有卡组中的键
                ArrayList<Card> colorClone = cardsClone.get(i1);  //获取一个数字的所有花色牌
                int i2 = random.nextInt(colorClone.size());  //下标 0~牌数-1
                Players.get(p).cards.add(colorClone.get(i2));  //将此牌加入底牌
                colorClone.remove(i2);  //将此牌移除对应数字的所有花牌
                if (colorClone.isEmpty()) {  //如果此数字的花牌数为0
                    cardsClone.remove(i1); //删除此数字(键值对)
                }
            }
        }
        for (int i = 1; i <= 3; i++) {  //一副底牌
            List<Integer> keysAsArray = new ArrayList<Integer>(cardsClone.keySet());//获取卡组的键的数组
            int i1 = keysAsArray.get(random.nextInt(keysAsArray.size()));  //左闭右开 获取现有卡组中的键
            ArrayList<Card> colorClone = cardsClone.get(i1);  //获取一个数字的所有花色牌
            int i2 = random.nextInt(colorClone.size());  //下标 0~牌数-1
            Players.get(p).cards.add(colorClone.get(i2));  //将此牌加入底牌
            colorClone.remove(i2);  //将此牌移除对应数字的所有花牌
            if (colorClone.isEmpty()) {  //如果此数字的花牌数为0
                cardsClone.remove(i1); //删除此数字(键值对)
            }
        }
        int test = 0;
    }

    public void showCards() {
        System.out.println("\n**********手牌展示**********");
        int i;
        for (i = 0; i < 3; i++) {
            System.out.print("玩家" + (i + 1) + ":");
            for (Card c : Players.get(i).cards) {
                System.out.print(c.color + " ");
            }
            System.out.println();
        }
        System.out.print("底牌" + ":");
        for (Card c : Players.get(i).cards) {
            System.out.print(c.color + " ");
        }
        System.out.println("\n*************************");
    }


    //    地主随机出一张牌,其他玩家跟
    public void dealOneCard() {
        Random random = new Random();
        Player lord = Players.get(0);
        Player player2 = Players.get(1);
        Player player3 = Players.get(2);
        for (int i = 0; i < 3; i++) {
            lord.cards.add(Players.get(3).cards.get(i));   // 玩家1作地主
        }
        Players.get(3).cards.clear(); //地主拿走所有底牌
        showCards();

        int flag = 0;
        Card tempCard = new Card();
        while (true) {
            if (flag == 0) {  //农民没有足够大的牌
                int k = random.nextInt(lord.cards.size());
                tempCard = lord.cards.get(k);
                System.out.println("地主:一个" + tempCard.color);
                lord.cards.remove(k);
            } else {  //地主需要出足够大的牌
                for (int j = 0; j < lord.cards.size(); j++) {
                    if (lord.cards.get(j).degree > tempCard.degree) {
                        System.out.println("地主:看招,一个" + lord.cards.get(j).color);
                        tempCard = lord.cards.get(j);
                        lord.cards.remove(j);
                        flag = 0;
                        break;
                    }
                }
            }
            if (flag != 0) { //地主没有足够大的牌
                System.out.println("地主:要不起");
                switch (flag) {
                    case 2:
                        int t = random.nextInt(player3.cards.size());
                        tempCard = player3.cards.get(t);
                        System.out.println(player3.name + ":一个" + tempCard.color);
                        player3.cards.remove(t);
                        break;
                    case 3:
                        int s = random.nextInt(player2.cards.size());
                        tempCard = player2.cards.get(s);
                        System.out.println(player2.name + ":一个" + tempCard.color);
                        player2.cards.remove(s);
                        break;
                }
            } else {  //农民需要出足够大的牌
                for (int j = 0; j < player2.cards.size(); j++) {
                    if (player2.cards.get(j).degree > tempCard.degree) {
                        System.out.println(player2.name + ":管上! " + player2.cards.get(j).color);
                        tempCard = player2.cards.get(j);
                        player2.cards.remove(j);
                        flag = 2;
                        break;
                    }
                }
                for (int j = 0; j < player3.cards.size() && flag == 0; j++) {
                    if (player3.cards.get(j).degree > tempCard.degree) {
                        System.out.println(player3.name + ":大你! " + player3.cards.get(j).color);
                        tempCard = player3.cards.get(j);
                        player3.cards.remove(j);
                        flag = 3;
                        break;
                    }
                }
            }
            if (flag == 0) {
                System.out.println("农民们:pass...");
            }
            if (lord.cards.isEmpty()) {
                System.out.println("地主获胜!");
                showCards();
                return;
            }
            if (player2.cards.isEmpty() || player3.cards.isEmpty()) {
                System.out.println("农民获胜!");
                showCards();
                return;
            }
        }

    }

    public static void main(String[] args) {
        Landlord landlord = new Landlord();
        landlord.setCards();
        landlord.distributeCards();
        landlord.sortCards();
        landlord.showCards();
        landlord.dealOneCard();
    }
}

应付下作业还是可以的,【狗头】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值