用JAVA语言编写诈金花程序代码

来源:互联网 发布:达州市行知中学 编辑:程序博客网 时间:2024/06/07 03:34
package com;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;


/**
 * 玩家基本信息类
 * @author lzq31
 *
 */
public class Player {
/**
* 定义一个玩家信息数据库
*/
public static Map<String, Player> PLAYERS = new HashMap<String, Player>();
static {
for (int i = 0; i < 20; i++) {
int num = i + 1;
String numCode = num < 10 ? "0" + num : num + "";
String playerName = "PLAYER" + numCode;
PLAYERS.put(playerName, new Player(playerName));
}
}

private String playerName; // 玩家的账号
private int score; // 玩家的积分
private List<String> gameLogs = new ArrayList<String>(); // 玩家的游戏日志
public String getPlayerName() {
return playerName;
}
public void setPlayerName(String playerName) {
this.playerName = playerName;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
public List<String> getGameLogs() {
return gameLogs;
}
public void setGameLogs(List<String> gameLogs) {
this.gameLogs = gameLogs;
}

public Player() {
super();
}

/**
* 根据账号名生成一个玩家对象
* @param playerName
*/
public Player(String playerName) {
super();
this.playerName = playerName;
}

@Override
public String toString() {
return this.playerName;
}

// shift + alt + s 唤醒Source菜单
// ctrl + shift + o 全部引入需要导出的包

public static void main(String[] args) {
// 获取Map中的KeySet对象
Set<String> keySet = Player.PLAYERS.keySet();
// 创建KeySet的迭代器
Iterator<String> it = keySet.iterator();
// 通过迭代器循环KeySet
while (it.hasNext()) {
// 获取Key值
String key = it.next();
// 通过Map.get(key)方法获取对象key的value值
Player value = Player.PLAYERS.get(key);
// 打印输出对象,默认会调用对象的toString()方法
System.out.println(value);
}
}

}




package com;
/**
 * 游戏全局接口
 * @author lzq31
 *
 */
public interface Game {
String PLATFORM_NAME = "青鸟游戏大厅";
String PLATFORM_VERSION = "1.0.1";
String FGF_NAME = "炸金花";
}




package com.card;


/**
 * 所有牌的父类
 * @author lzq31
 *
 */
public class Card {
private String cardName;


public String getCardName() {
return cardName;
}


public void setCardName(String cardName) {
this.cardName = cardName;
}


}





package com.card;


/**
 * 牌类游戏的规则接口
 * @author lzq31
 *
 */
public interface CardGameRuleService {
/**
* 双方手牌的大小比较方法
* @return
*/
int rule(CardHand cardHand1, CardHand cardHand2);
}




package com.card;


import java.util.ArrayList;
import java.util.List;


/**
 * 牌类游戏的超级父类
 * @author lzq31
 *
 */
public abstract class CardGameService {

/**
* 一副牌
*/
public List<Card> cards;

/**
* 所有玩家的手牌集合
*/
public List<CardHand> playersCards;

/**
* 游戏名称
*/
private String gameName;
/**
* 玩家数量
*/
private int playerNums;
/**
* 房间号
*/
private String roomCode;
/**
* 当前房间的游戏回合
*/
private int round;

/**
* 洗牌方法
*/
public void shuffle() {
// 把当前轮次+1
setRound(getRound() + 1);
// 初始化牌
cards = new ArrayList<Card>();
// 初始化玩家牌
playersCards = new ArrayList<CardHand>();
}

/**
* 发牌方法
*/
public abstract void deal();

/**
* 关闭牌局方法
*/
public abstract void close();

/**************************** Getters and Setters**************************************/


public List<Card> getCards() {
return cards;
}


public void setCards(List<Card> cards) {
this.cards = cards;
}


public List<CardHand> getPlayersCards() {
return playersCards;
}


public void setPlayersCards(List<CardHand> playersCards) {
this.playersCards = playersCards;
}


public String getGameName() {
return gameName;
}


public void setGameName(String gameName) {
this.gameName = gameName;
}


public int getPlayerNums() {
return playerNums;
}


public void setPlayerNums(int playerNums) {
this.playerNums = playerNums;
}


public String getRoomCode() {
return roomCode;
}


public void setRoomCode(String roomCode) {
this.roomCode = roomCode;
}


public int getRound() {
return round;
}


public void setRound(int round) {
this.round = round;
}

}





package com.card;


/**
 * 牌类游戏的手牌超级父接口,只实现需要完成比较的接口定义
 * @author lzq31
 *
 */
public interface CardHand extends Comparable<CardHand>{


}





package com.card;


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 * 定义扑克牌类 要实现Comparable接口,让扑克牌具备可比的规则功能
 * 
 * @author lzq31
 *
 */
public class Poker extends Card implements Comparable<Poker> {


// Ctrl + shift + F
public static String[] TYPES = { "♦", "♣", "♥", "♠" }; // 所有花se数组
public static String[] POINTS = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A" }; // 所有点数数组


public static Map<String, Integer> TYPES_VALUES = new HashMap<String, Integer>(); // 花se权值
public static Map<String, Integer> POINTS_VALUES = new HashMap<String, Integer>(); // 点数权值


static {
TYPES_VALUES.put("♦", 1);


TYPES_VALUES.put("♣", 2);
TYPES_VALUES.put("♥", 3);
TYPES_VALUES.put("♠", 4);


POINTS_VALUES.put("2", 1);
POINTS_VALUES.put("3", 2);
POINTS_VALUES.put("4", 3);
POINTS_VALUES.put("5", 4);
POINTS_VALUES.put("6", 5);
POINTS_VALUES.put("7", 6);
POINTS_VALUES.put("8", 7);
POINTS_VALUES.put("9", 8);
POINTS_VALUES.put("10", 9);
POINTS_VALUES.put("J", 10);
POINTS_VALUES.put("Q", 11);
POINTS_VALUES.put("K", 12);
POINTS_VALUES.put("A", 13);


}


/**
* 花色
*/
private String type;
/**
* 牌点
*/
private String point;


/**
* ♠10

* @param tp
*/
public Poker(String tp) {
this.type = tp.substring(0, 1); // 给花se赋值
this.point = tp.substring(1); // 给点数赋值
}


/**
* 获取花色权值

* @return
*/
public int getTypeValue() {
return TYPES_VALUES.get(this.type);
}


/**
* 获取点数权值

* @return
*/
public int getPointValue() {
return POINTS_VALUES.get(this.point);
}


@Override
public String toString() {
String rs = this.getType() + this.getPoint();
if (rs.length() == 2) rs = rs + " ";
return rs;
}


@Override
public int compareTo(Poker o) {
// 先比点数,点数权值大则,小则小,相同点数,比花se权值
if (o.getPointValue() > this.getPointValue())
return -1;
if (o.getPointValue() < this.getPointValue())
return 1;


if (o.getTypeValue() > this.getTypeValue())
return -1;
if (o.getTypeValue() < this.getTypeValue())
return 1;


return 0;
}


/****************************
* * Getters and Setters
**************************************/
public String getType() {
return type;
}


public void setType(String type) {
this.type = type;
}


public String getPoint() {
return point;
}


public void setPoint(String point) {
this.point = point;
}


public static void main(String[] args) {
List<Poker> ps = new ArrayList<Poker>();

for (int i = 0; i < 20; i++) {
int j = (int) (Math.random() * 4);
int k = (int) (Math.random() * 13);
String tp = TYPES[j] + POINTS[k];
ps.add(new Poker(tp));
}
Collections.sort(ps);
for (Poker p : ps) {
System.out.println(p);
}


}


}






package com.card.fgf;


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


import com.Player;
import com.card.CardHand;
import com.card.Poker;


/**
 * 炸金花手牌信息类
 * 
 * @author lzq31
 *
 */
public class FgfCardHand implements CardHand {


public static Map<Integer, String> HAND_TYPES = new HashMap<Integer, String>();
/**
* 单散牌
*/
public static int HAND_TYPE_VALUE_DSP = 1;
/**
* 对子牌
*/
public static int HAND_TYPE_VALUE_DZP = 2;
/**
* 乱顺牌
*/
public static int HAND_TYPE_VALUE_LSP = 3;
/**
* 乱金牌
*/
public static int HAND_TYPE_VALUE_LJP = 4;
/**
* 顺金牌
*/
public static int HAND_TYPE_VALUE_SJP = 5;
/**
* 豹子牌
*/
public static int HAND_TYPE_VALUE_BZP = 6;


static {
HAND_TYPES.put(1, "单散牌");
HAND_TYPES.put(2, "对子牌");
HAND_TYPES.put(3, "乱顺牌");
HAND_TYPES.put(4, "乱金牌");
HAND_TYPES.put(5, "顺金牌");
HAND_TYPES.put(6, "豹子牌");
}


private String playerName; // 玩家账号
private Poker poker1;
private Poker poker2;
private Poker poker3;
// 通过在构造器中调用getCardsTypeFun赋值,暴露getCardsType,删除setCardsType
private int cardsType; // 牌型 比如豹子、金花等等


// 构造器:将三种随机发的牌进行排序后赋给当前类的三个牌实例变量
public FgfCardHand(String playerName, Poker poker1, Poker poker2, Poker poker3) {
super();
this.playerName = playerName;


List<Poker> pokers = new ArrayList<Poker>();
pokers.add(poker1);
pokers.add(poker2);
pokers.add(poker3);
Collections.sort(pokers);


this.poker1 = pokers.get(0);
this.poker2 = pokers.get(1);
this.poker3 = pokers.get(2);


this.cardsType = getCardsTypeFun();
}


/**
* 获取当前对象牌型的方法

* @return
*/
public int getCardsTypeFun() {
// 1:单张牌 2:对子牌3:乱顺牌4:乱金牌5:顺金牌6:豹子牌
// 判断是否是豹子牌型
if (this.poker1.getPointValue() == this.poker2.getPointValue()
&& this.poker2.getPointValue() == this.poker3.getPointValue()) {


return HAND_TYPE_VALUE_BZP;
}
// 判断是否是金牌
if (this.poker1.getTypeValue() == this.poker2.getTypeValue()
&& this.poker2.getTypeValue() == this.poker3.getTypeValue()) {
// 是否是顺金
if (this.poker3.getPointValue() - this.poker2.getPointValue() == 1
&& this.poker2.getPointValue() - this.poker1.getPointValue() == 1) {
return HAND_TYPE_VALUE_SJP;
}
// 乱金牌
else {
return HAND_TYPE_VALUE_LJP;
}
} else {
// 是否是乱顺牌
if (this.poker3.getPointValue() - this.poker2.getPointValue() == 1
&& this.poker2.getPointValue() - this.poker1.getPointValue() == 1) {
return HAND_TYPE_VALUE_LSP;
} else {
// 是否是对子牌
if (this.poker1.getPointValue() == this.poker2.getPointValue()
|| this.poker2.getPointValue() == this.poker3.getPointValue()
|| this.poker1.getPointValue() == this.poker3.getPointValue()) {
return HAND_TYPE_VALUE_DZP;
}
// 其他的都是单张牌
else {
return HAND_TYPE_VALUE_DSP;
}
}
}
}


@Override
public String toString() {

int score = Player.PLAYERS.get(this.playerName).getScore();

return this.playerName + " " + HAND_TYPES.get(this.cardsType) + "[" + this.poker1 + ", " + this.poker2 + ", "
+ this.poker3 + "]\t当前积分:" + score ;
}


@Override
public int compareTo(CardHand o) {
FgfCardHand cardHand = (FgfCardHand) o;
return FgfGameRuleService.getInstance().rule(cardHand, this);
}

public String getPlayerName() {
return playerName;
}


public void setPlayerName(String playerName) {
this.playerName = playerName;
}


public Poker getPoker1() {
return poker1;
}


public void setPoker1(Poker poker1) {
this.poker1 = poker1;
}


public Poker getPoker2() {
return poker2;
}


public void setPoker2(Poker poker2) {
this.poker2 = poker2;
}


public Poker getPoker3() {
return poker3;
}


public void setPoker3(Poker poker3) {
this.poker3 = poker3;
}


public int getCardsType() {
return cardsType;
}

public static void main(String[] args) {

List<FgfCardHand> list = new ArrayList<FgfCardHand>();

for (int i = 0; i < 10; i++) {
String playerName = "PLAYER" + i;

int j = (int) (Math.random() * 4);
int k = (int) (Math.random() * 13);
String tp = Poker.TYPES[j] + Poker.POINTS[k];
Poker poker1 = new Poker(tp);

j = (int) (Math.random() * 4);
k = (int) (Math.random() * 13);
tp = Poker.TYPES[j] + Poker.POINTS[k];
Poker poker2 = new Poker(tp);

j = (int) (Math.random() * 4);
k = (int) (Math.random() * 13);
tp = Poker.TYPES[j] + Poker.POINTS[k];
Poker poker3 = new Poker(tp);

FgfCardHand cardHand = new FgfCardHand(playerName, poker1, poker2, poker3);
list.add(cardHand);

}

Collections.sort(list);

for (FgfCardHand ch : list) {
System.out.println(ch);
}
}


}






package com.card.fgf;


import com.card.CardGameRuleService;
import com.card.CardHand;


/**
 * 炸金花规则服务
 * @author lzq31
 *
 */
public class FgfGameRuleService implements CardGameRuleService {

// 定义一个单态的服务对象
private static FgfGameRuleService instance = new FgfGameRuleService();

private FgfGameRuleService(){}

public static FgfGameRuleService getInstance() {
return instance;
}


@Override
public int rule(CardHand cardHand1, CardHand cardHand2) {
FgfCardHand fgf1 = (FgfCardHand) cardHand1;
FgfCardHand fgf2 = (FgfCardHand) cardHand2;

// 首先判断牌型
if (fgf1.getCardsType() > fgf2.getCardsType()) return 1;
if (fgf1.getCardsType() < fgf2.getCardsType()) return -1;

// 如果牌型相同

// 比较豹子牌:只要看任意一张牌的点数就可以
if (fgf1.getCardsType() == FgfCardHand.HAND_TYPE_VALUE_BZP) {
if (fgf1.getPoker1().getPointValue() > fgf2.getPoker1().getPointValue()) return 1;
if (fgf1.getPoker1().getPointValue() < fgf2.getPoker1().getPointValue()) return -1;
}

// 比较顺金牌:比较最大的那种牌的点数
if (fgf1.getCardsType() == FgfCardHand.HAND_TYPE_VALUE_SJP) {
if (fgf1.getPoker3().getPointValue() > fgf2.getPoker3().getPointValue()) return 1;
if (fgf1.getPoker3().getPointValue() < fgf2.getPoker3().getPointValue()) return -1;
}

// 比较乱金牌:从3-1分别比较
if (fgf1.getCardsType() == FgfCardHand.HAND_TYPE_VALUE_LJP) {
if (fgf1.getPoker3().getPointValue() > fgf2.getPoker3().getPointValue()) return 1;
if (fgf1.getPoker3().getPointValue() < fgf2.getPoker3().getPointValue()) return -1;

if (fgf1.getPoker2().getPointValue() > fgf2.getPoker2().getPointValue()) return 1;
if (fgf1.getPoker2().getPointValue() < fgf2.getPoker2().getPointValue()) return -1;

if (fgf1.getPoker1().getPointValue() > fgf2.getPoker1().getPointValue()) return 1;
if (fgf1.getPoker1().getPointValue() < fgf2.getPoker1().getPointValue()) return -1;
}

// 比较乱顺牌:比较最大的那种牌的点数
if (fgf1.getCardsType() == FgfCardHand.HAND_TYPE_VALUE_LSP) {
if (fgf1.getPoker3().getPointValue() > fgf2.getPoker3().getPointValue()) return 1;
if (fgf1.getPoker3().getPointValue() < fgf2.getPoker3().getPointValue()) return -1;
}

// 比较对子牌:获得对子的牌点,然后如果对子牌点一样,要比较单张牌点
if (fgf1.getCardsType() == FgfCardHand.HAND_TYPE_VALUE_DZP) {
if (fgf1.getPoker2().getPointValue() > fgf2.getPoker2().getPointValue()) return 1;
if (fgf1.getPoker2().getPointValue() < fgf2.getPoker2().getPointValue()) return -1;
int fgf1Dp = 0;
int fgf2Dp = 0;

if (fgf1.getPoker1().getPointValue() == fgf1.getPoker2().getPointValue()) {
fgf1Dp = fgf1.getPoker3().getPointValue();
} else {
fgf1Dp = fgf1.getPoker1().getPointValue();
}

if (fgf2.getPoker1().getPointValue() == fgf2.getPoker2().getPointValue()) {
fgf2Dp = fgf2.getPoker3().getPointValue();
} else {
fgf2Dp = fgf2.getPoker1().getPointValue();
}

if (fgf1Dp > fgf2Dp) return 1;
if (fgf1Dp < fgf2Dp) return -1;
}

// 比较单顺牌:从3-1分别比较
if (fgf1.getCardsType() == FgfCardHand.HAND_TYPE_VALUE_DSP) {
if (fgf1.getPoker3().getPointValue() > fgf2.getPoker3().getPointValue()) return 1;
if (fgf1.getPoker3().getPointValue() < fgf2.getPoker3().getPointValue()) return -1;

if (fgf1.getPoker2().getPointValue() > fgf2.getPoker2().getPointValue()) return 1;
if (fgf1.getPoker2().getPointValue() < fgf2.getPoker2().getPointValue()) return -1;

if (fgf1.getPoker1().getPointValue() > fgf2.getPoker1().getPointValue()) return 1;
if (fgf1.getPoker1().getPointValue() < fgf2.getPoker1().getPointValue()) return -1;
}

return 0;
}


}





package com.card.fgf;


import java.util.Collections;


import com.Game;
import com.Player;
import com.card.CardGameService;
import com.card.CardHand;
import com.card.Poker;


public class FgfGameService extends CardGameService implements Game {


public FgfGameService(int playerNums) {
// 定义房间的名称
String roomCode = "FGF" + System.currentTimeMillis();
this.setRoomCode(roomCode);
this.setPlayerNums(playerNums);
System.out.println("===========" + PLATFORM_NAME + "(" + PLATFORM_VERSION + ")" + "-" + FGF_NAME + "=========");
System.out.println("房间号:" + this.getRoomCode() + " 玩家数量:" + this.getPlayerNums());
}


@Override
public void shuffle() {
super.shuffle();
System.out.println("\n\n" + "============轮次(" + this.getRound() + ") 洗牌中==========");
// 装牌
for (String type : Poker.TYPES) {
for (String point : Poker.POINTS) {
String tp = type + point;
Poker poker = new Poker(tp);
cards.add(poker);
}
}
// 洗牌
Collections.shuffle(cards);
}


@Override
public void deal() {
int k = 0;
for (int i = 1; i <= this.getPlayerNums(); i++) {
String pn = i < 10 ? "0" + i : i + "";
String playerName = "PLAYER" + pn;
Poker poker1 = null;
Poker poker2 = null;
Poker poker3 = null;


for (int j = 0; j < 3; j++) {
if (j == 0) {
poker1 = (Poker) this.cards.get(k);
}
if (j == 1) {
poker2 = (Poker) this.cards.get(k);
}
if (j == 2) {
poker3 = (Poker) this.cards.get(k);
}
k++;
}


FgfCardHand cardHand = new FgfCardHand(playerName, poker1, poker2, poker3);
playersCards.add(cardHand);
}


// 打印玩家手牌信息
for (CardHand hand : playersCards) {
FgfCardHand fgfHand = (FgfCardHand) hand;
System.out.println(fgfHand);
}
}


@Override
public void close() {
System.out.println("\n\n" + "============轮次(" + this.getRound() + ") 结算==========");
Collections.sort(this.playersCards);
// 打印结算完成后的玩家手牌信息
int i = 0;
for (CardHand hand : playersCards) {
FgfCardHand fgfHand = (FgfCardHand) hand;

int score = playersCards.size() - i++;

// 取出当前账号的积分
int currentScore = Player.PLAYERS.get(fgfHand.getPlayerName()).getScore();
currentScore += score;
Player.PLAYERS.get(fgfHand.getPlayerName()).setScore(currentScore);

System.out.println(fgfHand);
}


}


}




package com.card.client;


import com.card.fgf.FgfGameService;


public class Client {
public static void main(String[] args) {
FgfGameService gfgService = new FgfGameService(5);

for (int i = 1; i <= 4; i++) {
// 洗牌
gfgService.shuffle();
// 发牌
gfgService.deal();
// 结算
gfgService.close();
}

}
}



原创粉丝点击