第四次作业 扑克牌的面向对象建模

作业要求

1.创建两个枚举类型:Suit(花色),Rank(等级)
2.创建两个类:Card(牌),CardsSet(5张牌的集合)
3.要求CardsSet实现Comparable接口,按照德州扑克规则比较不同牌型的大小
4.将设计思路和主要代码写成博客

一.创建Card类,定义单张扑克的属性(点数,花色),行为(比较大小),以及比较大小的规则

package work4;
import java.util.Comparator;

public class Card {
    public String Suit;// 花色
    public  String Rank;// 点数

    public Card(String Suit,String Rank){
        super();
        this.Suit = Suit;
        this.Rank = Rank;
    }
    @Override
    public String toString() {
        return Suit+Rank;
    }

    public static Comparator<Card> comparator = new Comparator<Card>() {
        @Override
        public int compare(Card o1, Card o2) {
            Poker comparePokerTemp = new Poker();
            if(o1==null&&o2==null)
                return 0;
            int bigger = comparePokerTemp.Rank.indexOf(o1.Rank) - comparePokerTemp.Suit.indexOf(o2.Suit);
            if(bigger==0){
                bigger = comparePokerTemp.Rank.indexOf(o1.Rank) - comparePokerTemp.Suit.indexOf(o2.Suit);
            }
            return bigger;
        }
    };
}

二.创建Poker类,定义一副扑克牌.

package work4;

import java.util.ArrayList;
import java.util.List;

public class Poker {
    public List<String> Suit = new ArrayList<>(); //花色共4种
    public List<String> Rank = new ArrayList<>(); //点数3.4.5····2共13种
    public List<Card> pokerList = new ArrayList<>(); //扑克中的扑克牌共52张,没有王牌

    public Poker() {
        Suit.add("HEART");
        Suit.add("SPADE");
        Suit.add("DIAMOND");
        Suit.add("CLUB");
        Rank .add("3");
        Rank .add("4");
        Rank .add("5");
        Rank .add("6");
        Rank .add("7");
        Rank .add("8");
        Rank .add("9");
        Rank .add("10");
        Rank .add("J");
        Rank .add("Q");
        Rank .add("K");
        Rank .add("A");
        Rank .add("2");

        for (int Suit = 0; Suit < 4; Suit++) {
            for (int Rank = 0; Rank < 13; Rank++) {
                Card mCard = new Card(this.Suit.get(Suit),this.Rank.get(Rank));
                pokerList.add(mCard);
            }
        }
    }

    //打印扑克牌
    public void printPokerCard(){
        for (int i = 0; i < this.pokerList.size(); i++) {
            System.out.print(this.pokerList.get(i).toString()+" ");
        }
        System.out.println("");
    }
}

三.创建Player类,定义玩家属性(id,名字,手牌)

package work4;

import java.util.ArrayList;
import java.util.List;

public class Player {
    public int id;
    public String name;
    public List<Card> playerCard; //玩家手牌

    public Player(int id,String name) {
        this.id = id;
        this.name = name;
        this.playerCard = new ArrayList<>();
    }

    @Override
    public String toString() {
        return this.name;
    }
}

四.创建Game类,对玩家抽取扑克牌并比较大小

package work4;

import java.util.*;

public class Game {
    Poker mPoker = new Poker();
    Poker dealedPoker = new Poker();
    Scanner scanner = new Scanner(System.in);
    int surplusCards = 51;  //剩余牌数
    int dealCardCount; //将要抽取的手牌数量
    Player player1, player2;

    // 创建玩家
    public void creatPlayer() {
        System.out.print("请输入第一名玩家ID: ");
        int inputId = scanner.nextInt();
        System.out.print("请输入第一名玩家昵称: ");
        String inputName = scanner.next();
        player1 = new Player(inputId, inputName);
        System.out.print("请输入第二名玩家ID: ");
        inputId = scanner.nextInt();
        System.out.print("请输入第二名玩家昵称: ");
        inputName = scanner.next();
        player2 = new Player(inputId, inputName);
    }


    // 抽取手牌和洗牌,采用comparator规则排序
    public void pullAndShuffleCard() {
        player1.playerCard.addAll(dealCard(dealCardCount));
        System.out.println("玩家一抽取手牌是:");
        for (Card c : player1.playerCard) {
            System.out.print(c.toString() + " ");
        }

        player2.playerCard.addAll(dealCard(dealCardCount));
        System.out.println("\n玩家二抽取的手牌是:");
        for (Card c : player2.playerCard) {
            System.out.print(c.toString() + " ");
        }

    }

    // 玩家连续抽取dealCoun张牌,返回多张卡牌(用List盛装)
    //@param dealCount
    //@return

    public List<Card> dealCard(int dealCount) {
        Random random = new Random();
        List<Card> playCard = new ArrayList<>();
        do {
            Card card = dealedPoker.pokerList.get(random.nextInt(surplusCards--));
            playCard.add(card);
            dealCount--;
            dealedPoker.pokerList.remove(card);
        } while (dealCount > 0);
        return playCard;
    }

    //两玩家的最大牌做比较,决出胜负,采用comparator规则排序
    public void compareMaxCard(){
        List<Card> biggerPlayerCard = new ArrayList<>(2);
        biggerPlayerCard.add(player1.playerCard.get(player1.playerCard.size()-1));
        biggerPlayerCard.add(player2.playerCard.get(player2.playerCard.size()-1));
        Collections.sort(biggerPlayerCard,Card.comparator);
        if(player1.playerCard.contains(biggerPlayerCard.get(1))){
            System.out.println("\n  所以"+player1.toString()+" 获胜。");
        }else{
            System.out.println("\n  所以"+player2.toString()+" 获胜。");
        }
    }
}

(由于能力有限,写不出MAIN函数,因而没有运行结果_)

参考文档:https://blog.csdn.net/Routine122/article/details/84349731

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值