当前位置: 首页 > news >正文

【Java 基础篇】Java 实现模拟斗地主游戏

在这里插入图片描述

欢迎阅读本篇博客,在这篇博客中,我们将详细讲解如何使用Java编写一个简单的模拟斗地主游戏。这个项目将帮助您了解Java编程中的一些基本概念,如面向对象编程、集合框架的使用、随机数生成等。

引言

斗地主是一种非常受欢迎的纸牌游戏,通常由3名玩家参与。在这个游戏中,玩家需要出牌并尽量在每一轮中获得尽可能多的分数。每一轮中都有一个玩家充当地主,而其他两名玩家则是农民。本项目的目标是通过Java代码模拟这个游戏并让您了解Java编程的基本原理。

项目概述

在本项目中,我们将创建一个简化版的斗地主游戏,其中包括一副扑克牌、三名玩家和一些游戏逻辑。我们将使用Java编程语言来实现整个项目。这个项目将帮助您巩固Java编程中的一些关键概念,如类、对象、继承、集合等。

游戏规则

在斗地主游戏中,一副扑克牌包含54张牌,其中包括52张普通牌和两张大小王。游戏的基本规则如下:

  1. 游戏开始时,一副牌被洗牌并分发给三名玩家,每名玩家17张牌,地主多一张。

  2. 地主由系统随机选出,地主的任务是在游戏中尽量多地获得分数。

  3. 游戏进行时,玩家按照规定的出牌规则出牌,其他玩家需要在规定的时间内选择是否要跟牌。

  4. 游戏的目标是尽量在每一轮中获得尽可能多的分数,分数根据出牌的牌型和牌面大小来计算。

  5. 游戏结束后,根据玩家的得分确定胜负。

项目结构

在开始编写代码之前,让我们先确定项目的结构。我们将创建以下类来组织我们的项目:

  1. Card(卡牌类) - 表示一张扑克牌。

  2. Player(玩家类) - 表示一名玩家,包括手中的牌和玩家的基本信息。

  3. Game(斗地主游戏类) - 表示整个游戏,包括游戏的规则和逻辑。

现在,让我们逐步实现这些类,从卡牌类开始。

实现步骤

创建卡牌类

首先,我们需要创建一个Card类来表示一张扑克牌。每张牌都有花色和点数,所以我们需要定义这两个属性。以下是Card类的基本结构:

public class Card {private String suit; // 花色private String rank; // 点数// 构造函数public Card(String suit, String rank) {this.suit = suit;this.rank = rank;}// Getter```javapublic String getSuit() {return suit;}public String getRank() {return rank;}// 覆盖toString方法,用于打印牌的信息@Overridepublic String toString() {return rank + " of " + suit;}
}

Card类有两个私有属性:suit(花色)和rank(点数)。构造函数用于初始化这两个属性。我们还提供了getSuitgetRank方法,以及覆盖了toString方法,用于返回牌的字符串表示。

创建玩家类

接下来,我们将创建一个Player类来表示一名玩家。每名玩家都有一个唯一的标识符、手中的牌和当前的得分。以下是Player类的基本结构:

import java.util.ArrayList;
import java.util.List;public class Player {private int id; // 玩家标识符private List<Card> hand; // 手中的牌private int score; // 当前得分// 构造函数public Player(int id) {this.id = id;this.hand = new ArrayList<>();this.score = 0;}// Getter和Setter方法public int getId() {return id;}public List<Card> getHand() {return hand;}public int getScore() {return score;}public void setScore(int score) {this.score = score;}// 添加一张牌到玩家手中public void addCard(Card card) {hand.add(card);}// 从玩家手中移除一张牌public void removeCard(Card card) {hand.remove(card);}// 覆盖toString方法,用于打印玩家信息@Overridepublic String toString() {return "Player " + id;}
}

Player类有三个私有属性:id(玩家标识符)、hand(手中的牌)和score(当前得分)。构造函数用于初始化这些属性。我们提供了一些方法来获取和设置属性,以及添加和移除手中的牌。覆盖的toString方法用于返回玩家的字符串表示。

创建斗地主游戏类

现在,让我们创建Game类来表示整个斗地主游戏。Game类将包含游戏的规则和逻辑。以下是Game类的基本结构:

import java.util.*;
import java.util.stream.Collectors;public class Game {private List<Card> deck; // 牌堆private List<Player> players; // 玩家列表private Player landlord; // 地主private List<Card> landlordCards; // 地主的底牌// 构造函数public Game() {// 初始化牌堆initializeDeck();// 初始化玩家initializePlayers();// 洗牌shuffleDeck();// 发牌dealCards();}// 初始化牌堆,创建一副包含54张牌的扑克牌private void initializeDeck() {deck = new ArrayList<>();String[] suits = {"Spades", "Hearts", "Diamonds", "Clubs"};String[] ranks = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"};for (String suit : suits) {for (String rank : ranks) {deck.add(new Card(suit, rank));}}// 添加大小王deck.add(new Card("Joker", "Red"));deck.add(new Card("Joker", "Black"));}// 初始化玩家,创建三名玩家private void initializePlayers() {players = new ArrayList<>();for (int i = 1; i <= 3; i++) {players.add(new Player(i));}}// 洗牌private void shuffleDeck() {Collections.shuffle(deck);}// 发牌,每名玩家发17张牌private void dealCards() {for (int i = 0; i < 51; i++) {players.get(i % 3).addCard(deck.get(i));}// 底牌landlordCards = deck.subList(51, 54);}// 获取地主public Player getLandlord() {return landlord;}// 设置地主public void setLandlord(Player landlord) {this.landlord = landlord;}// 获取地主的底牌public List<Card> getLandlordCards() {return landlordCards;}
}

Game类有四个私有属性:deck(牌堆)、players(玩家列表)、landlord(地主)和landlordCards(地主的底牌)。构造函数用于初始化牌堆、玩家和进行洗牌和发牌操作。还提供了一些方法来获取和设置地主和底牌。

实现洗牌和发牌

Game类中,我们使用initializeDeck方法初始化牌堆,然后使用shuffleDeck方法洗牌,最后使用dealCards方法发牌。现在,让我们继续实现这些方法。

// 洗牌
private void shuffleDeck() {Collections.shuffle(deck);
}// 发牌,每名玩家发17张牌,地主多一张
private void dealCards() {for (int i = 0; i < 51; i++) {players.get(i % 3).addCard(deck.get(i));}// 底牌landlordCards = deck.subList(51, 54);
}

这些方法很简单,shuffleDeck方法使用Collections.shuffle方法来随机打乱牌堆的顺序,dealCards方法将牌分发给玩家和地主。

实现游戏逻辑

在斗地主游戏中,有很多复杂的规则和逻辑,包括出牌规则、跟牌规则、牌型判断等。在这篇博客中,由于篇幅限制,我们只实现了游戏的基本结构,您可以根据自己的兴趣和需求继续完善游戏的逻辑。

游戏运行

为了运行斗地主游戏,您可以创建一个主类,初始化游戏对象,然后按照游戏规则逐步进行游戏逻辑的实现。您可以使用控制台来与玩家交互,获取玩家的出牌和跟牌操作,并根据游戏规则来判断胜负。

总结

通过这个简单的模拟斗地主游戏项目,我们学习了如何使用Java编程语言来创建类、对象,实现洗牌和发牌操作,以及设计基本的游戏规则和逻辑。这个项目只是一个开始,您可以继续扩展它,添加更多的功能和规则,以创建一个完整的斗地主游戏。

希望这篇博客能帮助您更好地理解Java编程的基本原理,如果您有任何问题或建议,请随时与我们分享。祝您编程愉快!

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

相关文章:

【Java 基础篇】Java 实现模拟斗地主游戏

欢迎阅读本篇博客&#xff0c;在这篇博客中&#xff0c;我们将详细讲解如何使用Java编写一个简单的模拟斗地主游戏。这个项目将帮助您了解Java编程中的一些基本概念&#xff0c;如面向对象编程、集合框架的使用、随机数生成等。 引言 斗地主是一种非常受欢迎的纸牌游戏&#…...

计算机专业毕业设计项目推荐09-个人医疗系统(Spring+Js+Mysql)

个人医疗系统&#xff08;SpringJsMysql&#xff09; **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及…...

安卓Compose(一)

为什么学习安卓Compose&#xff1f; 安卓Compose是一个相对新的UI工具包&#xff0c;它的出现为安卓应用程序开发带来了一系列的好处。下面是一些学习Compose的理由&#xff1a; 声明式UI 与传统的安卓XML布局相比&#xff0c;Compose使用了声明式的UI编程范例。这意味着你可以…...

【Linux学习】03Linux用户和权限

Linux&#xff08;B站黑马&#xff09;学习笔记 01Linux初识与安装 02Linux基础命令 03Linux用户和权限 文章目录 Linux&#xff08;B站黑马&#xff09;学习笔记前言03Linux用户和权限认知root用户root用户&#xff08;超级管理员&#xff09;su和exit命令sudo命令 用户、用户…...

LeetCode 面试题 05.04. 下一个数

文章目录 一、题目二、Java 题解2.1 求大数&#xff1a;2.2 求小数&#xff1a; 一、题目 下一个数。给定一个正整数&#xff0c;找出与其二进制表达式中1的个数相同且大小最接近的那两个数&#xff08;一个略大&#xff0c;一个略小&#xff09;。 示例1: 输入&#xff1a; n…...

SDXL prompt 笔记

模型 模型有两个&#xff0c;分别是 stable-diffusion-xl-base-1.0、stable-diffusion-xl-refiner-1.0。 base 模型是用来做文生图&#xff0c;refiner 模型是用来做图生图的。 SDXL 模型之 base、refiner 和 VAE_云水木石的博客-CSDN博客 分辨率 默认是1024*1024&#xf…...

使用Redis管道进行查询接口性能优化

一、引入 在我们的正常项目开发过程中&#xff0c;我们会通过Redis缓存数据&#xff0c;来帮我们进行异步任务&#xff0c;分担外部的请求压力 但是Redis缓存也有一定的限制&#xff0c;因为我们在向请求过来时&#xff0c;Redis客户端都要向服务端发送一次请求&#xff0c;相应…...

初学vue.js

准备Vue.js环境 ① 下载环境&#xff1a; javaScript语言的程序包&#xff1a;外部js文件 对于Vue来说&#xff0c;导入Vue的外部js文件就能够使用Vue框架了。 Vue框架的js文件获取: 官网提供的下载地址&#xff1a;https://cdn.jsdelivr.net/npm/vue/dist/vue.js ②导入环境…...

React的thunk中间件

Thunk 是一种中间件&#xff0c;它可以在 Redux 中处理异步操作。Thunk 中间件允许你在 action 中返回一个函数&#xff0c;而不仅仅是一个普通的 action 对象。这个返回的函数可以接收 dispatch 和 getState 作为参数&#xff0c;并且可以在函数内部进行异步操作。当使用 Thun…...

数组初学者向导:使用Python从零开始制作经典战舰游戏

引言 战舰游戏&#xff0c;一个广受欢迎的经典游戏&#xff0c;为玩家提供了策略与猜测的完美结合。这个游戏的核心思想是通过猜测敌方船只的位置并尝试击沉它们来赢得比赛。在这篇文章中&#xff0c;我们将使用Python语言和数组来构建这款游戏&#xff0c;让你更加了解数组的…...

【STM32】IAP升级 预备知识

IAP&#xff08;In Application Programming&#xff09;简介 Flash够大的情况下&#xff0c;上电后的程序通过修改 MSP 的方式&#xff0c;可以在一块Flash上存在多个功能差异的程序。 IAP是为了在执行正常功能前&#xff0c;为了升级功能&#xff0c;提前运行的一段程序。这…...

asp.net网站的建立及运行

点击创建新项目 在输入框中输入asp.net&#xff0c;并选择图中的 点击下一步 点击创建 然后&#xff0c;右键&#xff0c;添加&#xff0c;新建项 选择web窗体 点击添加 点击视图&#xff0c;工具箱 选择一个label&#xff0c;记住这个id 空白处右键&#xff0c;查看代码 添…...

怎么把webm转换成mp4?

怎么把webm转换成mp4&#xff1f;与MP4这位视频格式大哥相比&#xff0c;Webm这种视频格式还有很多小伙伴对它不太熟悉&#xff0c;因为大家平时也是偶尔才能接触到&#xff0c;属于不常用的视频格式。Webm是一种开放、免费的媒体文件格式&#xff0c;尽管如今它的应用范围比以…...

RabbitMQ 消息应答

每日一句 物是人非事事休,欲语泪先流。 概述 为了保证消息在发送过程中不丢失,RabbitMQ引入了消息应答机制, 消费者在接收到消息并且处理该消息后,告诉RabbitMQ它已经处理了,RabbitMQ可以把消息删除了。 自动应答 消息发送后立即被认为已经传送成功,这种模式需要在…...

【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )

文章目录 一、全局函数 与 成员函数 相互转化1、成员函数转为全局函数 - 多了一个参数2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 二、有参构造函数设置默认参数值三、返回匿名对象与返回引用四、完整代码示例 一、全局函数 与 成员函数 相互转化 1、成员函数转为全局…...

游戏遇到的问题

天涯明月刀 就是天刀的假全屏&#xff0c;很多天刀玩家可能玩其他游戏比较少或者对电脑了解不多&#xff0c;不在意帧数&#xff0c;但是肯定还是有一部分玩家发现了这个问题&#xff0c;就是“我使命召唤12都能跑到60帧的机器跑个破天刀40帧甚至30帧?”问题何在呢&#xff1…...

高性能系统的性能优化技巧:从专家的经验中学习 | 开源日报 No.40

binhnguyennus/awesome-scalability Stars: 48.3k License: MIT 这个项目是一个阅读列表&#xff0c;用于说明可扩展、可靠和高性能大规模系统的模式。该项目通过知名工程师的文章和可信参考资料来解释概念&#xff0c;并从为数以百万计甚至十亿用户提供服务的经过实战验证的系…...

Linux系统编程——进程间通信的学习

学习参考博文&#xff1a; 进程间的五种通信方式介绍Linux 信号介绍 Linux系统编程学习相关博文 Linux系统编程——文件编程的学习Linux系统编程——进程的学习Linux系统编程——线程的学习Linux系统编程——网络编程的学习 Linux系统编程——进程间通信的学习 一、概述1. 无…...

人工智能AI 全栈体系(六)

第一章 神经网络是如何实现的 这些年神经网络的发展越来越复杂&#xff0c;应用领域越来越广&#xff0c;性能也越来越好&#xff0c;但是训练方法还是依靠 BP 算法。也有一些对 BP 算法的改进算法&#xff0c;但是大体思路基本是一样的&#xff0c;只是对 BP 算法个别地方的一…...

NPDP是什么?考了有用吗?

1&#xff09;NPDP是什么&#xff1f; NPDP&#xff0c;全称为New Product Development Professional&#xff0c;即新产品开发专业人员。NPDP认证是由世界产品开发协会&#xff08;PDMA&#xff09;推出的一项专业认证。它旨在评估和认可个人在新产品开发领域的专业知识和技能…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)

一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解&#xff0c;适合用作学习或写简历项目背景说明。 &#x1f9e0; 一、概念简介&#xff1a;Solidity 合约开发 Solidity 是一种专门为 以太坊&#xff08;Ethereum&#xff09;平台编写智能合约的高级编…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成

一个面向 Java 开发者的 Sring-Ai 示例工程项目&#xff0c;该项目是一个 Spring AI 快速入门的样例工程项目&#xff0c;旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计&#xff0c;每个模块都专注于特定的功能领域&#xff0c;便于学习和…...

MySQL的pymysql操作

本章是MySQL的最后一章&#xff0c;MySQL到此完结&#xff0c;下一站Hadoop&#xff01;&#xff01;&#xff01; 这章很简单&#xff0c;完整代码在最后&#xff0c;详细讲解之前python课程里面也有&#xff0c;感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...