题目描述
十点半是一种扑克游戏,游戏技巧在于如何收集成“十点半”,但若超过半点,也算失败。
A等于1点、2等于2点,如此累推10就是10点,J、Q、K都是半点。
十点半-顾名思义就是摸的牌不能超出十点半。最后谁的牌之和最接近十点半谁胜。
游戏分为两个玩家,一个电脑(bot)和玩家(你)。
流程:
你先摸牌,如果觉得有胜算,就不必补牌。否则可以继续补牌。 也就是说每次有两个选择:
1. 继续补牌
2. 不补牌
特殊情况:
1.玩家手牌到 5 张时,直接胜利
2.玩家手牌点数超过十点半直接输
接下来由电脑摸牌,电脑有以下规则:
1.十点半就不补牌了
2.当没玩家点数大时,必须补牌
3.当比玩家点数大后不补牌
代码实现
这里需要定义扑克牌的花色和牌值及每个牌的点数
class Card {
private String color;//花色
private String point;//牌值
private Double value;//点数
public Card(String color, String point, Double value) {
this.color = color;
this.point = point;
this.value = value;
}
public Double getValue() {
return value;
}
public String toString() {
return color + point;
}
}
定义一个Poer类
把花色存放在List集合中
List<String> colors = List.of("♠", "♥", "♣", "♦");
把牌的点数存放在List集合中
private List<String> points = List.of("A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K");
定义pokers,负责存放54张扑克牌,这里不用考虑大小王
private List<Card> pokers;
private List<String> colors = List.of("♠", "♥", "♣", "♦");
private List<String> points = List.of("A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K");
private List<Card> pokers;
public Poker() {
pokers = new ArrayList<>();
for (int i = 0; i < colors.size(); i++) { //遍历花色
for (int j = 0; j < points.size(); j++) { //遍历扑克牌值
if (j < 10) {
pokers.add(new Card(colors.get(i), points.get(j), j + 1.0));
} else {
pokers.add(new Card(colors.get(i), points.get(j), 0.5));
}
}
}
}
上面遍历把扑克牌存放在集合中,需要打乱顺序,用Collections.shuffle(pokers);
定义一个遍历i用来遍历扑克牌,同时对玩家和机器人都需要定义一个变量来存已获取扑克牌点数,用以判断当前点数是否超过10.5
对于玩家,每一轮获取一张牌,并放入玩家集合中,同时计算玩家当前点数,如果点数超过10.5,则玩家输,如果玩家现有的扑克牌数量为5,玩家获胜。
对于机器人,同玩家一样,但这里机器人遍历的条件是机器人当前牌的点数小于等于玩家牌的点数。
完整代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
public class TenGame {
private Poker poker;
Scanner in = new Scanner(System.in);
public void start() {
// 获取扑克牌
poker = new Poker();
List<Poker.Card> pokers = poker.getPokers();
// 洗牌
Collections.shuffle(pokers);
Collections.shuffle(pokers);
Collections.shuffle(pokers);
Collections.shuffle(pokers);
int i = 0; // 扑克牌的第几张
// 给玩家发牌
List<Poker.Card> player1 = new ArrayList<>();
// 点数
double value = 0;
int select = 0;
do {
System.out.println("给玩家发第【" + (player1.size() + 1) + "】张手牌");
Poker.Card card = pokers.get(i++);
player1.add(card);
System.out.println(player1);
value += card.getValue();
// 计算点数
if (value > 10.5) {
System.out.println("boom! 您输了");
return;
}
if (player1.size() == 5) {
System.out.println("您获胜!");
return;
} else {
System.out.println("是否继续发牌? 0.停止 1.继续");
select = in.nextInt();
}
} while (select == 1 && player1.size() < 5);
System.out.println("您的点数是:" + value);
System.out.println("机器人开始:");
List<Poker.Card> bot = new ArrayList<>();
double botValue = 0;
do {
if (botValue != 0) {
System.out.println("继续发牌!");
}
System.out.println("机器人派第 " + (bot.size() + 1) + " 张牌");
Poker.Card card = pokers.get(i++);
bot.add(card);
System.out.println(bot);
botValue += card.getValue();
if (botValue > 10.5) {
System.out.println("boom! 您赢了");
return;
}
if (bot.size() == 5) {
System.out.println("您输了");
return;
}
} while (botValue <= value);
System.out.println("您的点数为:" + value);
System.out.println("机器人点数为:" + botValue);
System.out.println("很遗憾,您输了!");
}
public static void main(String[] args) {
new TenGame().start();
}
}
class Poker {
private List<String> colors = List.of("♠", "♥", "♣", "♦");
private List<String> points = List.of("A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K");
private List<Card> pokers;
public Poker() {
pokers = new ArrayList<>();
for (int i = 0; i < colors.size(); i++) {
for (int j = 0; j < points.size(); j++) {
if (j < 10) {
pokers.add(new Card(colors.get(i), points.get(j), j + 1.0));
} else {
pokers.add(new Card(colors.get(i), points.get(j), 0.5));
}
}
}
}
public List<Card> getPokers() {
return pokers;
}
class Card {
private String color;
private String point;
private Double value;
public Card(String color, String point, Double value) {
this.color = color;
this.point = point;
this.value = value;
}
public Double getValue() {
return value;
}
public String toString() {
return color + point;
}
}
}
运行结果