看过我前面博文的朋友都知道,以前我从事过游戏服务器的开发,但是当时用的是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是红桃,一开始定义牌就定义花色优先级为:黑桃>红桃>方块>梅花
暂时只判断了普通牛(牛一到牛牛),后面会陆续更新。未完待续…