【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)推出的一项专业认证。它旨在评估和认可个人在新产品开发领域的专业知识和技能…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
