Browse Source

解决出牌的一些问题

johnclot69 4 months ago
parent
commit
dad2c95a33

+ 17 - 3
incubator-core/src/main/java/com/incubator/core/net/ws/MsgBase.java

@@ -188,7 +188,14 @@ public abstract class MsgBase {
                 packer.packFloat((Float) value);
             } else if (value instanceof Boolean) {
                 packer.packBoolean((Boolean) value);
-            } else if (value instanceof int[] || value instanceof Integer[]) {
+            } else if (value instanceof int[]) {
+                // 序列化整型数组
+                int[] intArray = (int[]) value;
+                packer.packArrayHeader(intArray.length);
+                for (int item : intArray) {
+                    packer.packInt(item);
+                }
+            } else if (value instanceof Integer[]) {
                 // 序列化整型数组
                 Integer[] intArray = (Integer[]) value;
                 packer.packArrayHeader(intArray.length);
@@ -245,14 +252,21 @@ public abstract class MsgBase {
                 packer.packFloat((Float) value);
             } else if (value instanceof Boolean) {
                 packer.packBoolean((Boolean) value);
-            } else if (value instanceof int[] || value instanceof Integer[]) {
+            } else if (value instanceof int[]) {
+                // 序列化整型数组
+                int[] intArray = (int[]) value;
+                packer.packArrayHeader(intArray.length);
+                for (int item : intArray) {
+                    packer.packInt(item);
+                }
+            } else if (value instanceof Integer[]) {
                 // 序列化整型数组
                 Integer[] intArray = (Integer[]) value;
                 packer.packArrayHeader(intArray.length);
                 for (int item : intArray) {
                     packer.packInt(item);
                 }
-            } else if (value instanceof ArrayList) {
+            }else if (value instanceof ArrayList) {
                 // 序列化 ArrayList
                 ArrayList<Object> list = (ArrayList<Object>) value;
                 packer.packArrayHeader(list.size());

+ 1 - 1
incubator-game/src/main/java/com/incubator/game/data/model/RoomPO.java

@@ -42,7 +42,7 @@ public class RoomPO {
 	/** 当前操作玩家 **/
 	public Player currentPlayer;
 	/** 当前出牌玩家打出的牌集合 **/
-	public List<Integer> curDisCardList = new ArrayList<>();
+	public int[] curDisCardList = new int[]{};
 	/** 当前出牌的玩家 **/
 	public Player disCardPlayer;
 

+ 12 - 3
incubator-game/src/main/java/com/incubator/game/handler/jdgd/JDGDDisCardHandler.java

@@ -7,6 +7,7 @@ import com.incubator.core.net.ws.WSResponse;
 import com.incubator.game.room.jdgd.JDGDRoom;
 import com.incubator.game.player.Player;
 import com.incubator.game.room.RoomService;
+import com.incubator.game.util.CardUtils;
 import com.incubator.game.util.MsgUtil;
 import com.incubator.game.util.PlayerUtil;
 import com.incubator.message.proto.CommonProto;
@@ -66,18 +67,26 @@ public class JDGDDisCardHandler extends NetHandler {
         }
 
         // 判断参数
-        List<Integer> disCardList = (List<Integer>) request.getData().getOrDefault("disCardList", "");
-        if (disCardList == null || disCardList.isEmpty()) {
+        int[] disCardList = (int[]) request.getData().get("disCardList");
+        if (disCardList == null || disCardList.length <= 0) {
             logger.info("参数错误");
             response.setCode(CommonProto.Code.PARAMETER_ERR_VALUE);
             response.setMessage("参数错误...");
             return;
         }
 
+        // 判断手牌
+        if (!CardUtils.contains(player.data.remainCards, disCardList)) {
+            logger.info("参数错误");
+            response.setCode(CommonProto.Code.PARAMETER_ERR_VALUE);
+            response.setMessage("参数错误,玩家出的牌不在手上...");
+            return;
+        }
+
         // 出牌
         room.playerDisCard(player, disCardList);
 
         // 正常返回
-        response.setData(MsgUtil.roomToMessage(room, player, null));
+        response.setData(MsgUtil.roomToMessage(room, player, room.data.currentPlayer));
     }
 }

+ 10 - 9
incubator-game/src/main/java/com/incubator/game/room/jdgd/JDGDRoom.java

@@ -16,12 +16,12 @@ public class JDGDRoom extends Room implements GRoomInterface {
 
     /**
      * 掼蛋对应的数值
-     * 0x03-0x0f 方片(♦️)3-2
-     * 0x11-0x19 梅花(♣️)3-2
-     * 0x21-0x29 红桃(♥️)3-2
-     * 0x31-0x37 黑桃(♠️)3-2
-     * 0xef      小王
-     * 0xff      大王
+     * 0x03-0x0f 方片(♦️)3(3) 4(4) 5(5) 6(6) 7(7) 8(8) 9(9) 10(10) J(11) Q(12) K(13) A(14) 2(15)
+     * 0x13-0x1f 梅花(♣️)3(19) 4(20) 5(21) 6(22) 7(23) 8(24) 9(25) 10(26) J(27) Q(28) K(29) A(30) 2(31)
+     * 0x23-0x2f 红桃(♥️)3(35) 4(36) 5(37) 6(38) 7(39) 8(40) 9(41) 10(42) J(43) Q(44) K(45) A(46) 2(47)
+     * 0x33-0x3f 黑桃(♠️)3(51) 4(52) 5(53) 6(54) 7(55) 8(56) 9(57) 10(58) J(59) Q(60) K(61) A(62) 2(63)
+     * 0xef      小王(239)
+     * 0xff      大王(255)
      */
     public static Integer[] values = {
             0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
@@ -143,9 +143,10 @@ public class JDGDRoom extends Room implements GRoomInterface {
         // 广播
         for (Player tmPlayer : this.data.playerMap.values()) {
             if (tmPlayer != null) {
-                Map<String, Object> data = MsgUtil.roomToMessage(this, tmPlayer, null);
+                Map<String, Object> data = MsgUtil.roomToMessage(this, tmPlayer, this.data.currentPlayer);
                 data.put("state", 2);
                 data.put("time", 20);
+                CardUtils.printCards(tmPlayer.data.remainCards);
                 tmPlayer.receive(CommonProto.Cmd.GameStateChange_VALUE, data);
             }
         }
@@ -177,7 +178,7 @@ public class JDGDRoom extends Room implements GRoomInterface {
      * @param player
      * @param disCardList
      */
-    public void playerDisCard(Player player, List<Integer> disCardList) {
+    public void playerDisCard(Player player, int[] disCardList) {
         // 是否自己回合
         if (!this.data.currentPlayer.getId().equals(player.getId())) {
             return;
@@ -203,7 +204,7 @@ public class JDGDRoom extends Room implements GRoomInterface {
             // 广播其他3人
             for (Player tmPlayer : this.data.playerMap.values()) {
                 if (tmPlayer != null && !Objects.equals(tmPlayer.getId(), player.getId())) {
-                    Map<String, Object> data = MsgUtil.roomToMessage(this, tmPlayer, null);
+                    Map<String, Object> data = MsgUtil.roomToMessage(this, tmPlayer, this.data.currentPlayer);
                     tmPlayer.receive(CommonProto.Cmd.OtherPlayCards_VALUE, data);
                 }
             }

+ 54 - 8
incubator-game/src/main/java/com/incubator/game/util/CardUtils.java

@@ -283,19 +283,17 @@ public final class CardUtils {
 	 * @param v
 	 * @return
 	 */
-	public static boolean contains(Integer[] src, List<Integer> v) {
+	public static boolean contains(Integer[] src, int[] v) {
 		if (src != null) {
 			int cnt = 0;
-			for (Integer _v : v) {
-				if (_v > 0) {
-					for (Integer i : src) {
-						if (i.equals(_v)) {
-							cnt += 1;
-						}
+			for (int _v : v) {
+				for (Integer i : src) {
+					if (i == _v) {
+						cnt += 1;
 					}
 				}
 			}
-			return cnt == v.size();
+			return cnt >= v.length;
 		}
 		return false;
 	}
@@ -444,4 +442,52 @@ public final class CardUtils {
 		}
 		return maxCards;
 	}
+
+	public static void printCards(Integer[] args) {
+		List<String> desc = new ArrayList<>();
+		for (Integer card : args) {
+			if (card == 239) {
+				desc.add("小王");
+			} else if (card == 255) {
+				desc.add("大王");
+			} else {
+				byte high = (byte) (card >> 4);
+				byte low = (byte) (card & 0xf);
+				String cardLow = "";
+				switch (low){
+					case 11:
+						cardLow = "J";
+						break;
+					case 12:
+						cardLow = "Q";
+						break;
+					case 13:
+						cardLow = "K";
+						break;
+					case 14:
+						cardLow = "A";
+						break;
+					case 15:
+						cardLow = "2";
+						break;
+				}
+
+				switch (high) {
+					case 0:
+						desc.add("方片" + (cardLow.isEmpty() ? low : cardLow));
+						break;
+					case 1:
+						desc.add("梅花" + (cardLow.isEmpty() ? low : cardLow));
+						break;
+					case 2:
+						desc.add("红桃" + (cardLow.isEmpty() ? low : cardLow));
+						break;
+					case 3:
+						desc.add("黑桃" + (cardLow.isEmpty() ? low : cardLow));
+						break;
+				}
+			}
+		}
+		System.err.println(Arrays.toString(desc.toArray()));
+	}
 }

+ 2 - 2
incubator-game/src/main/java/com/incubator/game/util/MsgUtil.java

@@ -47,8 +47,8 @@ public final class MsgUtil {
         data.put("opId", opPlayer != null ? opPlayer.getId() : "");
         data.put("opPos", opPlayer != null ? opPlayer.data.pos : -1);
         data.put("curDisCardList", room.data.curDisCardList);
-        data.put("curDisCardPlayer", room.data.disCardPlayer.getId());
-        data.put("CurDisCardSex", room.data.disCardPlayer.data.sex);
+        data.put("curDisCardPlayer", room.data.disCardPlayer != null ? room.data.disCardPlayer.getId() : "");
+        data.put("curDisCardSex", room.data.disCardPlayer != null ? room.data.disCardPlayer.data.sex : 0);
         data.put("myInfo", playerRoomToMessage(room, player, true));
         List<Map<String, Object>> otherInfo = new ArrayList<>();
         for (Player tmPlayer : room.data.playerMap.values()) {