本次面向对象实践课课程作业要求实现一个blackJack–21点扑克游戏。
游戏规则自行了解,还是较有趣味性的。
一、游戏演示
二、设计类图:
三、代码实现
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;
}
}