扑克牌的面向对象建模

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

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类,定义一副扑克牌,采用List集合框架

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,名字,手牌)

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类,对玩家抽取扑克牌并比较大小

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()+" 获胜。");
        }
    }
}

运行结果:
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
21点扑克是一款经典的纸牌游戏,在面向对象设计时,我们需要考虑如何将这个游戏分解成不同的对象,并让它们之间能够相互交互。首先,我们可以创建一个扑克牌,表示一副扑克牌,包括花色和点数。然后,我们可以创建一个玩家的,表示游戏中的每个玩家,包括他们的手牌和得分。接下来,我们可以创建一个荷官的,表示游戏中的庄家,负责发牌和计算点数。最后,我们可以创建一个游戏控制器的,用于处理游戏的流程控制,比如开始游戏、投注和结束游戏等。 在这个设计中,每个对象都有自己的属性和方法,比如扑克牌可以有花色和点数,玩家可以有手牌和得分,荷官可以发牌和计算点数,游戏控制器可以处理游戏的流程控制。这样,我们可以通过各个对象之间的交互来实现21点扑克游戏的逻辑。 另外,我们还可以利用继承和多态的特性来优化设计。比如,扑克牌可以作为一个基,然后派生出不同花色和点数的扑克牌;玩家和荷官可以作为不同型的玩家,它们都具有共同的方法,比如抽牌和计算得分,但是具体实现可以有所不同。这样,我们可以更好地组织代码,提高代码的复用性和可维护性。 总的来说,面向对象设计可以帮助我们更好地理解和实现21点扑克游戏,通过分解成不同的对象,并定义它们之间的交互关系,使得代码更加清晰和模块化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值