Java输出斗地主顺子,从逻辑到实现java输出斗地主顺子
本文目录导读:
斗地主是中国传统扑克牌游戏之一,是一种深受喜爱的单人或多人扑克牌游戏,在斗地主游戏中,玩家需要根据手中的牌来判断是否符合游戏规则,例如是否是顺子、炸弹、对子等,顺子是斗地主游戏中一个非常重要的概念,也是判断玩家是否可以出牌的重要依据之一。
顺子是指玩家手中的牌按照点数连续排列的情况,A-2-3-4-5就是一个顺子,而2-3-4-5-6也是一个顺子,在斗地主游戏中,顺子可以分为三种类型:带子、连子和单子,带子是指顺子中包含带(即一对牌),而连子是指顺子中没有带,且点数连续,单子则是指顺子中没有带,且点数相同。
在Java编程中,我们可以编写一个程序来判断给定的牌局是否为顺子,本文将详细介绍如何用Java编写一个程序,判断一个牌局是否为顺子,并输出相应的结果。
顺子的定义与分类
在斗地主游戏中,顺子的定义如下:
- 带子:顺子中包含带(即一对牌),其余四张牌按照点数连续排列。
- 连子:顺子中没有带,且五张牌的点数按照顺序连续排列。
- 单子:顺子中没有带,且至少有三张牌的点数相同。
需要注意的是,顺子必须是五张牌,且点数必须按照顺序排列,如果牌局中存在重复的点数或花色不匹配的情况,则不能构成顺子。
Java程序设计思路
为了判断一个牌局是否为顺子,我们可以按照以下步骤进行:
- 读取输入的牌局数据。
- 将牌局数据进行解析,提取出每张牌的点数和花色。
- 统计每张点数出现的次数。
- 根据点数的分布情况,判断是否符合顺子的条件。
具体实现步骤如下:
读取输入数据
我们需要读取输入的牌局数据,假设输入数据是一个字符串,其中包含多个玩家的牌,每个玩家的牌由多个字符表示,输入数据可以是:
玩家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”出现两次,依此类推。
判断顺子条件
根据点数的分布情况,我们可以判断是否符合顺子的条件,顺子的条件包括:
- 带子:点数中包含一对,其余四张牌的点数按照顺序排列。
- 连子:点数中没有一对,且五张牌的点数按照顺序排列。
- 单子:点数中没有一对,且至少有三张牌的点数相同。
需要注意的是,顺子必须是五张牌,且点数必须按照顺序排列,如果牌局中存在重复的点数或花色不匹配的情况,则不能构成顺子。
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: 输入数据:
玩家1:A 2 3 4 5 玩家2:6 7 8 9 10 玩家3:Q J 10 9 8
输出结果:
牌局为连子顺子!
-
测试用例2: 输入数据:
玩家1:A A 2 3 4 玩家2:5 6 7 8 9 玩家3:Q J 10 9 8
输出结果:
牌局为带子顺子!
-
测试用例3: 输入数据:
玩家1:A 2 3 4 5 玩家2:6 7 8 9 10 玩家3:Q J 9 8 7
输出结果:
牌局不是顺子!
通过这些测试用例,我们可以验证代码的正确性。
通过以上分析,我们可以用Java编写一个程序来判断一个牌局是否为顺子,并输出相应的结果,该程序通过读取输入数据、解析牌局数据、统计点数出现的次数,以及判断顺子条件,最终输出结果。
Java输出斗地主顺子,从逻辑到实现java输出斗地主顺子,
发表评论