Blackjack
题目描述:
21 点又名黑杰克 (Blackjack), 起源于法国, 已流传到世界各地, 有着悠久的历史. 现在在世界各地的赌场中都可以看到二十一点. 随着互联网的发展, 二十一点开始走向网络时代. 该游戏由 2 到 6 个人玩, 使用除大小王之外的 52 张牌, 游戏者的目标是使手中的牌的点数之和不超过 21 点且尽量大.
大家手中扑克点数的计算规则是: 2 至 9 牌, 按其原点数计算; K
, Q
, J
和 10 牌都算作 10 点; A
牌 (ace) 既可算作 1 点也可算作 11 点, 由玩家自己决定 (当玩家停牌时, 点数一律视为最大而尽量不爆, 如 A + 9
为 20, A + 4+ 8
为 13, A + 3 + A
视为 15) .
你的任务设计基于指定策略的一个 21 点游戏的部分功能.
指定策略为: 如果手中牌的点数之和小于 17 点则继续要下一张牌, 直到大于等于 17 点为止. 如果手里的牌有 A, 且 A 的点数当成 11 点没有超过 21 点, 则此时 A 要按 11 点计算, 如果超过 21 点, 则 A 要按 1 点计算.
一个参考的设计为:
- 设计一个 card 类, 用于保存一张牌;
- 设计一个 hand 类, 用于保存一手牌;
- 设计一个 player 类, 该类可以基于指定策略完成一次游戏过程.
输入:
若干行 (至少 2 行), 每行代表一张牌. 具体格式见样例.
输出:
若干行.
读入前两张牌不输出, 从第三张牌开始 (如果需要), 则每次要牌, 要先输出 Hit
, 然后读入下一张牌, 并依次输出该牌的花色及点数 (A 输出 1 11
, 即它有两个点数). 当不再要牌时要先输出 Stand
, 然后在一行内输出这一手牌, 牌与牌之间用一个空格分隔. 牌输出的顺序为先看牌面, 牌面小的在前 (牌面由小到大的顺序为 A, 2, 3…J, Q, K), 当牌面相同时看花色, 输出顺序从前到后为 Spade
, Heart
, Diamond
, Club
. 最后一行输出这一手牌的结果, 如果总点数超过 21 点,则输出 Bust
, 如果是 Blackjack (一手牌只有两张牌且点数相加和为 21 点) 则输出 Blackjack
. 其他情况则输出一个整数, 代表这手牌的点数 (尽量大且不爆). 具体格式见样例.
输入样例:
输出样例:
1 2 3 4 5
| Hit Heart 3 Stand HeartA Heart3 Spade4 18
|
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124
|
import java.util.Collections; import java.util.Scanner; import java.util.Vector;
public class Main { public static void main(String[] args) { var input = new Scanner(System.in); String color, point; int i = 0; while (input.hasNext()) { color = input.next(); point = input.next(); i++; if (i >= 3) { System.out.print(color + " "); switch (point) { case "A" -> System.out.println("1 11"); case "J", "Q", "K" -> System.out.println("10"); default -> System.out.println(Integer.parseInt(point)); } } Hand.add(color, point); var p = Hand.getPoints(); if (i >= 2) { if (Hand.getPoints() < 17) System.out.println("Hit"); else { System.out.println("Stand"); Hand.cardsPrint(); var points = Hand.getPoints(); if (points > 21) System.out.println("Bust"); else if (points == 21 && Hand.cards.size() == 2) System.out.println("Blackjack"); else System.out.println(points); break; } } }
} }
class Card implements Comparable<Card> { public static final String[] SUITS = {"Spade", "Heart", "Diamond", "Club"}; int suit; int rank;
Card(String suit, String rank) { for (int i = 0; i < SUITS.length; i++) { if (suit.equals(SUITS[i])) { this.suit = i; break; } }
switch (rank) { case "A" -> this.rank = 1; case "J" -> this.rank = 11; case "Q" -> this.rank = 12; case "K" -> this.rank = 13; default -> this.rank = Integer.parseInt(rank); } }
@Override public int compareTo(Card other) { if (this.rank == other.rank) return (this.suit < other.suit) ? -1 : 1; else return (this.rank < other.rank) ? -1 : 1; } }
class Hand { public static final Vector<Card> cards = new Vector<>(); private static int points = 0; private static int aceCount = 0;
public static void add(String suit, String rank) { cards.add(new Card(suit, rank));
switch (rank) { case "A" -> aceCount++; case "J", "Q", "K" -> points += 10; default -> points += Integer.parseInt(rank); } }
public static int getPoints() { int res = -1; if (points + aceCount > 21) return points + aceCount;
for (int i = 0; i <= aceCount; i++) { var tempPoint = points + i * 11 + (aceCount - i); if (tempPoint <= 21 && tempPoint >= res) res = tempPoint; } return res; }
public static void cardsPrint() { Collections.sort(cards); for (Card card : cards) { String rank; switch (card.rank) { case 1 -> rank = "A"; case 11 -> rank = "J"; case 12 -> rank = "Q"; case 13 -> rank = "K"; default -> rank = String.valueOf(card.rank); } System.out.print(Card.SUITS[card.suit] + rank + " "); } System.out.println(); } }
|
2023-05-23
IP属地: 北京