Java模拟保皇游戏开始的发牌过程。

规则4副扑克,5个玩家。

1)有一个大王标记为皇上。每次发牌时,所发牌中有该大王的玩家是皇上。

2)皇帝选择侍卫(也叫保儿、腿子,游戏过程中与皇帝一伙):作为皇上的玩家从自己的牌中选择一张拥有相同三张(点数和花色都相同)的一张牌(不能是23、大小王),其他四个玩家中有这张牌的就是侍卫。例如,皇上有三个红桃5,其他四个玩家中有红桃5的玩家就是侍卫。特殊情况是:1.皇上有一套四张牌相同的点数的牌,皇帝可以自己做侍卫;2.皇帝没有满足要求的牌,无法获得侍卫。3. 如果皇上有多种选择,需要与用户进行交互,即需要皇上输入想要使用的牌来选择侍卫情况。

程序要求:程序启动后生成5个玩家,并自动给他们发牌。然后输出:

1)皇帝和侍卫的名字及其手里的牌(每张牌输出为“花色”+“点数”,如红桃5,牌之间用“,”分割),并按照大王、小王、2AKQJ109876543的顺序排列,相同点数但不同花色的牌要把相同花色的牌放在一起;

2)那张作为侍卫所特有的牌(“花色”+“点数”)。如果无法得到侍卫,则程序输出相应的提示。例如,程序运行后输出如下的结果:

情况1:只有一种选择,直接生成侍卫(是皇帝自身或者另外一个玩家)

皇帝是player3
皇上的牌是:[皇上, ♚, ♣A, ♣A, ♥A, ♥A, ♥A, ♠A, ♦Q, ♠Q, ♠Q, ♦J, ♥J, ♥J, ♠J, ♠J, ♣10, ♥10, ♣9, ♣9, ♠9, ♠9, ♣8, ♥8, ♠8, ♣7, ♥7, ♣6, ♣6, ♥6, ♠6, ♦5, ♦5, ♥5, ♦4, ♣4, ♠4, ♣3, ♣3, ♣3, ♥3, ♠3, ♠3]
侍卫对应的牌是:♥A
侍卫是player2
侍卫的牌是:[🃏, ♚, ♣2, ♥2, ♦A, ♦A, ♦A, ♥A, ♣K, ♥K, ♥K, ♠K, ♦Q, ♦J, ♠J, ♣10, ♥10, ♥10, ♥10, ♠10, ♦9, ♦9, ♣9, ♣9, ♦8, ♥8, ♠8, ♠8, ♦7, ♣7, ♣7, ♣7, ♠7, ♦6, ♣5, ♠5, ♠5, ♦4, ♣4, ♥4, ♠4, ♦3, ♠3]

情况2:有多种选择,需要进行交互,皇上输入想要使用的牌

皇帝是player3
皇上的牌是:[皇上, ♦2, ♣2, ♦A, ♣A, ♣A, ♠A, ♠A, ♦K, ♥K, ♠K, ♠K, ♣Q, ♣Q, ♥Q, ♦J, ♠J, ♣10, ♣10, ♣10, ♥10, ♦9, ♦9, ♥9, ♥9, ♦7, ♣7, ♣7, ♥7, ♠7, ♦6, ♣6, ♦5, ♣5, ♣5, ♣5, ♥5, ♦4, ♦3, ♦3, ♦3, ♣3, ♥3]
拥有3张相同的:♣10,♣5
请选择想要使用的牌:
♣10
侍卫是player4
侍卫的牌是:[♚, ♦2, ♥2, ♦A, ♣A, ♦K, ♦K, ♣K, ♠K, ♦Q, ♥Q, ♥Q, ♠Q, ♠Q, ♣J, ♣J, ♥J, ♥J, ♠J, ♦10, ♣10, ♥10, ♦9, ♣9, ♣9, ♦8, ♦8, ♥8, ♥7, ♥7, ♠7, ♦6, ♣6, ♥6, ♦5, ♣5, ♥5, ♣4, ♥4, ♥4, ♠4, ♦3, ♥3]

代码如下:

import java.util.*;
//定义扑克牌类,提供equals、toString等方法
class Card {
    private String color;
    private String size;//点数中有字符JQK,所以定义成String类型
    private int index;//记录牌的相对大小,方便排序
    @Override
    public String toString(){
        return color+size;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Card card = (Card) o;
        return index == card.index && Objects.equals(color, card.color) && Objects.equals(size, card.size);
    }

    @Override
    public int hashCode() {
        return Objects.hash(color, size, index);
    }

    public Card(String color, String size, int index) {
        this.color = color;
        this.size = size;
        this.index = index;
    }

    public String getColor() {
        return color;
    }
    public String getSize() {
        return size;
    }
    public int getIndex() {
        return index;
    }
}

//比较扑克牌相对大小的方法,用于sort按序输出
class compareIndex implements Comparator<Card>{
    public int compare(Card c1,Card c2){
        return c2.getIndex()-c1.getIndex();
    }

}
//麻烦使用IDEA,谢谢
public class Main {
    //查找在集合中是否有与被比较元素相同的元素;比较方法,花色和点数相同即相同
    public static boolean search(List<Card> cards , Card c){
        for(int i = 0;i<cards.size();i++){
            if(c.getSize().equals(cards.get(i).getSize())&&c.getColor().equals(cards.get(i).getColor())){
                return true;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //定义allCards集合储存四副牌
        List<Card> allCards = new ArrayList<>();

        //初始化四副牌
        String[] sizes = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        String[] colors = {"♠","♥","♣","♦"};//IDEA中输入时字符与名称相互对应
        for(int i = 0;i<4;i++){
            int index = 1;
            for(String size:sizes){
                for(String color:colors){
                    Card c = new Card(color,size,index++);
                    allCards.add(c);
                }
            }
            //添加大小王
            Card smallKing = new Card("","♚",index++);
            Card bigKing = new Card("","🃏",index++);
            Collections.addAll(allCards,smallKing,bigKing);
        }
        //移除一个大王,并且添加“皇上”牌;remove(Object obj):只移除第一个相同的元素,后面的相同不会移除
        allCards.remove(new Card("","🃏",54));
        allCards.add(new Card("","皇上",55));//定义皇上牌的相对大小为55,与当大王牌有区分

        //洗牌!!!
        Collections.shuffle(allCards);//打乱顺序

        //定义五个玩家,并且初始化!!!!!!
        List<Card>[] players = new ArrayList[5];
        for(int i = 0;i<5;i++){
            players[i] = new ArrayList<>();
        }
        //定义一个Map集合给各个玩家赋值编号,方便后面的发牌等遍历
        Map<Integer,List> map = new HashMap<>();
        for(int i =0;i<5;i++){
            map.put(i,players[i]);
        }
        int kingplayerNo = 0;//用来记录皇帝玩家序号
        //给五个玩家发牌并记录皇帝是谁
        for(int i = 0,j = 0;i<allCards.size();i++,j++){
            if(j == 5)
                j = 0;
            if (allCards.get(i).equals(new Card("", "皇上", 55))){
                /*System.out.println("皇帝是player" + (j+1));*/
                kingplayerNo = j;
            }
            map.get(j).add(allCards.get(i));
        }
        //给集合中元素按照指定标准排序,将每个玩家扑克排序。
        for(int i =0;i<5;i++){
            Collections.sort(players[i],new compareIndex());
            //System.out.println("player"+(i+1)+"的牌是:"+players[i]);//查看每个玩家的牌
        }
        //输出皇帝的牌
        System.out.println("皇帝是player" + (kingplayerNo+1));
        System.out.println("皇上的牌是:"+map.get(kingplayerNo));

        //获得皇帝玩家扑克信息,查找相同牌
        List<Card> kingplayer = map.get(kingplayerNo);

        //记录出现三次或者四次相同牌的信息并储存
        int samepokerNumber = 1;
        Card[] samecard3 = new Card[10];
        int count1 = 0;
        Card[] samecard4 = new Card[10];
        int count2 = 0;
        Card cardFlag = kingplayer.get(1);
        for(int i =2;i<kingplayer.size();i++){
            if(cardFlag.equals(kingplayer.get(i))&&(cardFlag.getSize().equals("♚")==false)&&(cardFlag.getSize().equals("🃏")==false)&&(cardFlag.getSize().equals("2")==false)&&(cardFlag.getSize().equals("3")==false)){
                samepokerNumber++;
            }else {
                cardFlag = kingplayer.get(i);
                samepokerNumber = 1;
            }
            if(samepokerNumber == 3){
                samecard3[count1++] = kingplayer.get(i);
            }
            if(samepokerNumber == 4){//如果出现四张相同牌,将三张相同牌的集合元素去掉
                samecard4[count2++] = kingplayer.get(i);
                samecard3[--count1] = null;
            }
        }
        //分析各种侍卫出现的情况
        if((count1+count2)==0){
            System.out.println("本局皇帝没有侍卫");
        }
        if(count1 == 0 && count2 >=1){
            System.out.println("本局侍卫是皇帝自身");
        }
        if(count1 == 1 && count2 == 0){
            Card c = samecard3[0];
            System.out.println("侍卫对应的牌是:"+c);
            int protecterNo = 0;
            for(int i = 0;i<5;i++){
                if(i==kingplayerNo)
                    continue;
                if(search(map.get(i),c)){
                    protecterNo = i;
                    break;
                }
            }
            System.out.println("侍卫是player"+(protecterNo+1));
            System.out.println("侍卫的牌是:"+map.get(protecterNo));
        }
        if(count1>=2||((count1+count2)>=2&&count1>=1)){
            for(int i =0;i<count1;i++){
                if(i==0){
                    System.out.print("拥有3张相同的:"+samecard3[i]);
                }else
                    System.out.print(","+samecard3[i]);
            }
            System.out.println();
            for(int i =0;i<count2;i++){
                if(i==0){
                    System.out.print("拥有4张相同的:"+samecard4[i]);
                }else
                    System.out.print(","+samecard3[i]);
            }
            if(count2>0){
                System.out.println();
            }
            System.out.println("请选择想要使用的牌:");
            String choose = sc.next();
            String firstcolor = "";
            String lastsize = "";
            firstcolor += choose.charAt(0);
            if(choose.length()==2){
                lastsize += choose.charAt(1);
            }
            if(choose.length()==3){
                lastsize += choose.charAt(1);
                lastsize += choose.charAt(2);
            }
            Card chooseCard = new Card(firstcolor,lastsize,10);
            int flag = 0;
            for(int i = 0;i<count2;i++){
                if(chooseCard.getColor().equals(samecard4[i].getColor())&&chooseCard.getSize().equals(samecard4[i].getSize())){
                    System.out.println("本局皇帝选择自己当侍卫");
                    flag = 1;
                    break;
                }
            }
            if(flag == 0){
                int protecterNo = 0;
                for(int i = 0;i<5;i++){
                    if(i==kingplayerNo)
                        continue;
                    if(search(map.get(i),chooseCard)){
                        protecterNo = i;
                        break;
                    }
                }
                System.out.println("侍卫是player"+(protecterNo+1));
                System.out.println("侍卫的牌是:"+map.get(protecterNo));
            }
        }
    }
}

个人作业,如有不足,请多指教。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值