斗地主之顺子java
时间: 2023-08-10 14:01:25 浏览: 262
斗地主是一款非常经典的扑克牌游戏,顺子是其中一种牌型。在Java编程中,我们可以通过一定的算法和逻辑来判断和验证玩家出牌是否为顺子。
首先,我们需要将扑克牌进行排序。假设扑克牌的点数对应的是数字1-13,花色有四种(方块、梅花、红桃和黑桃)。我们可以使用一个大小为54的数组来表示一副扑克牌,其中前52个元素表示点数,后两个元素表示两张大小王。
接下来,我们需要编写一个函数来判断玩家出牌是否为顺子。首先,我们需要判断玩家出牌的数量是否符合要求,如果出牌数量小于5或大于12,则直接返回false。然后,我们需要将玩家出的牌按照点数排序。如果在排序过程中发现大小王,则直接将其放到数组末尾,因为大小王可以替代任意牌。然后,我们通过遍历数组,判断相邻两个点数是否连续,如果不连续则返回false。最后,当整个数组中的点数都连续时,我们可以判断这组牌是一副顺子。
除了判断顺子之外,我们还可以编写其他的扑克牌游戏逻辑和算法,例如判断是否为对子、三张、炸弹等。通过编写这些逻辑和算法,我们可以实现一个完整的斗地主游戏。
总的来说,斗地主之顺子的Java实现需要借助算法和逻辑来判断玩家所出的牌是否符合顺子的规则。
相关问题
斗地主之顺子 java
### Java 实现斗地主顺子算法
为了实现斗地主游戏中的顺子逻辑,在Java中可以通过以下方式来处理:
#### 定义扑克牌映射关系
首先定义一张表用于表示不同字符代表的数值,这有助于后续比较操作。
```java
Map<Character, Integer> cardValueMapping = new HashMap<>();
cardValueMapping.put('3', 1);
cardValueMapping.put('4', 2);
cardValueMapping.put('5', 3);
cardValueMapping.put('6', 4);
cardValueMapping.put('7', 5);
cardValueMapping.put('8', 6);
cardValueMapping.put('9', 7);
cardValueMapping.put('T', 8); // 'T' 表示 10
cardValueMapping.put('J', 9);
cardValueMapping.put('Q', 10);
cardValueMapping.put('K', 11);
cardValueMapping.put('A', 12);
// 特别注意:不把 '2' 加入此列表,因为顺子里不允许含有 '2'
```
#### 处理输入数据并查找所有可能的顺子组合
接下来编写函数`findStraights`接收字符串形式的一手牌作为参数,并返回符合条件的所有顺子序列。这里假设传入的手牌已经按照一定规则进行了预处理(去除了花色信息),只保留了面值部分[^2]。
```java
public static List<String[]> findStraights(String handCards) {
char[] cardsArray = handCards.toCharArray();
Arrays.sort(cardsArray);
StringBuilder sb = new StringBuilder(new String(cardsArray));
String sortedHandCards = sb.toString();
Set<Integer> uniqueCardValues = new HashSet<>();
for (char c : sortedHandCards.toCharArray()) {
if (!uniqueCardValues.contains(cardValueMapping.get(c))) {
uniqueCardValues.add(cardValueMapping.get(c));
}
}
int minPossibleStraightLength = 5;
List<String[]> result = new ArrayList<>();
for (int startIdx = 0; startIdx <= uniqueCardValues.size() - minPossibleStraightLength; ++startIdx) {
boolean isValidStraight = true;
for (int i = 1; i < minPossibleStraightLength && isValidStraight; ++i) {
Character currentChar = getCharacterFromIndex(startIdx + i - 1, sortedHandCards);
Character nextChar = getCharacterFromIndex(startIdx + i, sortedHandCards);
if ((nextChar != null && !isConsecutive(currentChar, nextChar)) || "2".equals(nextChar + "")) {
isValidStraight = false;
}
}
if (isValidStraight) {
String straightSequence = sortedHandCards.substring(
Math.max(0, startIdx),
Math.min(sortedHandCards.length(), startIdx + minPossibleStraightLength));
result.add(straightSequence.split(""));
}
}
return result.isEmpty() ? Collections.singletonList(new String[]{"No"}) : result;
}
private static Character getCharacterFromIndex(int index, String str){
try{
return str.charAt(index);
} catch(IndexOutOfBoundsException e){
return null;
}
}
private static boolean isConsecutive(char prev, char curr){
return cardValueMapping.get(curr)-cardValueMapping.get(prev)==1;
}
```
上述代码片段实现了对给定一手牌进行排序、去除重复项以及检测是否存在合法顺子的功能。对于每一个潜在起始位置,尝试构建长度至少为五张卡牌的连续序列,并验证其合法性。如果找到有效顺子,则将其加入最终的结果集中;如果没有发现任何顺子,则输出"No"。
java斗地主之顺子
### Java 实现斗地主游戏顺子算法
为了实现斗地主游戏中判断是否存在有效顺子的功能,程序需要完成以下几个方面的工作:
- 对这些整数值进行排序并去除重复项。
- 验证是否有长度至少为五张牌的有效顺子序列。
下面是一个完整的解决方案,在此过程中会遵循上述提到的要求来构建代码逻辑[^3]。
#### 完整代码示例
```java
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String input = scanner.nextLine();
List<Integer> cards = parseCards(input.split(" "));
Collections.sort(cards); // 排序
boolean hasStraight = false;
StringBuilder resultBuilder = new StringBuilder();
int startIdx = 0;
while (startIdx < cards.size()) {
if (!isValidStartCard(cards.get(startIdx))) {
++startIdx;
continue;
}
for (int length = 5; length <= Math.min(13 - startIdx, 12); ++length) {
if (isContinuousSequence(cards.subList(startIdx, startIdx + length))) {
hasStraight = true;
appendResult(resultBuilder, cards.subList(startIdx, startIdx + length));
}
}
++startIdx;
}
if (!hasStraight) {
System.out.println("No");
} else {
System.out.print(resultBuilder.toString().trim());
}
}
private static List<Integer> parseCards(String[] cardStrings) {
Map<Character, Integer> map = createValueMap();
Set<Integer> uniqueValues = new TreeSet<>();
for (String str : cardStrings) {
char c = str.charAt(str.length() - 1);
if ('2' >= c && '3' <= c || Character.isDigit(c)) {
uniqueValues.add(Integer.parseInt(str));
} else {
uniqueValues.add(map.get(c));
}
}
return new ArrayList<>(uniqueValues);
}
private static Map<Character, Integer> createValueMap() {
Map<Character, Integer> valueMap = new HashMap<>();
valueMap.put('A', 14);
valueMap.put('K', 13);
valueMap.put('Q', 12);
valueMap.put('J', 11);
return valueMap;
}
private static boolean isValidStartCard(int card) {
return card != 2 && card <= 10;
}
private static boolean isContinuousSequence(List<Integer> subList) {
for (int i = 1; i < subList.size(); ++i) {
if (subList.get(i) - subList.get(i - 1) != 1) {
return false;
}
}
return true;
}
private static void appendResult(StringBuilder sb, List<Integer> sequence) {
for (Integer num : sequence) {
sb.append(convertToOriginalFormat(num)).append(" ");
}
sb.append("\n");
}
private static String convertToOriginalFormat(int number) {
switch (number) {
case 11:
return "J";
case 12:
return "Q";
case 13:
return "K";
case 14:
return "A";
default:
return String.valueOf(number);
}
}
}
```
这段代码实现了从读取用户输入到解析、验证以及最终打印结果的过程。通过`parseCards()`函数将输入转化为有序且无重复元素的整数列表;接着遍历这个列表寻找符合条件的顺子组合,并调用辅助方法检查它们是否构成连续序列。最后按照题目要求输出所有找到的结果或者"No"。
阅读全文
相关推荐













