看过我前面博文的朋友都知道,以前我从事过游戏服务器的开发,但是当时用的是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是红桃,一开始定义牌就定义花色优先级为:黑桃>红桃>方块>梅花

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

Java实现牛牛算法详解相关推荐

  1. Java垃圾回收算法详解

    1 概述 在前一篇文章中讲到了Java虚拟机的基础知识和运行时数据区的划分,在运行时数据区的划分中,可分为线程共享区域和线程私有区域,而Java的垃圾回收就发生在线程共享区域中,更直观的说法就是Jav ...

  2. Java快排算法详解

    快排算法底层基本思想: 先取出数列中的第一个数作为基准数. 将数列中比基准数大的数全部放在他的右边,比基准数小的数全部放在它的左边. 然后在对左右两部分重复第二步,直到各个区间只有一个数. 具体Jav ...

  3. des算法s盒java实现_DES算法详解

    本文主要介绍了DES算法的步骤,包括IP置换.密钥置换.E扩展置换.S盒代替.P盒置换和末置换. 1.DES算法简介 DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准. DES是一个分组 ...

  4. Java的快速排序算法详解

    在进入这个话题之前大家可以想想,如果给你一个无序数组,要你处理成一个有序数组,你会怎么做? 可能是双循环的冒泡排序,可能拆开成多个子集合的再合并的希尔排序,排序算法很多,而现在要介绍的是另一种排序方法 ...

  5. java break 在if 中使用_java中使用国密SM4算法详解

    前言 上次总结了一下加密算法的分类(加密算法有集中形式,各有什么不同?),现在我们用java语言实现一下SM4:无线局域网标准的分组数据算法.对称加密,密钥长度和分组长度均为128位. ps:我们既可 ...

  6. 7大排序算法详解+java实现

    目录 0 概述 1 冒泡排序 2 选择排序 3 插入排序 4 希尔排序 5 快速排序 6 归并排序 7 基数排序 下载地址 7大排序算法详解文档及java代码实现(可直接运行)下载地址:https:/ ...

  7. java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解

    文章目录 前言 一.直接上代码 1. 写字方法 2. 换行算法 二. 叙述换行算法 前言 代码都上传到GitHub了,这里仅仅是贴出来主要部分,GitHub传送门:https://github.com ...

  8. AC自动机算法详解以及Java代码实现

    详细介绍了AC自动机算法详解以及Java代码实现. 文章目录 1 概念和原理 2 节点定义 3 构建Trie前缀树 3.1 案例演示 4 构建fail失配指针 4.1 案例演示 5 匹配文本 5.1 ...

  9. 操作系统之银行家算法—详解流程及案例数据

    操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...

  10. JVM之垃圾收集机制四种GC算法详解

    JVM之四种GC算法详解 目录: 什么是GC? GC算法之引用计数法 GC算法之复制算法(Copying) GC算法之标记清除(Mark-Sweep) GC算法之标记压缩(Mark-Compact) ...

最新文章

  1. 使用VC++ 显示一首诗歌
  2. Linux环境编程 哈希链表结构 hlist 介绍与用例
  3. rejection from Cambridge Machine Learning and Machine Intelligence MPhil
  4. NFS文件锁一致性设计原理解析
  5. 二层和三层工业交换机的主要参数说明
  6. Navicat premium查看数据库表中文注释的两种方式
  7. jQuery菜鸟总结
  8. VGGNet论文翻译-Very Deep Convolutional Networks for Large-Scale Image Recognition
  9. python采集代理ip_Python采集代理ip并判断是否可用和定时更新的方法
  10. 2017-2018-1 20155327 《信息安全系统设计基础》第十三周学习总结
  11. Linux之file命令
  12. linux 批量更改三四级目录 扩展名,Linux批量更改文件后缀名
  13. 中小学教师资格证报名入口 出现请添加兼容性站点怎么办?
  14. 我知我见:ftp共享
  15. ios点击推送闪退_iOS 13.4 Beta 4 发布,闪退问题修复!
  16. 如何区分电梯卡为id卡ic卡_电梯ic卡系统与ID卡系统有什么区别
  17. 在线网校教育平台的开发,题库的搭建必不可少
  18. BUCT-2021年ACM竞赛班训练(一)2021.3.25-问题 A: 大佬的高级IDLE-题解
  19. 粒子群算法(PSO)的Python实现(求解多元函数的极值)
  20. vue循环渲染不同图片

热门文章

  1. 计算机英语作业答案,大工20春《专业英语(计算机英语)》在线作业1题目【标准答案】...
  2. Maven项目创建 Could not create local repository at 双重目录(F:/XX/F:/BB)怪异现象
  3. ts(typescript)面向对象之类的继承
  4. 点云最小二乘法拟合空间直线
  5. 婴儿级教学,手伤害教你用鸿蒙OS获取B站粉丝数!!
  6. 华为丁耘突发疾病去世
  7. C语言中TC20是什么意思,c语言tc20下载
  8. SAP中部分凭证状态导致的审计序时账和科目余额不平——会计凭证中的注释项目
  9. linux cd系统下载地址,Mandriva 2008.0 正式版 CD、DVD HTTP下载地址
  10. Android多媒体开发框架