BlackJack--21点扑克游戏Java实现

本次面向对象实践课课程作业要求实现一个blackJack–21点扑克游戏。

游戏规则自行了解,还是较有趣味性的。

一、游戏演示

image-20201101131015005

image-20201101131031658

image-20201101131046816

二、设计类图:

图示  描述已自动生成

三、代码实现

1、牌与牌堆类

/**
 * 扑克花色
 */
public enum Color {
    
    
    DIAMND, //方块
    HEART,  //红心
    CLUB,   //梅花
    SPADE   //黑桃
}
public class Card {
    
    
    private int point;
    private Color color;


    public int getPoint() {
    
    
        return point;
    }

    public void setPoint(int point) {
    
    
        this.point = point;
    }

    public Color getColor() {
    
    
        return color;
    }

    public void setColor(Color color) {
    
    
        this.color = color;
    }

    @Override
    public String toString() {
    
    
        return "Card{" +
                "point=" + point +
                ", color=" + color +
                '}';
    }

    //将花色英文转成中文
    public String transferColor(){
    
    
        switch (color){
    
    
            case SPADE:
                return "方块";
            case HEART:
                return "红心";
            case CLUB:
                return "梅花";
            case DIAMND:
                return "黑桃";
        }
        return "";
    }

    //将点数1~13转成A~K
    public String transferPoint(){
    
    
        if(point <= 10 && point >1){
    
    
            return Integer.toString(point);
        } else {
    
    
            switch (point){
    
    
                case 1 :
                    return "A";
                case 11 :
                    return "J";
                case 12 :
                    return "Q";
                case 13 :
                    return "K";
            };
        }
        return "";
    }
}

import java.util.Random;

public class Deck {
    
    
    private Card [] cards;
    private Integer index;
    private Random random;
    //初始化牌组
    public Deck() {
    
    
        random = new Random();
        index = 0;
        cards = new Card[52];
        //牌组按方块、红心、梅花、黑桃0~13生成
        for (int i = 0; i < 52; i++) {
    
    
            cards[i] = new Card();
            cards[i].setPoint(i % 13 + 1);
            switch (i / 13){
    
    
                case 0 :
                    cards[i].setColor(Color.SPADE);
                    break;
                case 1 :
                    cards[i].setColor(Color.HEART);
                    break;
                case 2 :
                    cards[i].setColor(Color.CLUB);
                    break;
                case 3 :
                    cards[i].setColor(Color.DIAMND);
            }
        }
    }

    //使用shuffle算法洗牌
    public void shuffle(){
    
    
        for(int i =1;i <= 52;i ++){
    
    
            int randId = random.nextInt(i);
            swap(randId, i - i);
        }
        index = 0;
    }

    //发牌
    public Card getOne(){
    
    
        //牌不够
        if(index == 53){
    
    
            return null;
        }
        return cards[index ++];
    }

    private void swap(int randId, int i) {
    
    
        Card temp = cards[i];
        cards[i] = cards[randId];
        cards[randId] = temp;
    }

    public Card[] getCards() {
    
    
        return cards;
    }
}

2、玩家与庄家类

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

public class Player {
    
    
    //玩家余额
    private Integer money;
    //玩家手牌
    private List<Card> cardsInHand;
    //赌注
    private Integer bat;

    public Player() {
    
    
        money = 1000;
        bat = 0;
        cardsInHand = new ArrayList<>();
    }

    public Integer getMoney() {
    
    
        return money;
    }

    public void setMoney(Integer money) {
    
    
        this.money = money;
    }

    public List<Card> getCardsInHand() {
    
    
        return cardsInHand;
    }

    public void setCardsInHand(List<Card> cardsInHand) {
    
    
        this.cardsInHand = cardsInHand;
    }

    public Integer getBat() {
    
    
        return bat;
    }

    public void setBat(Integer bat) {
    
    
        this.bat = bat;
    }

    //展示手牌
    public void showCards() {
    
    
        System.out.println("您的手牌为:  点数: " + getTotalPoints());
        int i = 1;
        for(Card card : cardsInHand){
    
    
            System.out.println(i++ + "." + card.transferColor() + " " + card.transferPoint());
        }
    }

    //计算庄家的点数和
    public int getTotalPoints() {
    
    
        int sum = 0;
        for(Card card : cardsInHand){
    
    
            sum += card.getPoint() > 10 ? 10 : card.getPoint();
        }
        return sum;
    }
    //收掉玩家持有的牌
    public void clear() {
    
    
        cardsInHand = new ArrayList<>();
    }
}

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

public class Dealer {
    
    
    //庄家手牌
    private List<Card> cardsInHand;

    public Dealer() {
    
    
        cardsInHand = new ArrayList<>();
    }

    public List<Card> getCardsInHand() {
    
    
        return cardsInHand;
    }

    public void setCardsInHand(List<Card> cardsInHand) {
    
    
        this.cardsInHand = cardsInHand;
    }

    //展示手牌,第一张牌不展示
    public void showCardsWithHidden() {
    
    
        System.out.println("庄家的手牌为:");
        int i = 1;
        System.out.println("1." + "未知");
        System.out.println("2." + cardsInHand.get(1).transferColor() + " " + cardsInHand.get(1).transferPoint());
    }

    //展示手牌
    public void showCards() {
    
    
        System.out.println("庄家的手牌为: 点数: " + getTotalPoints());
        int i = 1;
        for(Card card : cardsInHand){
    
    
            System.out.println(i++ + "." + card.transferColor() + " " + card.transferPoint());
        }
    }

    //收掉庄家持有的牌
    public void clear() {
    
    
        cardsInHand = new ArrayList<>();
    }

    //计算庄家的点数和
    public int getTotalPoints() {
    
    
        int sum = 0;
        for(Card card : cardsInHand){
    
    
            sum += card.getPoint() > 10 ? 10 : card.getPoint();
        }
        return sum;
    }
}

3、游戏室类(主方法类)

import java.util.List;
import java.util.Scanner;

public class GamingRoom {
    
    

    private static Player player;
    private static Dealer dealer;
    private static Deck deck;
    private static Scanner scanner;
    private static GamingRoom gamingRoom;

    public GamingRoom(){
    
    
        player = new Player();
        player.setMoney(1000);
        dealer = new Dealer();
        deck = new Deck();
        scanner = new Scanner(System.in);
    }

    public static void main(String[] args) {
    
    
        //初始化游戏室
        GamingRoom gamingRoom = new GamingRoom();
        System.out.println("欢迎您来到BlackJack,您现在有1000元,开始您的一夜暴富之旅吧");
        playerChoose();
    }

    //玩家选择界面
    private static void playerChoose() {
    
    
        System.out.println("-----------------------------");
        System.out.println("-        1.开始游戏         -");
        System.out.println("-        2.查看余额         -");
        System.out.println("-        3.结束游戏         -");
        System.out.println("-----------------------------");
        int choice;
        do {
    
    
            choice = scanner.nextInt();
            switch (choice){
    
    
                case 1 :
                    System.out.println("游戏即将开始");
                    play();
                    break;
                case 2 :
                    System.out.println("您的余额为: " + player.getMoney());
                    playerChoose();
                    break;
                case 3 :
                    System.out.println("感谢您的参与,欢迎下次再来");
                    break;
                default:
                    System.out.println("非法输入,请重新选择");
            }
        }while (choice > 3 || choice < 1);
    }

    //开始一局游戏
    private static void play() {
    
    
        //洗牌
        deck.shuffle();
        //收掉庄家、玩家持有的牌
        player.clear();
        dealer.clear();
        //下注
        chooseBat();
        //给庄家发牌,并展示
        dealer.getCardsInHand().add(deck.getOne());
        dealer.getCardsInHand().add(deck.getOne());
        dealer.showCardsWithHidden();
        //给玩家发牌,并展示
        player.getCardsInHand().add(deck.getOne());
        player.getCardsInHand().add(deck.getOne());
        player.showCards();
        boolean finised = false;
        //玩家操作
        while (true) {
    
    
            if(player.getMoney() < player.getBat() * 2){
    
    
                System.out.println("请选择您的操作");
                System.out.println("1.要牌 2.停牌 ");
                int choice = scanner.nextInt();
                //选择要牌
                if (choice == 1) {
    
    
                    player.getCardsInHand().add(deck.getOne());
                    player.showCards();
                    //若手牌点数溢出
                    if (BlackJackRule.isPlayerOver(player)) {
    
    
                        playerFail();
                        finised = true;
                        break;
                    }
                } else {
    
    
                    break;
                }
            } else {
    
    
                System.out.println("请选择您的操作");
                System.out.println("1.要牌 2.加倍 3.停牌");
                int choice = scanner.nextInt();
                //选择要牌
                if (choice == 1) {
    
    
                    player.getCardsInHand().add(deck.getOne());
                    player.showCards();
                    //若手牌点数溢出
                    if (BlackJackRule.isPlayerOver(player)) {
    
    
                        playerFail();
                        finised = true;
                        break;
                    }
                } else if(choice == 2){
    
    
                    //选择加倍,赌注翻倍,但只能再要一张牌
                    player.setBat(player.getBat() * 2);
                    player.getCardsInHand().add(deck.getOne());
                    player.showCards();
                    if (BlackJackRule.isPlayerOver(player)) {
    
    
                        playerFail();
                        finised = true;
                    }
                    break;
                }else {
    
    
                    break;
                }
            }

        }
        //玩家停牌后,庄家要牌
        if (!finised) {
    
    
            dealer.showCards();
            while (dealer.getTotalPoints() < 17) {
    
    
                dealer.getCardsInHand().add(deck.getOne());
                dealer.showCards();
            }
            //若庄家爆牌,玩家胜利
            if (dealer.getTotalPoints() > 21) {
    
    
                playerWin();
            } else{
    
    
                //庄家没爆牌,比点数判断赢家
                decideWinner(player, dealer);
            }
        }
        playerChoose();
    }

    private static void decideWinner(Player player, Dealer dealer) {
    
    
        //统计player手牌点数,并判断是否为blackJack
        List<Card> playerCards = player.getCardsInHand();
        int playerSum = 0;
        for(Card card : playerCards){
    
    
            if(card.getPoint() == 1){
    
    
                playerSum += 11;
            } else if(card.getPoint() > 10){
    
    
                playerSum += 10;
            } else {
    
    
                playerSum += card.getPoint();
            }
        }
        while(playerSum > 21){
    
    
            playerSum -= 10;
        }
        boolean isPlayerBlackJack = false;
        if(playerSum == 21 && playerCards.size() ==2){
    
    
            isPlayerBlackJack = true;
        }
        //统计dealer手牌点数,并判断是否为blackJack
        List<Card> dealerCards = dealer.getCardsInHand();
        int dealerSum = 0;
        for(Card card : dealerCards){
    
    
            if(card.getPoint() == 1){
    
    
                dealerSum += 11;
            } else if(card.getPoint() > 10){
    
    
                dealerSum += 10;
            } else {
    
    
                dealerSum += card.getPoint();
            }
        }
        while(dealerSum > 21){
    
    
            dealerSum -= 10;
        }
        boolean isDealerBlackJack = false;
        if(dealerCards.size() ==2){
    
    
            isDealerBlackJack = true;
        }
        //比大小,判断输赢
        if(isPlayerBlackJack){
    
    
            if(isDealerBlackJack){
    
    
                noOneWin();
            } else {
    
    
                playerWinMore();
            }
        } else {
    
    
            if(playerSum > dealerSum){
    
    
                playerWin();
            } else if(playerSum == dealerSum){
    
    
                noOneWin();
            } else{
    
    
                playerFail();
            }
        }
    }

    private static void noOneWin() {
    
    
        System.out.println("本局无赢家,您的赌注不变");
        System.out.println("您的余额为" + player.getMoney() + "元");
    }

    private static void playerWin() {
    
    
        System.out.println("您赢得了本局游戏");
        int bat = player.getBat();
        int money = player.getMoney() + bat;
        //增加余额
        player.setMoney(money);
        System.out.println("您赢得了" + bat + "元,剩余" + money + "元");
    }

    private static void playerWinMore() {
    
    
        System.out.println("您以BlackJack赢得了本局游戏");
        int bat = player.getBat();
        int money = player.getMoney() + bat + bat / 2;
        //增加余额
        player.setMoney(money);
        System.out.println("您赢得了" + (bat + bat / 2) + "元,剩余" + money + "元");
    }

    private static void playerFail() {
    
    
        System.out.println("您输掉了本局游戏");
        int bat = player.getBat();
        int money = player.getMoney() - bat;
        //扣除余额
        player.setMoney(money);
        System.out.println("您输掉了" + bat + "元,剩余" + money + "元");
        if(player.getMoney() <= 0){
    
    
            System.out.println("您已倾家荡产,友情馈赠您1000元资本,祝您游戏愉快");
            player.setMoney(1000);
        }
    }


    //玩家选择赌注
    public static void chooseBat() {
    
    
        System.out.println("请选择您的赌注:");
        int makeBat;
        do {
    
    
            makeBat = scanner.nextInt();
            if(makeBat > player.getMoney()){
    
    
                System.out.println("您没有这么多钱,请重新选择");
            }
            player.setBat(makeBat);
        }while (makeBat > player.getMoney());
    }

}

import java.util.List;

public  class BlackJackRule {
    
    

    //检测玩家手牌点数是否溢出
    public static boolean isPlayerOver(Player player){
    
    
        List<Card> cardList = player.getCardsInHand();
        int sum = 0;
        for(Card card : cardList){
    
    
            int point = card.getPoint();
            sum += point >= 10 ? 10 : point;
            if(sum > 21){
    
    
                return true;
            }
        }
        return false;
    }
}


猜你喜欢

转载自blog.csdn.net/weixin_44580146/article/details/109423085