【Java 基础篇】Java 实现模拟斗地主游戏
欢迎阅读本篇博客,在这篇博客中,我们将详细讲解如何使用Java编写一个简单的模拟斗地主游戏。这个项目将帮助您了解Java编程中的一些基本概念,如面向对象编程、集合框架的使用、随机数生成等。
引言
斗地主是一种非常受欢迎的纸牌游戏,通常由3名玩家参与。在这个游戏中,玩家需要出牌并尽量在每一轮中获得尽可能多的分数。每一轮中都有一个玩家充当地主,而其他两名玩家则是农民。本项目的目标是通过Java代码模拟这个游戏并让您了解Java编程的基本原理。
项目概述
在本项目中,我们将创建一个简化版的斗地主游戏,其中包括一副扑克牌、三名玩家和一些游戏逻辑。我们将使用Java编程语言来实现整个项目。这个项目将帮助您巩固Java编程中的一些关键概念,如类、对象、继承、集合等。
游戏规则
在斗地主游戏中,一副扑克牌包含54张牌,其中包括52张普通牌和两张大小王。游戏的基本规则如下:
-
游戏开始时,一副牌被洗牌并分发给三名玩家,每名玩家17张牌,地主多一张。
-
地主由系统随机选出,地主的任务是在游戏中尽量多地获得分数。
-
游戏进行时,玩家按照规定的出牌规则出牌,其他玩家需要在规定的时间内选择是否要跟牌。
-
游戏的目标是尽量在每一轮中获得尽可能多的分数,分数根据出牌的牌型和牌面大小来计算。
-
游戏结束后,根据玩家的得分确定胜负。
项目结构
在开始编写代码之前,让我们先确定项目的结构。我们将创建以下类来组织我们的项目:
-
Card(卡牌类) - 表示一张扑克牌。
-
Player(玩家类) - 表示一名玩家,包括手中的牌和玩家的基本信息。
-
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
(点数)。构造函数用于初始化这两个属性。我们还提供了getSuit
和getRank
方法,以及覆盖了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 实现模拟斗地主游戏
欢迎阅读本篇博客,在这篇博客中,我们将详细讲解如何使用Java编写一个简单的模拟斗地主游戏。这个项目将帮助您了解Java编程中的一些基本概念,如面向对象编程、集合框架的使用、随机数生成等。 引言 斗地主是一种非常受欢迎的纸牌游戏&#…...

计算机专业毕业设计项目推荐09-个人医疗系统(Spring+Js+Mysql)
个人医疗系统(SpringJsMysql) **介绍****系统总体开发情况-功能模块****各部分模块实现** 介绍 本系列(后期可能博主会统一为专栏)博文献给即将毕业的计算机专业同学们,因为博主自身本科和硕士也是科班出生,所以也比较了解计算机专业的毕业设计流程以及…...
安卓Compose(一)
为什么学习安卓Compose? 安卓Compose是一个相对新的UI工具包,它的出现为安卓应用程序开发带来了一系列的好处。下面是一些学习Compose的理由: 声明式UI 与传统的安卓XML布局相比,Compose使用了声明式的UI编程范例。这意味着你可以…...

【Linux学习】03Linux用户和权限
Linux(B站黑马)学习笔记 01Linux初识与安装 02Linux基础命令 03Linux用户和权限 文章目录 Linux(B站黑马)学习笔记前言03Linux用户和权限认知root用户root用户(超级管理员)su和exit命令sudo命令 用户、用户…...
LeetCode 面试题 05.04. 下一个数
文章目录 一、题目二、Java 题解2.1 求大数:2.2 求小数: 一、题目 下一个数。给定一个正整数,找出与其二进制表达式中1的个数相同且大小最接近的那两个数(一个略大,一个略小)。 示例1: 输入: n…...

SDXL prompt 笔记
模型 模型有两个,分别是 stable-diffusion-xl-base-1.0、stable-diffusion-xl-refiner-1.0。 base 模型是用来做文生图,refiner 模型是用来做图生图的。 SDXL 模型之 base、refiner 和 VAE_云水木石的博客-CSDN博客 分辨率 默认是1024*1024…...
使用Redis管道进行查询接口性能优化
一、引入 在我们的正常项目开发过程中,我们会通过Redis缓存数据,来帮我们进行异步任务,分担外部的请求压力 但是Redis缓存也有一定的限制,因为我们在向请求过来时,Redis客户端都要向服务端发送一次请求,相应…...

初学vue.js
准备Vue.js环境 ① 下载环境: javaScript语言的程序包:外部js文件 对于Vue来说,导入Vue的外部js文件就能够使用Vue框架了。 Vue框架的js文件获取: 官网提供的下载地址:https://cdn.jsdelivr.net/npm/vue/dist/vue.js ②导入环境…...
React的thunk中间件
Thunk 是一种中间件,它可以在 Redux 中处理异步操作。Thunk 中间件允许你在 action 中返回一个函数,而不仅仅是一个普通的 action 对象。这个返回的函数可以接收 dispatch 和 getState 作为参数,并且可以在函数内部进行异步操作。当使用 Thun…...
数组初学者向导:使用Python从零开始制作经典战舰游戏
引言 战舰游戏,一个广受欢迎的经典游戏,为玩家提供了策略与猜测的完美结合。这个游戏的核心思想是通过猜测敌方船只的位置并尝试击沉它们来赢得比赛。在这篇文章中,我们将使用Python语言和数组来构建这款游戏,让你更加了解数组的…...

【STM32】IAP升级 预备知识
IAP(In Application Programming)简介 Flash够大的情况下,上电后的程序通过修改 MSP 的方式,可以在一块Flash上存在多个功能差异的程序。 IAP是为了在执行正常功能前,为了升级功能,提前运行的一段程序。这…...

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

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

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

【C++】C++ 类中的 this 指针用法 ③ ( 全局函数 与 成员函数 相互转化 | 有参构造函数设置默认参数值 | 返回匿名对象与返回引用 )
文章目录 一、全局函数 与 成员函数 相互转化1、成员函数转为全局函数 - 多了一个参数2、全局函数转为成员函数 - 通过 this 指针隐藏操作数 二、有参构造函数设置默认参数值三、返回匿名对象与返回引用四、完整代码示例 一、全局函数 与 成员函数 相互转化 1、成员函数转为全局…...
游戏遇到的问题
天涯明月刀 就是天刀的假全屏,很多天刀玩家可能玩其他游戏比较少或者对电脑了解不多,不在意帧数,但是肯定还是有一部分玩家发现了这个问题,就是“我使命召唤12都能跑到60帧的机器跑个破天刀40帧甚至30帧?”问题何在呢࿱…...

高性能系统的性能优化技巧:从专家的经验中学习 | 开源日报 No.40
binhnguyennus/awesome-scalability Stars: 48.3k License: MIT 这个项目是一个阅读列表,用于说明可扩展、可靠和高性能大规模系统的模式。该项目通过知名工程师的文章和可信参考资料来解释概念,并从为数以百万计甚至十亿用户提供服务的经过实战验证的系…...
Linux系统编程——进程间通信的学习
学习参考博文: 进程间的五种通信方式介绍Linux 信号介绍 Linux系统编程学习相关博文 Linux系统编程——文件编程的学习Linux系统编程——进程的学习Linux系统编程——线程的学习Linux系统编程——网络编程的学习 Linux系统编程——进程间通信的学习 一、概述1. 无…...

人工智能AI 全栈体系(六)
第一章 神经网络是如何实现的 这些年神经网络的发展越来越复杂,应用领域越来越广,性能也越来越好,但是训练方法还是依靠 BP 算法。也有一些对 BP 算法的改进算法,但是大体思路基本是一样的,只是对 BP 算法个别地方的一…...

NPDP是什么?考了有用吗?
1)NPDP是什么? NPDP,全称为New Product Development Professional,即新产品开发专业人员。NPDP认证是由世界产品开发协会(PDMA)推出的一项专业认证。它旨在评估和认可个人在新产品开发领域的专业知识和技能…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...