java简单实现斗地主发牌功能
作者:qq_35937045 发布时间:2023-06-18 16:22:44
标签:java,斗地主,发牌
本文实例为大家分享了java简单实现斗地主发牌的具体代码,供大家参考,具体内容如下
问题:
参考斗地主的游戏规则,完成一个发牌的功能(54张牌,考虑点数,花色;三名玩家,其中地主比其他玩家多3张牌)
要求实现以下功能:
1、洗牌
2、发牌(发牌按照常规方式A-B-C-A-B-C-A…,不允许一次性随机17张给某个玩家)
3、玩家手中牌的展示(要求按点数实现排序)
分析
运用面向对象的程序设计思维分为扑克、玩家和游戏三部分,扑克类属性有花色,点数,次序;玩家类属性有玩家id,昵称,是否地主,牌的集合;游戏过程分为洗牌,随机产生地主,发牌,完成牌的排序,玩家手里的牌展示功能
程序实现
package com.lesson17.homework;
/**
* @author HUC
*
*/
/**扑克类*/
public class Poker {
/** 扑克花色 */
private String flower;
/** 扑克点数 */
private String pointer;
/** 扑克顺序 */
private int sort;
public Poker(String flower, String pointer, int sort) {
super();
this.flower = flower;
this.pointer = pointer;
this.sort = sort;
}
public String getFlower() {
return flower;
}
public void setFlower(String flower) {
this.flower = flower;
}
public String getPointer() {
return pointer;
}
public void setPointer(String pointer) {
this.pointer = pointer;
}
public int getSort() {
return sort;
}
public void setSort(int sort) {
this.sort = sort;
}
@Override
public String toString() {
return flower + pointer;
}
package com.lesson17.homework;
public class Player {
/** 玩家id */
private int id;
/** 玩家昵称 */
private String name;
/** 玩家拿到的牌 */
private ArrayList<Poker> pokers = new ArrayList<>();
/** 玩家是否地主 */
private boolean boss;
public Player(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ArrayList<Poker> getPokers() {
return pokers;
}
public void setPokers(ArrayList<Poker> pokers) {
this.pokers = pokers;
}
public boolean isBoss() {
return boss;
}
public void setBoss(boolean boss) {
this.boss = boss;
}
package com.lesson17.homework;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Random;
public class PokerGame {
static List<Player> players;
static ArrayList<Poker> list = new ArrayList<>();
static String[] flowers = {"方块","梅花","黑桃","红心"};
static String[] pointers = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
int bossIndex; //地主索引
static{
//初始化扑克
for (int i = 0; i < flowers.length; i++) {
for (int j = 0; j < pointers.length; j++) {
//生成一张扑克对象
Poker p = new Poker(flowers[i], pointers[j], j);
list.add(p);
}
}
//单独将大小王加入集合
list.add(new Poker("小", "王", 13));
list.add(new Poker("大", "王", 14));
//初始化玩家
players = Arrays.asList(
new Player(1, "刘备"),
new Player(2, "关羽"),
new Player(3, "张飞"));
}
/**洗牌*/
public void washPoker(){
Collections.shuffle(list);
}
/**随机地主*/
public void pushBoss(){
Random r = new Random();
bossIndex = r.nextInt(players.size());
//设置被随机到的玩家为地主
players.get(bossIndex).setBoss(true);
}
/**依次发牌*/
public void pushPoker(){
for (int i = 0; i < 51; i+=3) {
players.get(0).getPokers().add(list.get(i));
players.get(1).getPokers().add(list.get(i+1));
players.get(2).getPokers().add(list.get(i+2));
}
for(int i = 51;i < 54 ;i++){
//将最后剩余的牌(3张)全部给地主
players.get(bossIndex).getPokers().add(list.get(i));
}
}
/**排序*/
public void sortPoker() {
Collections.sort(players.get(0).getPokers(), (a,b)->a.getSort()-b.getSort());
Collections.sort(players.get(1).getPokers(), (a,b)->a.getSort()-b.getSort());
Collections.sort(players.get(2).getPokers(), (a,b)->a.getSort()-b.getSort());
}
public void start(){
//随机地主
pushBoss();
//洗牌
washPoker();
//发牌
pushPoker();
//排序
sortPoker();
//展示牌
for(Player p : players){
System.out.println(p.getPokers());
}
}
public static void main(String[] args) {
new PokerGame().start();
}
}
结果
来源:https://blog.csdn.net/qq_35937045/article/details/97620335


猜你喜欢
- 示例代码:<%@ Page Language="C#" AutoEventWireup="true&qu
- 前言从windows窗口的概念开始,通过对比去理解Android窗口体系,本文没有深入源码,重在理解概念代码都是抄来抄去,概念也是互相借鉴
- TV 3D卡片无限循环效果,供大家参考,具体内容如下##前言1、需求:实现3个卡片实现无限循环效果:1-2-3-1-2-3-1…,而且要实现
- 一、前言对于任何框架而言,在使用前都要进行一系列的初始化,MyBatis也不例外。二、MyBatis的初始化做了什么2.1 Mybatis的
- 为方便自己以后学习,自己记录学习,大家也可以参考,有什么问题一起探讨。今天学习RecyclerView,下边来说一下实现数据垂直滚动和数据横
- Unity2018已经把打包过程简化很多了我们只需要关心两个API:1.BuildPipline.BuildAssetBundles() 打
- 通过继承Thread类并实现run方法创建一个线程// 定义一个Thread类,相当于一个线程的模板class MyThread01 ext
- Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,SpringMVC为子容器,子容器可以引用父容器中的Bean,
- 一次性全部绘制出来实现代码import java.awt.*;public class AlgoVisualizer {private st
- 本文详细分析了C#类的访问修饰符用法,分享给大家供大家参考。具体用法分析如下:默认情况下,类声明为内部的,即只有当前工程中的代码才能访问它。
- 一. 引入相关jar包首先,我们先在idea里创建出一个Maven项目出来,除了路径要填成自己的希望路径以外,其他都可以一路next和fin
- 上一篇介绍了elasticsearch的client结构,client只是一个门面,在每个方法后面都有一个action来承接相应的功能。但是
- 在使用jQuery时候,我们经常会看到或者使用到方法链,例如:$("#p1").css("color"
- 本文实例讲述了Android发送xml数据给服务器的方法。分享给大家供大家参考。具体如下:一、发送xml数据:public static v
- 1 需求描述我们现在要干一个什么事情呢,我们要在浏览器输入一个请求地址,然后我们的后端就给我返回一个User对象即可,并且我希望以Json的
- 1.导入jar包: <!--jmsTemplate--> <dependency> <
- 前提在Windows下进行数据处理的时候最常见的情况莫过于读取Microsoft的Excel文件了,Excel的普及率惊人,是事实上的标准。
- 1.设计思路,使用VersionCode定义为版本升级参数。android为我们定义版本提供了2个属性:<manifest packa
- 依赖让我们先把 zip4j 依赖关系添加到我们的 pom.xml 文件中。<dependenc
- Springboot内部提供的事务管理器是根据autoconfigure来进行决定的。比如当使用jpa的时候,也就是pom中加入了sprin