java 24点游戏_Java编写的24点纸牌游戏

该文章详细介绍了如何用Java编程实现24点纸牌游戏的算法。通过组合和运算四个1到13之间的数字,寻找加减乘除得到24的解。文章中展示了核心的`Cal24`类,它包含了数字排列、组合及计算逻辑,并使用`Combination`类进行组合生成。整个解决方案利用递归和枚举操作符实现了24点游戏的计算功能。
摘要由CSDN通过智能技术生成

这篇文章主要介绍了Java编写的24点纸牌游戏的相关资料,需要的朋友可以参考下

任意4个1-13数字,加减乘除计算24点。

实现原理:

1)排列组合4个数字

2)计算每次排列组合的可能性

Cal24.java

import java.util.HashSet;

import java.util.Set;

public class Cal24 {

private static final double precision = 0.00001;

private static final int target = 24;

public String[] execute(String[] inputs) {

int[] digits = new int[4];

for (int i = 0; i < inputs.length; i++) {

digits[i] = Integer.valueOf(inputs[i]);

}

return new String[]{calc(digits)};

}

private String calc(final int data[]){

final Set out = new HashSet();

Combination digit = new Combination() {

@Override

protected void handle(int[] result) {

final int[] r = result;

Combination oper = new Combination(){

@Override

protected void handle(int[] c) {

double x = r[0];

for (int i = 0; i < r.length - 1; i++) {

x = doCalculate(x, r[i + 1], c[i]);

}

if(Math.abs(Math.abs(x) - target) < precision || Math.abs(Math.abs(1/x) - target) < precision){

StringBuilder sb = new StringBuilder();

for (int j = 0; j < r.length; j++) {

sb.append(r[j]);

if(j != r.length - 1){

sb.append(getOperation(c[j]));

}

}

out.add(sb.toString());

}

}

};

oper.combine(new int[]{0, 1, 2, 3}, data.length - 1, true);

}

};

digit.combine(data);

StringBuilder sb = new StringBuilder();

for (String string : out) {

sb.append(string);

sb.append("\n");

}

return sb.toString();

}

private double doCalculate(double x, double y, int operation){

switch (operation) {

case 0:

return x + y;

case 1:

return x - y;

case 2:

return x * y;

case 3:

return x / y;

default:

return 0;

}

}

private static String getOperation(int operation){

switch (operation) {

case 0:

return "+";

case 1:

return "-";

case 2:

return "*";

case 3:

return "/";

default:

return "";

}

}

public static void main(String[] args) {

System.out.println(new Cal24().calc(new int[]{1, 5, 5, 5}));

}

}

Combination.java

public abstract class Combination {

private boolean repeat;

private int total = 0;

public void combine(int data[]){

combine(data, data.length, false);

}

public void combine(int data[], int count){

combine(data, count, false);

}

public void combine(int data[], int count, boolean repeat){

this.repeat = repeat;

int times = data.length;

int size = (int)Math.pow(times, count);

for (int i = 0; i < size; i++) {

int[] result = toArray(data, i, count);

if(result != null){

handle(result);

total ++;

}

}

}

private int[] toArray(int data[], int i, int count){

int [] indices = new int[count];

int times = data.length;

for (int j = 0; j < count; j++) {

int temp = 0;

if(i > 0){

temp = i%times;

i = (i - temp)/times;

}

indices[j] = temp;

}

if(!repeat){

//remove repetition

for (int x = 0; x < count; x++) {

for(int y = 0; y < count; y++){

if(x != y){

if(indices[x] == indices[y])

return null;

}

}

}

}

int [] result = new int[count];

for (int x = 0; x < count; x++) {

int selected = data[indices[x]];

result[x] = selected;

}

return result;

}

public int getTotal() {

return total;

}

protected abstract void handle(int[] result);

}

以上所述就是本文的全部内容了,希望大家能够喜欢。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一个简单的纸牌游戏示例程序。这个程序是用Java编写的,可以在控制台中运行。该游戏是一个单人游戏,您需要尽可能快地移除所有的纸牌。 下面是程序的代码: ```java import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class CardGame { private List<Card> deck; private List<Card> discardPile; private List<Card> playerHand; public CardGame() { deck = new ArrayList<>(); discardPile = new ArrayList<>(); playerHand = new ArrayList<>(); // 初始化一副牌 for (Card.Suit suit : Card.Suit.values()) { for (Card.Rank rank : Card.Rank.values()) { deck.add(new Card(rank, suit)); } } // 洗牌 Collections.shuffle(deck); // 初始化玩家手牌 for (int i = 0; i < 7; i++) { playerHand.add(drawCard()); } } public void play() { Scanner scanner = new Scanner(System.in); while (!playerHand.isEmpty()) { System.out.println("你的手牌:"); for (Card card : playerHand) { System.out.println(card); } System.out.println("请出牌(输入牌的下标,从1开始):"); int index = scanner.nextInt() - 1; if (index < 0 || index >= playerHand.size()) { System.out.println("无效的下标,请重新输入。"); continue; } Card card = playerHand.get(index); if (isValidMove(card)) { playerHand.remove(index); discardPile.add(card); System.out.println("出牌成功!"); } else { System.out.println("无效的出牌,请重新选择。"); } } System.out.println("恭喜你,你已经赢得了这个游戏!"); } private Card drawCard() { if (deck.isEmpty()) { deck.addAll(discardPile); Collections.shuffle(deck); discardPile.clear(); } return deck.remove(0); } private boolean isValidMove(Card card) { Card topCard = discardPile.get(discardPile.size() - 1); return card.getSuit() == topCard.getSuit() || card.getRank() == topCard.getRank(); } private static class Card { enum Suit {CLUBS, DIAMONDS, HEARTS, SPADES} enum Rank {ACE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, JACK, QUEEN, KING} private final Suit suit; private final Rank rank; public Card(Rank rank, Suit suit) { this.rank = rank; this.suit = suit; } public Suit getSuit() { return suit; } public Rank getRank() { return rank; } @Override public String toString() { return rank + " of " + suit; } } } ``` 这个程序模拟了一个简单的纸牌游戏,其中包括以下几个类: - `CardGame`: 主类,控制游戏流程。 - `Card`: 表示一张牌的类。 - `Card.Suit`: 牌的花色枚举类。 - `Card.Rank`: 牌的点数枚举类。 在程序运行时,它会自动初始化一副牌,并将其洗牌。然后,它会将前七张牌发给玩家,玩家需要选择出一张合法的牌来出牌。如果出牌成功,该牌将被移动到弃牌堆中,否则玩家需要重新选择一张牌。当玩家的手牌为空时,游戏结束。 您可以通过创建 `CardGame` 实例并调用 `play` 方法来运行这个程序: ```java public static void main(String[] args) { CardGame game = new CardGame(); game.play(); } ``` 希望这个示例程序能够帮助您开始编写自己的纸牌游戏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值