用JAVA设计一个麻将胡牌的算法,其中麻将只有筒条万
时间: 2024-02-05 18:13:33 浏览: 17
麻将胡牌的算法可以分为两步:
1. 构建牌型
2. 判断是否胡牌
下面是JAVA代码实现:
1. 构建牌型
```java
public class Mahjong {
private int[] cards; // 牌数
private boolean isHu; // 是否胡牌
public Mahjong(int[] cards) {
this.cards = cards;
}
// 获取牌数
public int[] getCards() {
return cards;
}
// 设置牌数
public void setCards(int[] cards) {
this.cards = cards;
}
// 是否胡牌
public boolean isHu() {
return isHu;
}
// 设置是否胡牌
public void setHu(boolean hu) {
isHu = hu;
}
}
```
2. 判断是否胡牌
```java
public class MahjongUtil {
private static final int CARD_TYPE_COUNT = 3; // 牌型数量,筒条万
// 判断是否胡牌的方法
public static boolean isHu(Mahjong mahjong) {
int[] cards = mahjong.getCards();
int[] cardTypes = new int[CARD_TYPE_COUNT]; // 牌型数量数组
for (int i = 0; i < cards.length; i++) {
cardTypes[cards[i] / 9]++;
}
int[] huCards = new int[CARD_TYPE_COUNT]; // 胡牌数量数组
for (int i = 0; i < CARD_TYPE_COUNT; i++) {
// 如果牌型数量大于等于3,则可以刻子胡
if (cardTypes[i] >= 3) {
huCards[i] = 3;
cardTypes[i] -= 3;
}
// 判断是否顺子胡
for (int j = 0; j < 7; j++) {
if (cardTypes[i * 9 + j] > 0 && cardTypes[i * 9 + j + 1] > 0 && cardTypes[i * 9 + j + 2] > 0) {
huCards[i * 9 + j] = 1;
huCards[i * 9 + j + 1] = 1;
huCards[i * 9 + j + 2] = 1;
cardTypes[i * 9 + j]--;
cardTypes[i * 9 + j + 1]--;
cardTypes[i * 9 + j + 2]--;
}
}
}
// 判断是否能胡牌
for (int i = 0; i < CARD_TYPE_COUNT * 9; i++) {
if (huCards[i] == 1) {
int[] cardsCopy = Arrays.copyOf(cards, cards.length);
cardsCopy[i]--;
cardsCopy[i + 1]--;
cardsCopy[i + 2]--;
Mahjong mahjongCopy = new Mahjong(cardsCopy);
if (isHu(mahjongCopy)) {
mahjong.setHu(true);
return true;
}
} else if (huCards[i] == 3) {
int[] cardsCopy = Arrays.copyOf(cards, cards.length);
cardsCopy[i]--;
cardsCopy[i + 1]--;
cardsCopy[i + 2]--;
Mahjong mahjongCopy = new Mahjong(cardsCopy);
if (isHu(mahjongCopy)) {
mahjong.setHu(true);
return true;
}
}
}
return false;
}
}
```
以上代码实现了麻将胡牌的算法,可以通过输入的牌数判断是否胡牌。