使用Java炸金花

炸金花步骤:

扑克牌的创建、洗牌、发牌、大小对比,输出赢家牌;

1.先创建扑克牌Card.java,代码如下:
//扑克牌
public class Card {
    private int color;
    private int number;
 
    public Card() {
    }
 
    public Card(int color, int number) {
        this.color = color;
        this.number = number;
    }
 
    public int getColor() {
        return color;
    }
 
    public void setColor(int color) {
        this.color = color;
    }
 
    public int getNumber() {
        return number;
    }
 
    public void setNumber(int number) {
        this.number = number;
    }
 
    @Override
    public String toString() {
        return this.colorToString(this.color) +
                this.numberToString(this.number);
    }
 
//对花色进行字符化,黑桃最大,方块最小,
    private String colorToString(int i){
        String flower = null;
        switch (i){
            case 1:
                flower = "方块";
                break;
            case 2:
                flower = "梅花";
                break;
            case 3:
                flower = "红心";
                break;
            case 4:
                flower = "黑桃";
                break;
        }
        return flower;
    }
//对扑克牌的JQKA进行字符化,A为14,K为13,Q为12,J为11
    private String numberToString(int i){
        String num = null;
        switch (i){
            case 11:
                num = "J";
                break;
            case 12:
                num = "Q";
                break;
            case 13:
                num = "K";
                break;
            case 14:
                num = "A";
                break;
            default:
                if (i >= 2 && i <= 10) {
                    num = new Integer(i).toString();
                }else
                    num = "3";
        }
        return num;
    }
}
2.建扑克牌后,创建Cards.java,我们就要把52张扑克牌初始化出来,然后加入到集合当中,代码如下所示:
import java.util.*;
 
//扑克牌
public class Cards {
    public List<Card> initCards(){                      //将52张牌创建并加入List集合中
        List<Card> list = new ArrayList<>();            //创建List集合
        for (int i = 1; i < 5; i++) {                   //i对应为花色
            for (int j = 2; j < 15; j++) {              //j对应为数字
                Card card = new Card();                 //在循环中创建扑克牌对象,该代码执行4*13=52次
                card.setColor(i);                       //设置扑克牌花色
                card.setNumber(j);                      //设置扑克牌数字
                list.add(card);                         //将扑克牌加入List集合
            }
        }
        return list;
    }
}
3.然后将52张牌进行洗牌(打乱),代码如下:
  //洗牌
    public List<Card> shuffle(List<Card> list){
        List<Card> slist = new ArrayList<>();            //创建List集合,保存洗牌后的扑克
        Random random = new Random();
        while (list.size() > 0){
            int r = random.nextInt(list.size());        //生成正整型的随机数
            Card card = list.remove(r);                 //返回list中,随机数位置的元素并且移除对应位置的元素
            slist.add(card);
        }
        return slist;
    }
4.洗完牌后,对牌进行排序,代码如下:
  //对手牌进行排序
    public List<Card> playListSort(List<Card> playList){
        playList.sort(new Comparator<Card>() {
            @Override
            public int compare(Card c1, Card c2) {
                return c1.getNumber() - c2.getNumber();
            }
        });
        return playList;
    }
5.接下来要对牌型进行判断,判断牌型是否为豹子,代码如下:
//判断牌型是否为豹子(三张牌的数字都是一致的)
    public boolean isTheSameNumber(List<Card> playList){
        if (playList != null && playList.size() == 3){
            if (playList.get(0).getNumber() == playList.get(1).getNumber()
            && playList.get(1).getNumber() == playList.get(2).getNumber()){
                return true;
            }else{
                return false;
            }
        }else {
            System.err.println("手牌不符合规则");
            throw new RuntimeException("手牌不符合规则");
        }
    }
6、判断牌型是否为同花,代码如下:
  //判断牌型是否为同花(三张牌的牌色都是一致的)
    public boolean isFlushColor(List<Card> playList) {
        if (playList != null && playList.size() == 3){
            if (playList.get(0).getColor() == playList.get(1).getColor()
                    && playList.get(1).getColor() == playList.get(2).getColor()){
                return true;
            }else{
                return false;
            }
        }else {
            System.err.println("手牌不符合规则");
            throw new RuntimeException("手牌不符合规则");
        }
    }
7、判断牌型是否为顺子,代码如下:
//判断牌型是否为顺子(三张牌的数字是连续的) (2 3 A)也为顺子
    public boolean isStraight(List<Card> playList) {
        if (playList != null && playList.size() == 3){
            if ((playList.get(0).getNumber() + 1 == playList.get(1).getNumber()
                    && playList.get(1).getNumber() + 1 == playList.get(2).getNumber())
            || (playList.get(2).getNumber() == 14 && playList.get(0).getNumber() == 2 && playList.get(1).getNumber() == 3)){
                return true;
            }else{
                return false;
            }
        }else {
            System.err.println("手牌不符合规则");
            throw new RuntimeException("手牌不符合规则");
        }
    }
8、判断是否为对子,代码如下:
//判断牌型是否为对子(三张牌中有两张牌为相同)
    public boolean isPair(List<Card> playList){
        if (playList != null && playList.size() == 3){
            if (playList.get(0).getNumber() == playList.get(1).getNumber()
                    && playList.get(1).getNumber() == playList.get(2).getNumber()){
                return false;
            }else {
                if (playList.get(0).getNumber() == playList.get(1).getNumber()
                || playList.get(1).getNumber() == playList.get(2).getNumber()){
                    return true;
                }
                return false;
            }
        }
        else {
            System.err.println("手牌不符合规则");
            throw new RuntimeException("手牌不符合规则");
        }
    }
9、紧接着创建玩家类Player.java,代码如下:
import java.util.*;
 
//玩家
public class Player {
    private String name;                    //玩家姓名
    private List<Card> handCards;           //玩家手牌
    private int grade;                      //牌型等级
 
    public Player() {
    }
 
    public Player(String name, List<Card> handCards, int grade) {
        this.name = name;
        this.handCards = handCards;
        this.grade = grade;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public List<Card> getHandCards() {
        return handCards;
    }
 
    public void setHandCards(List<Card> handCards) {
        this.handCards = handCards;
    }
 
    public int getGrade() {
        return grade;
    }
 
    public void setGrade(int grade) {
        this.grade = grade;
    }
 
    @Override
    public String toString() {
        String h = "";
        for (int i = 0; i < this.handCards.size(); i++) {
            h += this.handCards.get(i).toString();
        }
        return this.name + ":" + h;
    }
}
10、编写扑克牌游戏类PokerGame.java,代码如下:
import java.util.*;
 
public class PokerGame {
    private Player p1;                                  //玩家1
    private Player p2;                                  //玩家2
 
    public void startPlayingCards(){                    //开始游戏
 
        p1 = new Player();                              //创建玩家
        p1.setName("Liu");
 
        p2 = new Player();                              //创建玩家
        p2.setName("Li");
 
        Cards cards = new Cards();                      //创建扑克牌
        List<Card> list = cards.initCards();
 
        List<Card> slist = cards.shuffle(list);         //洗牌
 
        List<Card> playlist1 = new ArrayList<>();        //发牌
        for (int i = 0; i < 3; i++) {
            Card card = slist.remove(0);
            playlist1.add(card);
            p1.setHandCards(playlist1);
        }
 
        List<Card> playlist2 = new ArrayList<>();        //发牌
        for (int i = 0; i < 3; i++) {
            Card card = slist.remove(0);
            playlist2.add(card);
            p2.setHandCards(playlist2);
        }
 
        List<Card> card1 = cards.playListSort(p1.getHandCards());       //手牌排序
        p1.setHandCards(card1);
 
        List<Card> card2 = cards.playListSort(p2.getHandCards());       //手牌排序
        p2.setHandCards(card2);
    }
 
    //查看玩家手中的牌
    public void showPlayer(){
        String cardType1 = this.getCardType(p1);
        String cardType2 = this.getCardType(p2);
 
        System.out.println(p1.toString() + " 牌型为:" + cardType1);
        System.out.println(p2.toString() + " 牌型为:" + cardType2);
    }
 
    //判断手中牌型
    private String getCardType(Player p){
        List<Card> cardList = p .getHandCards();
        Cards cards = new Cards();
        String cardType = "单张";
 
        if (cards.isTheSameNumber(cardList)){
            cardType = "豹子";
            p.setGrade(6);
            return cardType;
        }
 
        if (cards.isFlushColor(cardList)){
            if (cards.isStraight(cardList)){
                cardType = "同花顺";
                p.setGrade(5);
                return cardType;
            }else {
                cardType = "同花";
                p.setGrade(4);
                return cardType;
            }
        }else {
            if (cards.isStraight(cardList)){
                cardType = "顺子";
                p.setGrade(3);
                return cardType;
            }
        }
 
        if (cards.isPair(cardList)){
            cardType = "对子";
            p.setGrade(2);
            return cardType;
        }
 
        p.setGrade(1);
        return cardType;
    }
 
    //判断手牌大小
    public Player getWinner(){
        int grade1 = p1.getGrade();
        int grade2 = p2.getGrade();
 
        Player winner = grade1 > grade2 ? p1 : p2;
        if (grade1 != grade2){
            return grade1 > grade2 ? p1 : p2;
        }
        switch (grade1){
            case 6:                     //豹子
                winner =  p1.getHandCards().get(0).getNumber() > p2.getHandCards().get(0).getNumber() ? p1 : p2;
                break;
            case 5:                    //同花顺
            case 3:                    //顺子
                winner =  p1.getHandCards().get(0).getNumber() > p2.getHandCards().get(0).getNumber() ? p1 : p2;
                break;
            case 4:                    //同花
            case 1:                    //单张
             if (p1.getHandCards().get(2).getNumber() > p2.getHandCards().get(2).getNumber()){
                 winner = p1;
             }else if (p1.getHandCards().get(2).getNumber() == p2.getHandCards().get(2).getNumber()){
                 if (p1.getHandCards().get(1).getNumber() > p2.getHandCards().get(1).getNumber()){
                     winner = p1;
                 }else if (p1.getHandCards().get(1).getNumber() == p2.getHandCards().get(1).getNumber()){
                     if (p1.getHandCards().get(0).getNumber() > p2.getHandCards().get(0).getNumber()){
                         winner = p1;
                     }else if (p1.getHandCards().get(0).getNumber() == p2.getHandCards().get(0).getNumber()){
                         winner = p2;
                     }else {winner = p2;}
                 }else {winner = p2;}
             }else {winner = p2;}
             break;
            case 2:                 //对子
                winner =  p1.getHandCards().get(1).getNumber() > p2.getHandCards().get(1).getNumber() ? p1 : p2;
                break;
        }
 
        return winner;
    }
}
11.最后编写Test.java,代码如下:
public class Test {
    public static void main(String[] args) {
      PokerGame pokerGame = new PokerGame();
      pokerGame.startPlayingCards();
      pokerGame.showPlayer();
 
      Player winner = pokerGame.getWinner();
        System.out.println("获胜者为:"+ winner.getName());
    }
}

运行结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值