编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 08:02:39 浏览: 129
好的,根据你提供的要求,我可以为你提供一个基本的Java程序框架,供你参考。
首先是card类的代码:
```java
public class Card {
private String suit; // 花色
private String rank; // 牌面点数
private int value; // 牌面点数对应的值
public Card(String suit, String rank) {
this.suit = suit;
this.rank = rank;
if (rank.equals("A")) {
value = 11;
} else if (rank.equals("K") || rank.equals("Q") || rank.equals("J") || rank.equals("10")) {
value = 10;
} else {
value = Integer.parseInt(rank);
}
}
public int getValue() {
return value;
}
public String getSuit() {
return suit;
}
public String getRank() {
return rank;
}
@Override
public String toString() {
return suit + rank;
}
}
```
接着是hand类的代码:
```java
import java.util.ArrayList;
public class Hand {
private ArrayList<Card> cards; // 手牌
public Hand() {
cards = new ArrayList<Card>();
}
public void addCard(Card card) {
cards.add(card);
}
public int getTotalValue() {
int totalValue = 0;
int aceCount = 0;
for (Card card : cards) {
if (card.getRank().equals("A")) {
aceCount++;
}
totalValue += card.getValue();
}
while (aceCount > 0 && totalValue > 21) {
totalValue -= 10;
aceCount--;
}
return totalValue;
}
public ArrayList<Card> getCards() {
return cards;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
for (Card card : cards) {
sb.append(card).append(" ");
}
return sb.toString().trim();
}
}
```
最后是player类的代码:
```java
import java.util.Scanner;
public class Player {
private Hand hand; // 手牌
public Player() {
hand = new Hand();
}
public void play() {
Scanner sc = new Scanner(System.in);
while (hand.getTotalValue() < 17) {
System.out.println("Hit");
String suit = sc.next();
String rank = sc.next();
Card card = new Card(suit, rank);
hand.addCard(card);
System.out.println(card.getSuit() + " " + card.getRank());
}
System.out.println("Stand " + hand);
int totalValue = hand.getTotalValue();
if (totalValue > 21) {
System.out.println("Bust");
} else if (hand.getCards().size() == 2 && totalValue == 21) {
System.out.println("Blackjack");
} else {
System.out.println(totalValue);
}
}
}
```
你可以根据需要进行修改和完善。需要注意的是,这只是一个基本的程序框架,还需要在主函数中调用player类的play方法来完成整个游戏流程。
阅读全文