Java输出斗地主顺子,从逻辑到实现java输出斗地主顺子

Java输出斗地主顺子,从逻辑到实现java输出斗地主顺子,

本文目录导读:

  1. 顺子的定义与分类
  2. Java程序设计思路
  3. Java代码实现
  4. 代码解释
  5. 测试与验证

斗地主是中国传统扑克牌游戏之一,是一种深受喜爱的单人或多人扑克牌游戏,在斗地主游戏中,玩家需要根据手中的牌来判断是否符合游戏规则,例如是否是顺子、炸弹、对子等,顺子是斗地主游戏中一个非常重要的概念,也是判断玩家是否可以出牌的重要依据之一。

顺子是指玩家手中的牌按照点数连续排列的情况,A-2-3-4-5就是一个顺子,而2-3-4-5-6也是一个顺子,在斗地主游戏中,顺子可以分为三种类型:带子、连子和单子,带子是指顺子中包含带(即一对牌),而连子是指顺子中没有带,且点数连续,单子则是指顺子中没有带,且点数相同。

在Java编程中,我们可以编写一个程序来判断给定的牌局是否为顺子,本文将详细介绍如何用Java编写一个程序,判断一个牌局是否为顺子,并输出相应的结果。

顺子的定义与分类

在斗地主游戏中,顺子的定义如下:

  1. 带子:顺子中包含带(即一对牌),其余四张牌按照点数连续排列。
  2. 连子:顺子中没有带,且五张牌的点数按照顺序连续排列。
  3. 单子:顺子中没有带,且至少有三张牌的点数相同。

需要注意的是,顺子必须是五张牌,且点数必须按照顺序排列,如果牌局中存在重复的点数或花色不匹配的情况,则不能构成顺子。

Java程序设计思路

为了判断一个牌局是否为顺子,我们可以按照以下步骤进行:

  1. 读取输入的牌局数据。
  2. 将牌局数据进行解析,提取出每张牌的点数和花色。
  3. 统计每张点数出现的次数。
  4. 根据点数的分布情况,判断是否符合顺子的条件。

具体实现步骤如下:

读取输入数据

我们需要读取输入的牌局数据,假设输入数据是一个字符串,其中包含多个玩家的牌,每个玩家的牌由多个字符表示,输入数据可以是:

玩家1:A 2 3 4 5
玩家2:6 7 8 9 10
玩家3:Q J 10 9 8

在Java中,我们可以使用Scanner类来读取输入数据,并将其拆分为各个玩家的牌。

解析牌局数据

解析牌局数据的目的是提取出每张牌的点数和花色,对于一张牌“A”,点数为“A”,花色为“S”(假设输入数据中使用“S”表示黑桃,“H”表示红心,“D”表示方块,“C”表示梅花),对于一张牌“10”,点数为“10”,花色为相应的花色。

在Java中,我们可以使用字符串的分割方法来提取出点数和花色,对于一张牌“QH”,我们可以使用split方法将字符串分割为点数和花色两部分。

统计点数出现的次数

在统计点数出现的次数时,我们需要使用一个哈希表(HashMap)来记录每张点数出现的次数,点数“A”出现一次,点数“2”出现两次,依此类推。

判断顺子条件

根据点数的分布情况,我们可以判断是否符合顺子的条件,顺子的条件包括:

  1. 带子:点数中包含一对,其余四张牌的点数按照顺序排列。
  2. 连子:点数中没有一对,且五张牌的点数按照顺序排列。
  3. 单子:点数中没有一对,且至少有三张牌的点数相同。

需要注意的是,顺子必须是五张牌,且点数必须按照顺序排列,如果牌局中存在重复的点数或花色不匹配的情况,则不能构成顺子。

Java代码实现

以下是用Java编写的一个程序,用于判断一个牌局是否为顺子,并输出相应的结果:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class CheckZhiZi {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入牌局数据(格式:玩家1:牌1 牌2 牌3 牌4 牌5,玩家2:牌1 牌2 牌3 牌4 牌5,...)");
        String[] inputs = new String[3];
        for (int i = 0; i < 3; i++) {
            inputs[i] = scanner.nextLine();
        }
        String[] allCards = new String[15];
        for (int i = 0; i < 3; i++) {
            String[] cards = inputs[i].split(" ");
            for (int j = 0; j < 5; j++) {
                allCards[i * 5 + j] = cards[j];
            }
        }
        Map<String, Integer> pointCount = new HashMap<>();
        for (String card : allCards) {
            String[] pointAndSuit = card.split("!");
            String point = pointAndSuit[0];
            String suit = pointAndSuit[1];
            pointCount.put(point, pointCount.getOrDefault(point, 0) + 1);
        }
        int[] pointValues = new int[13];
        for (Map.Entry<String, Integer> entry : pointCount.entrySet()) {
            String point = entry.getKey();
            int value = 0;
            switch (point) {
                case "A":
                    value = 1;
                    break;
                case "2":
                    value = 2;
                    break;
                case "3":
                    value = 3;
                    break;
                case "4":
                    value = 4;
                    break;
                case "5":
                    value = 5;
                    break;
                case "6":
                    value = 6;
                    break;
                case "7":
                    value = 7;
                    break;
                case "8":
                    value = 8;
                    break;
                case "9":
                    value = 9;
                    break;
                case "10":
                    value = 10;
                    break;
                case "J":
                    value = 11;
                    break;
                case "Q":
                    value = 12;
                    break;
                case "K":
                    value = 13;
                    break;
            }
            pointValues[value] = entry.getValue();
        }
        boolean isZhi = false;
        int pairIndex = -1;
        for (int i = 0; i < 13; i++) {
            if (pointValues[i] >= 2) {
                if (pairIndex == -1) {
                    pairIndex = i;
                } else {
                    isZhi = true;
                    break;
                }
            }
        }
        if (isZhi) {
            System.out.println("牌局为带子顺子!");
        } else {
            int[] sortedPoints = new int[13];
            for (int i = 0; i < 13; i++) {
                if (pointValues[i] > 0) {
                    int index = i;
                    while (index > 0 && sortedPoints[index - 1] >= sortedPoints[index]) {
                        int temp = sortedPoints[index - 1];
                        sortedPoints[index - 1] = sortedPoints[index];
                        sortedPoints[index] = temp;
                        index--;
                    }
                    sortedPoints[index] += 1;
                }
            }
            boolean isLian = true;
            for (int i = 0; i < 5; i++) {
                if (sortedPoints[i] != 1) {
                    isLian = false;
                    break;
                }
            }
            if (isLian) {
                System.out.println("牌局为连子顺子!");
            } else {
                boolean isShunzi = true;
                for (int i = 0; i < 13; i++) {
                    if (pointValues[i] == 0) {
                        continue;
                    }
                    if (i + 4 < 13 && pointValues[i + 4] == 0) {
                        isShunzi = false;
                        break;
                    }
                }
                if (isShunzi) {
                    System.out.println("牌局为单子顺子!");
                } else {
                    System.out.println("牌局不是顺子!");
                }
            }
        }
    }
}

代码解释

读取输入数据

在代码中,我们使用Scanner类来读取输入数据,输入数据包括三个玩家的牌局,每个玩家的牌由五个字符表示,输入数据可以是:

玩家1:A 2 3 4 5
玩家2:6 7 8 9 10
玩家3:Q J 10 9 8

代码将输入数据拆分为每个玩家的五张牌,并存储在allCards数组中。

解析牌局数据

对于每张牌,我们使用split方法将其拆分为点数和花色两部分,对于一张牌“QH”,点数为“Q”,花色为“H”。

统计点数出现的次数

我们使用HashMap来统计每张点数出现的次数,点数“A”出现一次,点数“2”出现两次,依此类推。

判断顺子条件

根据点数的分布情况,我们判断是否符合顺子的条件:

  1. 带子:点数中包含一对,其余四张牌的点数按照顺序排列。
  2. 连子:点数中没有一对,且五张牌的点数按照顺序排列。
  3. 单子:点数中没有一对,且至少有三张牌的点数相同。

代码中首先检查是否存在一对,如果存在,则判断是否为带子,如果不存在一对,则检查是否为连子或单子。

输出结果

根据判断结果,输出相应的信息,牌局为带子顺子”、“牌局为连子顺子”等。

测试与验证

为了验证代码的正确性,我们可以编写一些测试用例。

  1. 测试用例1: 输入数据:

    玩家1:A 2 3 4 5
    玩家2:6 7 8 9 10
    玩家3:Q J 10 9 8

    输出结果:

    牌局为连子顺子!
  2. 测试用例2: 输入数据:

    玩家1:A A 2 3 4
    玩家2:5 6 7 8 9
    玩家3:Q J 10 9 8

    输出结果:

    牌局为带子顺子!
  3. 测试用例3: 输入数据:

    玩家1:A 2 3 4 5
    玩家2:6 7 8 9 10
    玩家3:Q J 9 8 7

    输出结果:

    牌局不是顺子!

通过这些测试用例,我们可以验证代码的正确性。

通过以上分析,我们可以用Java编写一个程序来判断一个牌局是否为顺子,并输出相应的结果,该程序通过读取输入数据、解析牌局数据、统计点数出现的次数,以及判断顺子条件,最终输出结果。

Java输出斗地主顺子,从逻辑到实现java输出斗地主顺子,

发表评论