java实现斗地主游戏

时间: 2023-10-29 22:08:44 浏览: 40
实现斗地主游戏需要以下几步: 1.准备工作 定义一个扑克牌的类,包括花色和点数,定义一个牌堆类,包括洗牌、发牌、排序等功能。 2.发牌 将牌堆中的牌洗乱,然后依次发给三个玩家和底牌。 3.叫地主 首先随机确定一个玩家为地主,然后其他两个玩家可以选择叫分或者不叫,每个玩家叫分的分数必须比前一个玩家高,直到分数最高的玩家成为地主。 4.出牌 地主先出牌,然后其他玩家依次出牌,出牌规则是必须比上一个玩家出的牌大,如果无法出牌则需要过牌。 5.结束游戏 当有一个玩家手中的牌出完或者其他玩家放弃出牌时,游戏结束,此时统计各个玩家的得分,包括出完牌的得分和叫分的得分。 下面是一个简单的实现代码,仅供参考: ``` public class DouDiZhu { private static final int CARD_NUM = 54; private static final int PLAYER_NUM = 3; private List<PokerCard> cardList = new ArrayList<>(); private List<PokerCard> player1 = new ArrayList<>(); private List<PokerCard> player2 = new ArrayList<>(); private List<PokerCard> player3 = new ArrayList<>(); private List<PokerCard> bottomCards = new ArrayList<>(); private int landlordIndex; public void initCardList() { for (int i = 1; i <= 13; i++) { for (int j = 1; j <= 4; j++) { cardList.add(new PokerCard(i, j)); } } cardList.add(new PokerCard(0, 5)); // 小王 cardList.add(new PokerCard(0, 6)); // 大王 } public void shuffle() { Collections.shuffle(cardList); } public void dealCards() { for (int i = 0; i < CARD_NUM - 3; i++) { if (i % PLAYER_NUM == 0) { player1.add(cardList.get(i)); } else if (i % PLAYER_NUM == 1) { player2.add(cardList.get(i)); } else { player3.add(cardList.get(i)); } } bottomCards.add(cardList.get(CARD_NUM - 3)); bottomCards.add(cardList.get(CARD_NUM - 2)); bottomCards.add(cardList.get(CARD_NUM - 1)); } public void callLandlord() { Random random = new Random(); landlordIndex = random.nextInt(PLAYER_NUM); System.out.println("玩家" + (landlordIndex + 1) + "成为地主"); int score = 0; int currentPlayerIndex = landlordIndex; while (score < 3) { currentPlayerIndex = (currentPlayerIndex + 1) % PLAYER_NUM; System.out.println("玩家" + (currentPlayerIndex + 1) + "请叫分(0-3):"); Scanner sc = new Scanner(System.in); int callScore = sc.nextInt(); if (callScore > score) { score = callScore; landlordIndex = currentPlayerIndex; } } System.out.println("地主是玩家" + (landlordIndex + 1) + ",底牌是:"); for (PokerCard card : bottomCards) { System.out.print(card + " "); } System.out.println(); } public void playCards() { List<PokerCard> currentCards = null; int currentPlayerIndex = landlordIndex; while (!player1.isEmpty() && !player2.isEmpty() && !player3.isEmpty()) { if (currentPlayerIndex == 0) { currentCards = player1; } else if (currentPlayerIndex == 1) { currentCards = player2; } else { currentCards = player3; } System.out.println("当前出牌人是玩家" + (currentPlayerIndex + 1)); System.out.print("当前手牌:"); for (PokerCard card : currentCards) { System.out.print(card + " "); } System.out.println(); System.out.print("上一手牌:"); for (PokerCard card : lastCards) { System.out.print(card + " "); } System.out.println(); System.out.println("请出牌(不出请输0):"); Scanner sc = new Scanner(System.in); String input = sc.nextLine(); if (input.equals("0")) { System.out.println("玩家" + (currentPlayerIndex + 1) + "选择不出牌"); } else { List<PokerCard> selectedCards = new ArrayList<>(); String[] cardStrs = input.split(" "); for (String cardStr : cardStrs) { String[] parts = cardStr.split("-"); int num = Integer.parseInt(parts[0]); int suit = Integer.parseInt(parts[1]); PokerCard card = new PokerCard(num, suit); selectedCards.add(card); } if (PokerUtil.isCardsValid(selectedCards) && PokerUtil.isCardsLarger(selectedCards, lastCards)) { currentCards.removeAll(selectedCards); lastCards = selectedCards; } else { System.out.println("出牌不符合规则"); } } currentPlayerIndex = (currentPlayerIndex + 1) % PLAYER_NUM; } } public void start() { initCardList(); shuffle(); dealCards(); callLandlord(); playCards(); } public static void main(String[] args) { DouDiZhu game = new DouDiZhu(); game.start(); } } class PokerCard { private int num; // 点数 private int suit; // 花色 public PokerCard(int num, int suit) { this.num = num; this.suit = suit; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public int getSuit() { return suit; } public void setSuit(int suit) { this.suit = suit; } @Override public String toString() { String suitStr = ""; switch (suit) { case 1: suitStr = "♠"; break; case 2: suitStr = "♥"; break; case 3: suitStr = "♣"; break; case 4: suitStr = "♦"; break; case 5: suitStr = "小王"; break; case 6: suitStr = "大王"; break; } String numStr = ""; switch (num) { case 1: numStr = "A"; break; case 11: numStr = "J"; break; case 12: numStr = "Q"; break; case 13: numStr = "K"; break; default: numStr = String.valueOf(num); break; } return suitStr + numStr; } } class PokerUtil { public static boolean isCardsValid(List<PokerCard> cards) { if (cards == null || cards.size() == 0) { return false; } if (cards.size() == 1) { return true; } if (cards.size() == 2) { if (cards.get(0).getNum() == cards.get(1).getNum()) { return true; } return false; } if (cards.size() == 3) { if (cards.get(0).getNum() == cards.get(1).getNum() && cards.get(0).getNum() == cards.get(2).getNum()) { return true; } return false; } if (cards.size() == 4) { if (cards.get(0).getNum() == cards.get(1).getNum() && cards.get(0).getNum() == cards.get(2).getNum() && cards.get(0).getNum() == cards.get(3).getNum()) { return true; } if (cards.get(0).getNum() == cards.get(1).getNum() && cards.get(0).getNum() == cards.get(2).getNum()) { return cards.get(3).getNum() == cards.get(2).getNum(); } if (cards.get(1).getNum() == cards.get(2).getNum() && cards.get(1).getNum() == cards.get(3).getNum()) { return cards.get(0).getNum() == cards.get(1).getNum(); } return false; } if (cards.size() == 5) { if (cards.get(0).getNum() == cards.get(1).getNum() && cards.get(0).getNum() == cards.get(2).getNum() && cards.get(0).getNum() == cards.get(3).getNum()) { return cards.get(4).getNum() == cards.get(3).getNum(); } if (cards.get(1).getNum() == cards.get(2).getNum() && cards.get(1).getNum() == cards.get(3).getNum() && cards.get(1).getNum() == cards.get(4).getNum()) { return cards.get(0).getNum() == cards.get(1).getNum(); } if (cards.get(0).getNum() == cards.get(1).getNum() && cards.get(0).getNum() == cards.get(2).getNum() && cards.get(3).getNum() == cards.get(4).getNum()) { return true; } return false; } return false; } public static boolean isCardsLarger(List<PokerCard> cards, List<PokerCard> lastCards) { if (lastCards == null || lastCards.size() == 0) { return true; } if (cards.size() != lastCards.size()) { return false; } int num1 = getCardsNum(cards); int num2 = getCardsNum(lastCards); if (num1 > num2) { return true; } if (num1 < num2) { return false; } return cards.get(cards.size() - 1).getNum() > lastCards.get(lastCards.size() - 1).getNum(); } private static int getCardsNum(List<PokerCard> cards) { if (isSingle(cards)) { return 1; } if (isDouble(cards)) { return 2; } if (isTriple(cards)) { return 3; } if (isBomb(cards)) { return 4; } if (isStraight(cards)) { return cards.size(); } if (isDoubleStraight(cards)) { return cards.size() / 2; } return 0; } private static boolean isSingle(List<PokerCard> cards) { return cards.size() == 1; } private static boolean isDouble(List<PokerCard> cards) { return cards.size() == 2 && cards.get(0).getNum() == cards.get(1).getNum(); } private static boolean isTriple(List<PokerCard> cards) { return cards.size() == 3 && cards.get(0).getNum() == cards.get(1).getNum() && cards.get(0).getNum() == cards.get(2).getNum(); } private static boolean isBomb(List<PokerCard> cards) { return cards.size() == 4 && cards.get(0).getNum() == cards.get(1).getNum() && cards.get(0).getNum() == cards.get(2).getNum() && cards.get(0).getNum() == cards.get(3).getNum(); } private static boolean isStraight(List<PokerCard> cards) { if (cards.size() < 5) { return false; } for (int i = 1; i < cards.size(); i++) { if (cards.get(i).getNum() != cards.get(i - 1).getNum() + 1) { return false; } } return true; } private static boolean isDoubleStraight(List<PokerCard> cards) { if (cards.size() % 2 != 0) { return false; } for (int i = 0; i < cards.size(); i += 2) { if (cards.get(i).getNum() != cards.get(i + 1).getNum()) { return false; } } for (int i = 2; i < cards.size(); i += 2) { if (cards.get(i).getNum() != cards.get(i - 2).getNum() + 1) { return false; } } return true; } } ```

相关推荐

最新推荐

recommend-type

2024嵌入式大厂面经C++首创

2024嵌入式大厂面经C++首创提取方式是百度网盘分享地址
recommend-type

C++ 高性能爬虫代码,带UI

C++ 高性能爬虫代码,带UI
recommend-type

2024嵌入式面试资料裕日软件C笔试题

2024嵌入式面试资料裕日软件C笔试题提取方式是百度网盘分享地址
recommend-type

黑色素瘤分类数据集10015张7类别.7z

数据集类型:图像分类用,不可用于目标检测无标注文件 数据集格式:仅仅包含jpg图片,每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数):10015 分类类别数:7 类别名称:[“0”,“1”,“2”,“3”,“4”,“5”,“6”] 更多信息:blog.csdn.net/FL1623863129/article/details/139561265
recommend-type

2024年高尿酸及痛风疾病医药行业分析报告.pptx

行业报告
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB正态分布协方差分析:揭示正态分布变量之间的协方差

![MATLAB正态分布协方差分析:揭示正态分布变量之间的协方差](https://site.cdn.mengte.online/official/2021/11/20211128213137293.png) # 1. 正态分布概述 正态分布,又称高斯分布,是统计学中最重要的连续概率分布之一。它广泛应用于自然科学、社会科学和工程领域。 正态分布的概率密度函数为: ``` f(x) = (1 / (σ√(2π))) * exp(-(x - μ)² / (2σ²)) ``` 其中: - μ:正态分布的均值 - σ:正态分布的标准差 - π:圆周率 正态分布具有以下特性: - 对称性:
recommend-type

我正在开发一款个人碳足迹计算app,如何撰写其需求分析文档,请给我一个范例

为了更全面、清晰地定义个人碳足迹计算app的需求,需求分析文档应该包含以下内容: 1.项目简介:对该app项目的概述及目标进行说明。 2.用户分析:包括目标用户群、用户需求、行为等。 3.功能需求:对app的基本功能进行定义,如用户登录、数据录入、数据统计等。 4.非功能需求:对使用app的性能和质量等进行定义,如界面设计、数据安全、可扩展性等。 5.运行环境:包括app的开发环境和使用环境。 下面是一个范例: 需求分析文档 1. 项目简介 该app项目旨在为用户提供一款方便、易用、可定制的个人碳足迹计算平台,以促进环保和可持续性发展。 2. 用户分析 目标用户群:全球关
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。