Java实现牛牛算法详解

article/2025/9/28 16:58:14

看过我前面博文的朋友都知道,以前我从事过游戏服务器的开发,但是当时用的是PHP开发的,现在转型Java闲来无事,梳理了一些以前的算法进行详细分析。

  • 定义牌的数据结构:
/*** 牌对象* @author libing*  */
public class Card {private Integer type;//1:梅花 2:方块 3:红桃 4:黑桃(此处是按照西方花色优先级定义【黑桃最大,梅花最小】)private Integer num;//对应牌型(1-13)private Integer point;//点数 大于10的都为10public Card(Integer type, Integer num) {super();this.type = type;this.num = num;if(num>10) {this.point=10;}else {this.point = num;}}public Integer getType() {return type;}public void setType(Integer type) {this.type = type;}public Integer getNum() {return num;}public void setNum(Integer num) {this.num = num;}public Integer getPoint() {return point;}public void setPoint(Integer point) {this.point = point;}@Overridepublic String toString() {StringBuffer buffer=new StringBuffer();switch (type) {case 1:buffer.append("♣");break;case 2:buffer.append("♦");break;case 3:buffer.append("♠");break;case 4:buffer.append("♥");break;}switch (num) {case 1:buffer.append("A");break;case 11:buffer.append("J");break;case 12:buffer.append("Q");break;case 13:buffer.append("K");break;default:buffer.append(num);break;}return buffer.toString();}
}
  • 定义玩家结构:
/*** 玩家对象* @author libing*  */
public class Player {private String playerName;//玩家姓名private List<Card> cards;//玩家牌列表private Integer niuType;//牛型private List<Card> douCards;//在有牛的情况下的斗牌(eg:3 7 10)private Card maxCard;//最大的牌public Player(String playerName) {super();this.playerName=playerName;this.cards=new ArrayList<>();this.douCards=new ArrayList<>();}public String getPlayerName() {return playerName;}public void setPlayerName(String playerName) {this.playerName = playerName;}public List<Card> getCards() {return cards;}public void setCards(List<Card> cards) {this.cards = cards;}public void addCard(Card card) {this.cards.add(card);}public Integer getNiuType() {return niuType;}public void setNiuType(Integer niuType) {this.niuType = niuType;}public List<Card> getDouCards() {return douCards;}public void setDouCards(List<Card> douCards) {this.douCards = douCards;}public Card getMaxCard() {return maxCard;}public void setMaxCard(Card maxCard) {this.maxCard = maxCard;}public void addDouCard(Card card) {this.douCards.add(card);}@Overridepublic String toString() {return playerName+":"+cards+",牛型:"+niuType+",最大牌:"+maxCard+",斗牌:"+douCards;}
}
  • 定义牛牛判断处理逻辑对象:
/*** 牛型判断逻辑* @author libing*  */
public class NiuTypeJudgeLogic {/*** 判断牛牛类型* @param player*/public static void judgeNiuType(Player player) {//先将牌进行排序Collections.sort(player.getCards(), new Comparator<Card>() {@Overridepublic int compare(Card card1, Card card2) {int diff = card1.getNum() - card2.getNum();if (diff > 0) {return 1;}else if (diff < 0) {return -1;}else {//牌大小相同时判断花色return card1.getType()-card2.getType();}}});//1.先判断普通牛,是否是牛getNiuniuCount(player);//2.TODO 未完待续}/*** 判断普通牛牛点数* @return*/private static void getNiuniuCount(Player player){List<Card> cards = player.getCards();//得到玩家手上的牌//总点数Integer cardsTotalPoint = 0;//计算总点数for(Card card:cards){cardsTotalPoint += card.getPoint();}//计算余数Integer lave = cardsTotalPoint % 10;for(int i = 0; i < cards.size()-1; i++){for(int j = i + 1; j < cards.size(); j++){if((cards.get(i).getPoint() + cards.get(j).getPoint()) % 10 == lave){//此处是有牛,则取出斗的牌if(i!=0&&j!=0){player.addDouCard(cards.get(0));}if(i!=1&&j!=1){player.addDouCard(cards.get(1));}if(i!=2&&j!=2){player.addDouCard(cards.get(2));}if(i!=3&&j!=3){player.addDouCard(cards.get(3));}if(i!=4&&j!=4){player.addDouCard(cards.get(4));}//设置牛型player.setNiuType(_getCount(lave));//设置最大的牌player.setMaxCard(cards.get(4));return;}}}//设置为无牛player.setNiuType(NiuNiuType.WUNIU);player.setMaxCard(cards.get(4));}/*** 转换普通牛* @param lave* @return*/private static Integer _getCount(Integer lave){switch (lave) {case 0:return NiuNiuType.NIUNIU;case 1:return NiuNiuType.NIU1;case 2:return NiuNiuType.NIU2;case 3:return NiuNiuType.NIU3;case 4:return NiuNiuType.NIU4;case 5:return NiuNiuType.NIU5;case 6:return NiuNiuType.NIU6;case 7:return NiuNiuType.NIU7;case 8:return NiuNiuType.NIU8;case 9:return NiuNiuType.NIU9;default:return NiuNiuType.WUNIU;}}
}
  • 最后增加测试类:
public class Test {private static final Integer PLAYER_NUM=10;//定义玩游戏的人数(最多10人)private static List<Player> playerList=new ArrayList<>();//玩家列表//初始化玩家static {for(int i=1;i<=PLAYER_NUM;i++) {playerList.add(new Player("玩家"+i));}}public static void main(String[] args) {List<Card> cardList=new ArrayList<>();//1.创建一副54张的牌for(int i=1;i<=4;i++) {for(int j=1;j<=13;j++) {cardList.add(new Card(i, j));}}//2.洗牌(洗三次)Collections.shuffle(cardList);Collections.shuffle(cardList);Collections.shuffle(cardList);//定义一个队列进行管理牌Queue<Card> cardQueue=new ConcurrentLinkedQueue<Card>();for (Card card : cardList) {cardQueue.offer(card);}//3.发牌,根据人数for(int i=1;i<=5;i++) {for(int j=0;j<playerList.size();j++) {playerList.get(j).addCard(cardQueue.poll());}}//4.判断牛型for(Player player:playerList) {NiuTypeJudgeLogic.judgeNiuType(player);}//算出赢家(降序)Collections.sort(playerList, new Comparator<Player>() {@Overridepublic int compare(Player player1, Player player2) {//1.先按牛型排序int diff=player2.getNiuType()-player1.getNiuType();if (diff == 0) {//2.牛型相同时,按最大牌大小降序diff=player2.getMaxCard().getNum()-player1.getMaxCard().getNum();if(diff==0) {//3.牛型与最大牌大小都相同时,按花色排序return player2.getMaxCard().getType()-player1.getMaxCard().getType();}else {return diff;}}else {return diff;}}});for (Player player : playerList) {System.err.println(player);}}
}
  • 运行结果如下:
    在这里插入图片描述
    此次运行有一点特殊,玩家4和玩家9都是没牛且最大的牌都是10,但是判断玩家4是赢了玩家9的,因为玩家4最大牌是黑桃而玩家9是红桃,一开始定义牌就定义花色优先级为:黑桃>红桃>方块>梅花

暂时只判断了普通牛(牛一到牛牛),后面会陆续更新。未完待续…


http://chatgpt.dhexx.cn/article/HCwtsdj1.shtml

相关文章

本地生成七牛token

由于某些原因 有时候需要本地生成token 原文 地址http://zeeyang.com/2016/06/13/Qiniu-token/?utm_sourcetuicool&utm_mediumreferral 这是代码地址:provide simple interface to create token,upload file and upload files 首先我们需要用到三个参数 scope 、 Access…

手工集成7牛SDK到YII2框架中

手工集成7牛SDK到YII2框架中 7牛地址&#xff1a;qiniu.com 7牛云的产品列表中有&#xff1a;对象存储、自定义数据处理、多媒体处理、融合CDN加速、直播空间等资源。 我们上传图片文件需要的是『对象存储』&#xff0c;关于新建存储空间&#xff0c;这里就不多解释。 http…

7 牛 上传图片

官方文档 https://developer.qiniu.com/kodo/sdk/1283/javascript#2 一开始用了里面的 例子 var observable qiniu.upload(file, key, token, putExtra, config) var subscription observable.subscribe(observer) // 上传开始 // or var subscription observable.subscr…

Android使用7牛云存储

第一次使用这个云存储&#xff0c;话说7牛云存储大有来头&#xff01;区别于国内外其他云存储&#xff0c;七牛自行研发的全分布式架构解决了其他云存储单一数据中心架构可能存在的风险&#xff0c;同时首创双向加速特性对数据上传下载均加速&#xff0c;使得数据访问速度较传统…

七牛云解决缓存导致的无法及时更新问题

七牛云在后台配置有两个和缓存相关的配置&#xff0c;一个是maxAge值--客户端缓存&#xff0c;一个是cdn缓存 maxAge值和CDN缓存时间的区别&#xff1f; 访问资源链接时&#xff0c;缓存通常分为浏览器缓存和CDN节点缓存。 用户在浏览器中输入资源链接访问时&#xff0c;优先…

工作用哪个邮箱好用?好用的办公邮箱让你放假无烦恼

小伙伴们&#xff0c;已经初五了&#xff0c;这个春节&#xff0c;你有没有被“办公不便”的甜蜜困惑所打扰呢&#xff1f;如果你有这样的困惑&#xff0c;下面以TOMVIP邮箱为例&#xff0c;来了解一下高效办公的小技巧吧&#xff0c;不错过每一个重要邮件&#xff0c;更高质量…

个人工作邮箱怎么申请?工作邮箱有哪些?

关于工作邮箱有哪些品牌&#xff0c;为此以笔者多年的办公经验分享给大家&#xff0c;个人工作邮箱的申请方式其实很简单&#xff0c;今天小编重点分享一下邮箱品牌的选择。 如何选择邮箱 目前市面上几家主流品牌的邮箱我基本都用过。像搜狐、新浪、tom、163的。注册流程都很…

外贸客户邮箱用什么?外贸哪个邮箱好?

许多人在做外贸业务时&#xff0c;可能会遇到被客户拒绝&#xff0c;其实&#xff0c;这不一定是自己业务水平不够&#xff0c;也许是自己的邮箱账号拖累了自己。有的人喜欢用私人邮箱做外贸业务&#xff0c;但是大部分的外贸商家&#xff0c;都觉得私人邮箱是不够正式的。试想…

iPhone添加教育邮箱

iPhone添加教育邮箱 测试环境&#xff1a;iPhone7&#xff1b;iOS11.4.1 当我们申请了一个教育邮箱后&#xff0c;又希望把该邮箱添加到iPhone上&#xff0c;本贴就手把手一步一步教大家完成。 步骤1&#xff1a; 打开手机主屏幕上的设置&#xff0c;往下滑动&#xff0c;找…

企业邮箱注册购买优惠有哪些,企业工作邮箱怎么注册购买?

企业邮箱作为主流的办公工具&#xff0c;一直是企业和公司使用的首选对象&#xff0c;如果没有用过邮箱&#xff0c;并不知道企业邮箱注册购买的流程是什么样的&#xff0c;以及在与商家沟通上面&#xff0c;能争取到哪些优惠&#xff0c;下面的内容教大家怎样注册购买TOM企业邮…

教你快速记住公司工作邮箱格式,再也不用百度“邮箱格式怎么写”啦!

刚步入职场时&#xff0c;经常会遇到一个问题&#xff0c;那就是在发送邮件时&#xff0c;总记不住其他同事的邮箱&#xff0c;邮件地址错误导致发不出去邮件&#xff0c;今天就来带认识一下如何注册到好记邮箱格式&#xff01; 邮箱账号格式组成&#xff1a; 如上图邮箱账号…

工作电子邮箱怎么注册,电子邮箱格式怎么写?

在工作中&#xff0c;经常会有需要使用电子邮箱的情况&#xff0c;但私人邮箱不方便在日常工作中使用。所以&#xff0c;注册一个工作专用的电子邮箱很有必要&#xff0c;有哪些邮箱适合作为工作电子邮箱呢&#xff1f;TomVIP邮箱就很不错&#xff0c;不仅注册方便&#xff0c;…

工作一般预留什么邮箱? 注册工作邮箱谨防几大雷区!

事实上,关于邮箱的使用价值以及如何能选好并用好它,已成为了众多职场人的困惑。邮箱作为正式且私密性的办公工具,一旦选择通常便不会随意更换。所以无论是初入职场还是想二次选择邮箱的你,注册工作邮箱时一定要掌握选择的真理~ 工作一般预留什么邮箱?对于商务型邮箱选择…

如何申请企业域名工作邮箱?注册企业域名邮箱多少钱?

企业邮箱是员工之间信息共享和高效办公的重要工具&#xff0c;邮件快速收发、安全性成了用户关注的因素。但是TOM企业邮箱的注册区别于普通邮箱&#xff0c;注册方式不一样&#xff0c;让许多企业在申请邮箱时&#xff0c;遇到了很多难题&#xff0c;往往注册不成功或者需要浪费…

工作邮箱怎么注册?企业邮箱有哪些功能?

工作邮箱怎么注册&#xff1f;目前大部分企业给员工企业邮箱作为自己的工作邮箱&#xff0c;而不是自己注册&#xff0c;通常是由企业邮箱管理员或者有相关权限的工作人员负责注册。 企业邮箱是指以公司自己的域名为后缀的电子邮件地址。比如企业邮箱mailzoho.com.cn&#xff0…

ListView用例配合ViewHolder缓存

用android studio 在android 7中运行的 由UIActivityt 和 listview_layout.xml 和 list_item.xml写出来ListView用例 UIActivityt 代码 package com.example.a20200712;import android.database.DataSetObserver; import android.os.Bundle; import android.util.Log; impor…

android 添加一维数组,Android:打造“万能”Adapter与ViewHolder

写在前面 最近一直忙着各种结课大作业&#xff0c;重新看起Android还有种亲切感。前段时间写项目的时候&#xff0c;学习了一个万能Adapter与ViewHolder的写法。说是“万能”其实就是在各种情况下都能通用。 我们知道&#xff0c;在写项目的时候&#xff0c;项目中肯定有很多的…

RecyclerView中ViewHolder重用机制理解,解决网络图片错乱和闪烁问题

&#x1f5a5; 原文转载自&#xff1a; https://blog.csdn.net/xyq046463/article/details/51800095作者&#xff1a;lanceJin. https://www.jianshu.com/p/ef7d0e16d999部分来自作者内容补充 文章目录 1. 概述2. 验证item的变化过程3. 异步网络导致ViewHolder出现图片错乱的原…

CCF CSP认证成绩代替考研复试机试!

最近整理考研资料&#xff0c;慢慢了解到CSP在考研方面还是挺有用的&#xff0c;算是给自己多了些机会。 已参加认证的高校对CSP认证成绩给予高度认可&#xff0c;部分知名院校通过不同方式对CSP认证成绩给予认可&#xff0c;其中包括&#xff1a; &#xff08;1&#xff09;…