Parcourir la source

增加进还贡

johnclot69 il y a 3 mois
Parent
commit
f5ebdadcc4

+ 4 - 0
incubator-game/src/main/java/com/incubator/game/data/po/RoomPO.java

@@ -2,6 +2,7 @@ package com.incubator.game.data.po;
 
 import com.incubator.game.player.Player;
 import com.incubator.game.util.JDGDUtils;
+import com.incubator.game.util.Struct;
 
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -52,6 +53,8 @@ public class RoomPO {
 	public Player jieFengPlayer = null;
 	/** 结算列表[key:1-4游, value:玩家] **/
 	public Map<Integer, Player> result = new HashMap<>();
+	/** 进还贡数据 **/
+	public Struct.TributeData tributeData = new Struct.TributeData();
 
 	public RoomPO() {}
 
@@ -72,5 +75,6 @@ public class RoomPO {
 		this.passList = new ArrayList<>();
 		this.jieFengPlayer = null;
 		this.result = new HashMap<>();
+		this.tributeData = new Struct.TributeData();
 	}
 }

+ 164 - 85
incubator-game/src/main/java/com/incubator/game/room/JDGDRoom.java

@@ -10,6 +10,7 @@ import com.incubator.game.util.JDGDUtils;
 import com.incubator.game.util.ProtoUtil;
 import com.incubator.game.util.Struct;
 import com.incubator.message.proto.CommonProto;
+import org.apache.commons.lang3.StringUtils;
 
 import java.util.*;
 
@@ -120,9 +121,6 @@ public class JDGDRoom extends Room implements GRoomInterface {
                         //开始
                         if (this.time >= 3) {
                             this.doStart();
-                            this.state = 2;
-                            this.flag = false;
-                            this.time = 0;
                             Log.debug("检测: 房间号:{}, 房间人数:{}, 当前局数:{}, 状态:开局...VS动画...", this.roomId, this.data.playerMap.size(), this.data.curRound);
                         }
                     }
@@ -229,7 +227,7 @@ public class JDGDRoom extends Room implements GRoomInterface {
      * 给玩家发牌,每人27张
      */
     @Override
-    public void doSendCard() {
+    public synchronized void doSendCard() {
         for (Player player : this.actors.values()) {
             if (player != null) {
                 // 设置用户状态
@@ -262,20 +260,25 @@ public class JDGDRoom extends Room implements GRoomInterface {
      * 游戏开局
      */
     @Override
-    public void doStart() {
+    public synchronized void doStart() {
         this.data.curRound += 1;
         // 定庄
-        this.data.zhuangPos = 0;
+        if (this.data.curRound == 1) {
+            this.data.zhuangPos = 0;
+        }
         // 设置当前操作玩家
         this.data.currentPlayer = this.data.playerMap.get(this.data.zhuangPos);
         // 设置当前操作玩家总数量
         this.data.curOpPlayerNum = this.data.maxNum;
         // 发牌
         this.doSendCard();
+        // 进还贡数据
+        Map<String, Object> tributeInfo = this.checkTributeInfo();
         // 广播
         for (Player tmPlayer : this.data.playerMap.values()) {
             if (tmPlayer != null) {
                 Map<String, Object> data = ProtoUtil.roomToMessage(this, tmPlayer, this.data.currentPlayer);
+                data.put("tributeInfo", tributeInfo);
                 data.put("state", 2);
                 data.put("time", 20);
                 Log.debug("玩家 : {}, 手牌 : {}", tmPlayer.data.name,
@@ -283,6 +286,17 @@ public class JDGDRoom extends Room implements GRoomInterface {
                 tmPlayer.receive(CommonProto.Cmd.GameStateChange_VALUE, data);
             }
         }
+
+        // 是否有进还贡数据
+        if (tributeInfo.isEmpty()) {
+            this.state = 2;
+            this.flag = true;
+            this.time = 0;
+        } else {
+            this.state = 2;
+            this.flag = false;
+            this.time = 0;
+        }
     }
 
     /**
@@ -290,19 +304,48 @@ public class JDGDRoom extends Room implements GRoomInterface {
      *
      * @return
      */
-    public void checkTribute() {
-        // 0.先判断人数
-        switch (this.data.maxNum) {
-            case 2:// 2人房
-                // 判断单贡
+    public Map<String, Object> checkTributeInfo() {
+        Map<String, Object> data = new HashMap<>();
 
-                break;
-            case 4:// 4人房
-                // 1.判断单贡, 13游一队,24游一队
+        // 双贡情况
+        if (!StringUtils.isEmpty(this.data.tributeData.player1)
+                && !StringUtils.isEmpty(this.data.tributeData.player2)) {
+            data.put("还贡者1", this.data.tributeData.player1);
+            data.put("还贡者2", this.data.tributeData.player2);
+            // todo 根据手牌情况确定是否抗贡
 
-                // 2.判断双贡, 12游一队,34游一队
-                break;
+
+
+            data.put("进贡者1", this.data.tributeData.player2);
+            data.put("进贡者2", this.data.tributeData.player2);
+        }
+
+        // 单贡情况
+        if (!StringUtils.isEmpty(this.data.tributeData.player1)
+                && StringUtils.isEmpty(this.data.tributeData.player2)) {
+            data.put("还贡者1", this.data.tributeData.player1);
+            // todo 根据手牌情况确定是否抗贡
+
+            data.put("进贡者1", this.data.tributeData.tributeList.get(0));
         }
+
+        // 是否抗贡
+        data.put("isTwoKing", false);
+        return data;
+    }
+
+//    private Player getMaxCardPlayer(List<String> tributeList) {
+//
+//    }
+
+    /**
+     * 判断双王
+     *
+     * @return
+     */
+    private boolean isHasTwoKing() {
+
+        return false;
     }
 
     /**
@@ -311,7 +354,7 @@ public class JDGDRoom extends Room implements GRoomInterface {
      * @return
      */
     public boolean checkTributeStart() {
-
+        Log.debug("检测进还贡是否完成...");
         return false;
     }
 
@@ -319,7 +362,7 @@ public class JDGDRoom extends Room implements GRoomInterface {
      * 强制进贡、还贡
      */
     public void doTribute() {
-
+        Log.debug("强制进贡、还贡...");
     }
 
     /**
@@ -330,6 +373,8 @@ public class JDGDRoom extends Room implements GRoomInterface {
      */
     public Integer[] getNextPos(int pos) {
         Integer[] nextpos = null;
+
+        // 2人房
         if (this.data.maxNum == 2) {
             switch (pos) {
                 case 1:
@@ -339,7 +384,10 @@ public class JDGDRoom extends Room implements GRoomInterface {
                     nextpos = new Integer[] { 1 };
                     break;
             }
-        } else if (this.data.maxNum == 4) {
+        }
+
+        // 4人房
+        if (this.data.maxNum == 4) {
             switch (pos) {
                 case 3:
                     nextpos = new Integer[] { 0, 1, 2 };
@@ -567,6 +615,11 @@ public class JDGDRoom extends Room implements GRoomInterface {
      * 升级
      */
     private synchronized void upgrade() {
+        // 清理数据
+        this.data.tributeData = null;
+
+        StringBuilder builder = new StringBuilder();
+
         // 头游
         Player player = this.data.result.get(1);
         if (player == null) {
@@ -574,75 +627,98 @@ public class JDGDRoom extends Room implements GRoomInterface {
         }
         // 原级牌点数
         int oldLevelPoint = this.data.curLevelPoint;
-        StringBuilder builder = null;
-        switch (this.data.maxNum) {
-            case 2:
-                // 2人房
-                builder = new StringBuilder();
-                Player temPlayer = this.data.result.getOrDefault(2, null);
-                if (temPlayer == null) {
-                    return;
-                }
-                builder.append("头游玩家: ").append(player.data.name)
-                        .append(" 升3级, ");
-                // 设置我方玩家级牌点数展示
-                int myIndex = Math.min(player.data.levelIndex + 3, JDGDUtils.levelPoint.length - 1);
-                player.data.levelIndex = myIndex;
-                player.data.levelPointView[0] = JDGDUtils.levelPoint[myIndex];
-                // 设置对方级牌点数展示
-                temPlayer.data.levelPointView[1] = player.data.levelPointView[0];
-                // 设置全局当前级牌点数
-                this.data.curLevelPoint = Math.max(player.data.levelPointView[0], player.data.levelPointView[1]);
-                break;
-            case 4:
-                // 4人房
-                int index = 0;
-                // 头游搭档
-                Struct.TeammateData teammateData = this.getTeammate(player.data.teammateId);
-                builder = new StringBuilder();
-                switch (teammateData.getRank()) {
-                    case 2:
-                        // 搭档2游升3级
-                        index = Math.min(player.data.levelIndex + 3, JDGDUtils.levelPoint.length - 1);
-                        builder.append("头游玩家: ").append(player.data.name)
-                                .append(", 搭档玩家: ").append(teammateData.player.data.name)
-                                .append(" 2游升3级, ");
-                        break;
-                    case 3:
-                        // 搭档3游升2级
-                        // 搭档2游升3级
-                        index = Math.min(player.data.levelIndex + 2, JDGDUtils.levelPoint.length - 1);
-                        builder.append("头游玩家: ").append(player.data.name)
-                                .append(", 搭档玩家: ").append(teammateData.player.data.name)
-                                .append(" 3游升2级, ");
-                        break;
-                    case 4:
-                        // 搭档末游升1级
-                        // 搭档2游升3级
-                        index = Math.min(player.data.levelIndex + 1, JDGDUtils.levelPoint.length - 1);
-                        builder.append("头游玩家: ").append(player.data.name)
-                                .append(", 搭档玩家: ").append(teammateData.player.data.name)
-                                .append(" 末游升1级, ");
-                        break;
-                }
+        // 进贡ids集合
+        List<String> tributeList = new ArrayList<>();
 
-                // 设置头游玩家级牌点数展示
-                player.data.levelIndex = index;
-                player.data.levelPointView[0] = JDGDUtils.levelPoint[index];
-                // 设置我方玩家级牌点数展示
-                teammateData.player.data.levelPointView[0] = JDGDUtils.levelPoint[index];
-                // 设置对方级牌点数展示
-                for (Map.Entry<Integer, Player> entry1 : this.data.result.entrySet()) {
-                    if (!entry1.getValue().getId().equals(player.getId())
-                            && !entry1.getValue().getId().equals(teammateData.player.getId())) {
-                        entry1.getValue().data.levelPointView[1] = JDGDUtils.levelPoint[index];
+        // 2人房
+        if (this.data.maxNum == 2) {
+            Player tPlayer = this.data.result.getOrDefault(2, null);
+            if (tPlayer == null) {
+                return;
+            }
+            builder.append("1游玩家: ").append(player.data.name)
+                    .append(" 升3级, ");
+            // 单贡
+            tributeList.add(tPlayer.getId());
+            this.data.tributeData = new Struct.TributeData(player.getId(), null, tributeList);
+            // 设置我方玩家级牌点数展示
+            int myIndex = Math.min(player.data.levelIndex + 3, JDGDUtils.levelPoint.length - 1);
+            player.data.levelIndex = myIndex;
+            player.data.levelPointView[0] = JDGDUtils.levelPoint[myIndex];
+            // 设置对方级牌点数展示
+            tPlayer.data.levelPointView[1] = player.data.levelPointView[0];
+            // 设置全局当前级牌点数
+            this.data.curLevelPoint = Math.max(player.data.levelPointView[0], player.data.levelPointView[1]);
+        }
+
+        // 4人房
+        if (this.data.maxNum == 4) {
+            // 级牌下标
+            int index = 0;
+            // 头游搭档数据
+            Struct.TeammateData teammateData = this.getTeammate(player.data.teammateId);
+
+            switch (teammateData.getRank()) {
+                case 2:
+                    // 搭档2游, 升3级
+                    index = Math.min(player.data.levelIndex + 3, JDGDUtils.levelPoint.length - 1);
+                    builder.append("1游玩家: ").append(player.data.name)
+                            .append(", 搭档玩家: ").append(teammateData.player.data.name)
+                            .append(" 2游, 升3级");
+                    // 进贡, 双下
+                    for (Player p : this.data.result.values()) {
+                        if (p != null && !p.getId().equals(player.getId())
+                                && !p.getId().equals(teammateData.player.getId())
+                                && !tributeList.contains(p.getId())) {
+                            tributeList.add(p.getId());
+                        }
+                    }
+                    this.data.tributeData = new Struct.TributeData(player.getId(), teammateData.player.getId(), tributeList);
+                    break;
+                case 3:
+                    // 搭档3游, 升2级
+                    index = Math.min(player.data.levelIndex + 2, JDGDUtils.levelPoint.length - 1);
+                    builder.append("1游玩家: ").append(player.data.name)
+                            .append(", 搭档玩家: ").append(teammateData.player.data.name)
+                            .append(" 3游, 升2级");
+                    // 单贡
+                    Player p4 = this.data.result.getOrDefault(4, null);
+                    if (p4 != null) {
+                        tributeList.add(p4.getId());
+                    }
+                    this.data.tributeData = new Struct.TributeData(player.getId(), null, tributeList);
+                    break;
+                case 4:
+                    // 搭档4游, 升1级
+                    index = Math.min(player.data.levelIndex + 1, JDGDUtils.levelPoint.length - 1);
+                    builder.append("1游玩家: ").append(player.data.name)
+                            .append(", 搭档玩家: ").append(teammateData.player.data.name)
+                            .append(" 4游, 升1级");
+                    // 单贡
+                    Player p3 = this.data.result.getOrDefault(3, null);
+                    if (p3 != null) {
+                        tributeList.add(p3.getId());
                     }
+                    this.data.tributeData = new Struct.TributeData(player.getId(), null, tributeList);
+                    break;
+            }
+
+            // 设置头游玩家级牌点数展示
+            player.data.levelIndex = index;
+            player.data.levelPointView[0] = JDGDUtils.levelPoint[index];
+            // 设置我方玩家级牌点数展示
+            teammateData.player.data.levelPointView[0] = JDGDUtils.levelPoint[index];
+            // 设置对方级牌点数展示
+            for (Map.Entry<Integer, Player> entry1 : this.data.result.entrySet()) {
+                if (!entry1.getValue().getId().equals(player.getId())
+                        && !entry1.getValue().getId().equals(teammateData.player.getId())) {
+                    entry1.getValue().data.levelPointView[1] = JDGDUtils.levelPoint[index];
                 }
-                // 设置全局当前级牌点数
-                this.data.curLevelPoint = Math.max(player.data.levelPointView[0], player.data.levelPointView[1]);
-                break;
+            }
+            // 设置全局当前级牌点数
+            this.data.curLevelPoint = Math.max(player.data.levelPointView[0], player.data.levelPointView[1]);
         }
-        Log.info("{}原级牌点数: {}, 当前级牌点数: {}", builder != null ? builder : "", oldLevelPoint, this.data.curLevelPoint);
+        Log.info("升级...{}, 原级牌点数: {}, 当前级牌点数: {}", builder.toString(), oldLevelPoint, this.data.curLevelPoint);
     }
 
     /**
@@ -653,6 +729,10 @@ public class JDGDRoom extends Room implements GRoomInterface {
         // 结算信息
         Map<String, Object> settlementData = new HashMap<>();
         for (Map.Entry<Integer, Player> entry : this.data.result.entrySet()) {
+            if (entry.getKey() == 1) {
+                // 设置下一家庄家
+                this.data.zhuangPos = entry.getValue().data.pos;
+            }
             settlementData.put(entry.getKey().toString(), ProtoUtil.playerRoomToMessage(this, entry.getValue(), true));
         }
         // 广播结算
@@ -692,7 +772,6 @@ public class JDGDRoom extends Room implements GRoomInterface {
 
         Log.debug("清理桌子数据...");
         this.cardList.clear();
-        this.data.zhuangPos = 0;
         this.data.curDisCardList = new int[]{};
         this.data.curDisCardType = null;
         this.data.disCardPlayer = null;

+ 1 - 3
incubator-game/src/main/java/com/incubator/game/room/Room.java

@@ -46,9 +46,7 @@ public class Room {
     private ScheduledExecutorService scheduler;
 
     public Room() {
-        if (this.scheduler == null || this.scheduler.isShutdown()) {
-            this.scheduler = Executors.newSingleThreadScheduledExecutor();
-        }
+        this.scheduler = Executors.newSingleThreadScheduledExecutor();
     }
 
     /** 初始化 **/

+ 43 - 8
incubator-game/src/main/java/com/incubator/game/util/Struct.java

@@ -2,6 +2,8 @@ package com.incubator.game.util;
 
 import com.incubator.game.player.Player;
 
+import java.util.List;
+
 /**
  * 自定义结构类
  */
@@ -15,19 +17,15 @@ public final class Struct {
             this.player = player;
             this.rank = rank;
         }
-
         public Player getPlayer() {
             return player;
         }
-
         public void setPlayer(Player player) {
             this.player = player;
         }
-
         public int getRank() {
             return rank;
         }
-
         public void setRank(int rank) {
             this.rank = rank;
         }
@@ -51,22 +49,59 @@ public final class Struct {
             this.rank = rank;
             this.isPromotion = isPromotion;
         }
-
         public String getPlayerId() {
             return playerId;
         }
-
         public void setPlayerId(String playerId) {
             this.playerId = playerId;
         }
-
         public int getRank() {
             return rank;
         }
-
         public void setRank(int rank) {
             this.rank = rank;
         }
     }
 
+    /**
+     * 进还贡数据
+     */
+    public static class TributeData {
+        // 还贡者1
+        public String player1;
+        // 还贡者2
+        public String player2;
+        // 进贡者List
+        public List<String> tributeList;
+        public TributeData() {}
+        /**
+         *
+         * @param player1  还贡者id(1游)
+         * @param player2  还贡者id(2游)
+         * @param tributeList  进贡者Ids
+         */
+        public TributeData(String player1, String player2, List<String> tributeList) {
+            this.player1 = player1;
+            this.player2 = player2;
+            this.tributeList = tributeList;
+        }
+        public String getPlayer1() {
+            return player1;
+        }
+        public void setPlayer1(String player1) {
+            this.player1 = player1;
+        }
+        public String getPlayer2() {
+            return player2;
+        }
+        public void setPlayer2(String player2) {
+            this.player2 = player2;
+        }
+        public List<String> getTributeList() {
+            return tributeList;
+        }
+        public void setTributeList(List<String> tributeList) {
+            this.tributeList = tributeList;
+        }
+    }
 }