编Java程序: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点计算。 一个参考的设计为:1、设计一个card类,用于保存一张牌;2、设计一个hand类,用于保存一手牌;3、设计一个player类,该类可以基于指定策略完成一次游戏过程。 输入 若干行(至少2行),每行代表一张牌。具体格式见样例。 输出 若干行。 读入前两张牌不输出,从第三张牌开始(如果需要),则每次要牌,要先输出Hit,然后读入下一张牌,并依次输出该牌的花色及点数(A输出1 11,即它有两个点数)。当不再要牌时要先输出Stand,然后在一行内输出这一手牌,牌与牌之间用一个空格分隔。牌输出的顺序为先看牌面,牌面小的在前(牌面由小到大的顺序为A,2,3....J,Q,K),当牌面相同时看花色,输出顺序从前到后为Spade, Heart, Diamond, Club。最后一行输出这一手牌的结果,如果总点数超过21点,则输出Bust,如果是Blackjack(一手牌只有两张牌且点数相加和为21点),则输出Blackjack。其他情况则输出一个整数,代表这手牌的点数(尽量大且不爆)。具体格式见样例。 样例输入 Copy Spade 4 Heart A Heart 3 样例输出 Copy Hit Heart 3 Stand HeartA Heart3 Spade4 18
时间: 2024-02-15 14:01:45 浏览: 21
以下是一个基于指定策略的21点游戏的Java程序实现。请注意,为了简化代码,我将Card类、Hand类和Player类都定义在了同一个文件中,但在实际开发中,最好将它们分别定义在不同的文件中。
```java
import java.util.*;
public class BlackjackGame {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Hand hand = new Hand();
hand.addCard(new Card(input.next(), input.next()));
hand.addCard(new Card(input.next(), input.next()));
int totalPoints = hand.getTotalPoints();
if (totalPoints == 21) {
System.out.println("Blackjack");
return;
}
while (totalPoints < 17) {
System.out.println("Hit");
hand.addCard(new Card(input.next(), input.next()));
totalPoints = hand.getTotalPoints();
if (totalPoints > 21) {
System.out.println("Bust");
return;
}
}
System.out.println("Stand");
Card[] cards = hand.getCards();
Arrays.sort(cards);
for (Card card : cards) {
System.out.print(card + " ");
}
System.out.println(totalPoints);
}
}
class Card implements Comparable<Card> {
private String suit;
private int rank;
public Card(String suit, String rank) {
this.suit = suit;
switch (rank) {
case "A":
this.rank = 1;
break;
case "K":
case "Q":
case "J":
case "10":
this.rank = 10;
break;
default:
this.rank = Integer.parseInt(rank);
break;
}
}
public int getRank() {
return rank;
}
@Override
public String toString() {
return suit + rank;
}
@Override
public int compareTo(Card other) {
if (rank != other.rank) {
return rank - other.rank;
} else {
return suit.compareTo(other.suit);
}
}
}
class Hand {
private List<Card> cards;
public Hand() {
cards = new ArrayList<>();
}
public void addCard(Card card) {
cards.add(card);
}
public int getTotalPoints() {
int totalPoints = 0;
int aces = 0;
for (Card card : cards) {
totalPoints += card.getRank();
if (card.getRank() == 1) {
aces++;
}
}
while (aces > 0 && totalPoints + 10 <= 21) {
totalPoints += 10;
aces--;
}
return totalPoints;
}
public Card[] getCards() {
Card[] result = new Card[cards.size()];
cards.toArray(result);
return result;
}
}
```
你可以将这段代码复制到本地的Java开发环境中进行编译和运行,然后按上述要求输入牌并查看程序输出的结果。