基于Java实现炸金花扑克游戏

您所在的位置:网站首页 a44扑克牌 基于Java实现炸金花扑克游戏

基于Java实现炸金花扑克游戏

2023-12-18 07:08| 来源: 网络整理| 查看: 265

炸金花的牌型有6种,从大到小依次为:

1.豹子。也就是三张完全一样的牌,其中三个A是最大的,三个2是最小的。

2.同花顺。指的是三张牌,上面的点数是连续排列的,而且花色相同。最大的牌型是AKQ,最小的牌型是A23.

3.同花。指的是三张牌,花色完全相同。其中牌型最大的是AKQ,最小的是352。

4.顺子。指的是三张牌牌面上的点数是连续的,但是花色不同。其中AKQ最大,A23最小。

5.对子。指的是三张牌中有两张牌是一对,也就是点数相同。盘面最大的是AAK,最小的是223。

6.单张牌。出现单张牌的情况下,最大的牌是AKJ,最小的是352。

了解炸金花的牌型后,我们先创建扑克牌Card.java,代码如下:

//扑克牌 public class Card { private int color; private int number; public Card() { } public Card(int color, int number) { this.color = color; this.number = number; } public int getColor() { return color; } public void setColor(int color) { this.color = color; } public int getNumber() { return number; } public void setNumber(int number) { this.number = number; } @Override public String toString() { return this.colorToString(this.color) + this.numberToString(this.number); } //对花色进行字符化,黑桃最大,方块最小, private String colorToString(int i){ String flower = null; switch (i){ case 1: flower = "方块"; break; case 2: flower = "梅花"; break; case 3: flower = "红心"; break; case 4: flower = "黑桃"; break; } return flower; } //对扑克牌的JQKA进行字符化,A为14,K为13,Q为12,J为11 private String numberToString(int i){ String num = null; switch (i){ case 11: num = "J"; break; case 12: num = "Q"; break; case 13: num = "K"; break; case 14: num = "A"; break; default: if (i >= 2 && i 0){ int r = random.nextInt(list.size()); //生成正整型的随机数 Card card = list.remove(r); //返回list中,随机数位置的元素并且移除对应位置的元素 slist.add(card); } return slist; }

洗完牌后,对牌进行排序,代码如下:

//对手牌进行排序 public List playListSort(List playList){ playList.sort(new Comparator() { @Override public int compare(Card c1, Card c2) { return c1.getNumber() - c2.getNumber(); } }); return playList; }

接下来就要对牌型进行判断,判断牌型是否为豹子,代码如下:

//判断牌型是否为豹子(三张牌的数字都是一致的) public boolean isTheSameNumber(List playList){ if (playList != null && playList.size() == 3){ if (playList.get(0).getNumber() == playList.get(1).getNumber() && playList.get(1).getNumber() == playList.get(2).getNumber()){ return true; }else{ return false; } }else { System.err.println("手牌不符合规则"); throw new RuntimeException("手牌不符合规则"); } }

判断牌型是否为同花,代码如下:

//判断牌型是否为同花(三张牌的牌色都是一致的) public boolean isFlushColor(List playList) { if (playList != null && playList.size() == 3){ if (playList.get(0).getColor() == playList.get(1).getColor() && playList.get(1).getColor() == playList.get(2).getColor()){ return true; }else{ return false; } }else { System.err.println("手牌不符合规则"); throw new RuntimeException("手牌不符合规则"); } }

判断牌型是否为顺子,代码如下:

//判断牌型是否为顺子(三张牌的数字是连续的) (2 3 A)也为顺子 public boolean isStraight(List playList) { if (playList != null && playList.size() == 3){ if ((playList.get(0).getNumber() + 1 == playList.get(1).getNumber() && playList.get(1).getNumber() + 1 == playList.get(2).getNumber()) || (playList.get(2).getNumber() == 14 && playList.get(0).getNumber() == 2 && playList.get(1).getNumber() == 3)){ return true; }else{ return false; } }else { System.err.println("手牌不符合规则"); throw new RuntimeException("手牌不符合规则"); } }

判断是否为对子,代码如下:

//判断牌型是否为对子(三张牌中有两张牌为相同) public boolean isPair(List playList){ if (playList != null && playList.size() == 3){ if (playList.get(0).getNumber() == playList.get(1).getNumber() && playList.get(1).getNumber() == playList.get(2).getNumber()){ return false; }else { if (playList.get(0).getNumber() == playList.get(1).getNumber() || playList.get(1).getNumber() == playList.get(2).getNumber()){ return true; } return false; } } else { System.err.println("手牌不符合规则"); throw new RuntimeException("手牌不符合规则"); } }

紧接着创建玩家类Player.java,代码如下:

import java.util.*; //玩家 public class Player { private String name; //玩家姓名 private List handCards; //玩家手牌 private int grade; //牌型等级 public Player() { } public Player(String name, List handCards, int grade) { this.name = name; this.handCards = handCards; this.grade = grade; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List getHandCards() { return handCards; } public void setHandCards(List handCards) { this.handCards = handCards; } public int getGrade() { return grade; } public void setGrade(int grade) { this.grade = grade; } @Override public String toString() { String h = ""; for (int i = 0; i < this.handCards.size(); i++) { h += this.handCards.get(i).toString(); } return this.name + ":" + h; } }

紧接着来编写扑克牌游戏类PokerGame.java,代码如下:

import java.util.*; public class PokerGame { private Player p1; //玩家1 private Player p2; //玩家2 public void startPlayingCards(){ //开始游戏 p1 = new Player(); //创建玩家 p1.setName("Liu"); p2 = new Player(); //创建玩家 p2.setName("Li"); Cards cards = new Cards(); //创建扑克牌 List list = cards.initCards(); List slist = cards.shuffle(list); //洗牌 List playlist1 = new ArrayList(); //发牌 for (int i = 0; i < 3; i++) { Card card = slist.remove(0); playlist1.add(card); p1.setHandCards(playlist1); } List playlist2 = new ArrayList(); //发牌 for (int i = 0; i < 3; i++) { Card card = slist.remove(0); playlist2.add(card); p2.setHandCards(playlist2); } List card1 = cards.playListSort(p1.getHandCards()); //手牌排序 p1.setHandCards(card1); List card2 = cards.playListSort(p2.getHandCards()); //手牌排序 p2.setHandCards(card2); } //查看玩家手中的牌 public void showPlayer(){ String cardType1 = this.getCardType(p1); String cardType2 = this.getCardType(p2); System.out.println(p1.toString() + " 牌型为:" + cardType1); System.out.println(p2.toString() + " 牌型为:" + cardType2); } //判断手中牌型 private String getCardType(Player p){ List cardList = p .getHandCards(); Cards cards = new Cards(); String cardType = "单张"; if (cards.isTheSameNumber(cardList)){ cardType = "豹子"; p.setGrade(6); return cardType; } if (cards.isFlushColor(cardList)){ if (cards.isStraight(cardList)){ cardType = "同花顺"; p.setGrade(5); return cardType; }else { cardType = "同花"; p.setGrade(4); return cardType; } }else { if (cards.isStraight(cardList)){ cardType = "顺子"; p.setGrade(3); return cardType; } } if (cards.isPair(cardList)){ cardType = "对子"; p.setGrade(2); return cardType; } p.setGrade(1); return cardType; } //判断手牌大小 public Player getWinner(){ int grade1 = p1.getGrade(); int grade2 = p2.getGrade(); Player winner = grade1 > grade2 ? p1 : p2; if (grade1 != grade2){ return grade1 > grade2 ? p1 : p2; } switch (grade1){ case 6: //豹子 winner = p1.getHandCards().get(0).getNumber() > p2.getHandCards().get(0).getNumber() ? p1 : p2; break; case 5: //同花顺 case 3: //顺子 winner = p1.getHandCards().get(0).getNumber() > p2.getHandCards().get(0).getNumber() ? p1 : p2; break; case 4: //同花 case 1: //单张 if (p1.getHandCards().get(2).getNumber() > p2.getHandCards().get(2).getNumber()){ winner = p1; }else if (p1.getHandCards().get(2).getNumber() == p2.getHandCards().get(2).getNumber()){ if (p1.getHandCards().get(1).getNumber() > p2.getHandCards().get(1).getNumber()){ winner = p1; }else if (p1.getHandCards().get(1).getNumber() == p2.getHandCards().get(1).getNumber()){ if (p1.getHandCards().get(0).getNumber() > p2.getHandCards().get(0).getNumber()){ winner = p1; }else if (p1.getHandCards().get(0).getNumber() == p2.getHandCards().get(0).getNumber()){ winner = p2; }else {winner = p2;} }else {winner = p2;} }else {winner = p2;} break; case 2: //对子 winner = p1.getHandCards().get(1).getNumber() > p2.getHandCards().get(1).getNumber() ? p1 : p2; break; } return winner; } }

最后编写Test.java,代码如下:

public class Test { public static void main(String[] args) { PokerGame pokerGame = new PokerGame(); pokerGame.startPlayingCards(); pokerGame.showPlayer(); Player winner = pokerGame.getWinner(); System.out.println("获胜者为:"+ winner.getName()); } }

效果图,如下

编写该实例,可以能够更好的学习到面向对象属性封装、对象数组创建、对象数组排序、对象根据属性大小比较等功能,能够更好的提升语法熟练度,以及思维能力。

源码:https://github.com/shijian08/FriedGoldenFlower



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3