Browse Source

增加主线程逻辑

johnclot69 4 months ago
parent
commit
88f9cb8714

BIN
.gradle/7.5.1/executionHistory/executionHistory.bin


BIN
.gradle/7.5.1/executionHistory/executionHistory.lock


BIN
.gradle/7.5.1/fileHashes/fileHashes.bin


BIN
.gradle/7.5.1/fileHashes/fileHashes.lock


BIN
.gradle/7.5.1/fileHashes/resourceHashesCache.bin


BIN
.gradle/buildOutputCleanup/buildOutputCleanup.lock


BIN
incubator-game/build/classes/java/main/com/incubator/game/data/model/RoomPO.class


BIN
incubator-game/build/tmp/compileJava/previous-compilation-data.bin


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

@@ -26,10 +26,12 @@ public class RoomPO {
 	/** 玩家 [key:座位号, value:玩家对象] **/
 	public Map<Integer, Player> playerMap = new HashMap<>();
 
+	/** 检测标记 **/
+	public boolean flag;
+	/** 时间秒数 **/
+	public int time;
 	/** 房间状态(0等待 1开局 2进行中 3已结束) **/
 	public int state;
-	/** 倒计时 **/
-	public int time;
 	/** 当前局数 **/
 	public int curRound;
 	/** 先手位置 **/

+ 86 - 0
incubator-game/src/main/java/com/incubator/game/room/JDGDSchedule.java

@@ -0,0 +1,86 @@
+package com.incubator.game.room;
+
+import com.incubator.common.log4j.Log4jUtil;
+import org.slf4j.Logger;
+
+/**
+ * 经典掼蛋主线程逻辑
+ */
+public class JDGDSchedule {
+
+    protected Logger logger = Log4jUtil.getLogger(getClass());
+
+    private static JDGDSchedule instance;
+
+    public synchronized static JDGDSchedule getInstance() {
+        if (instance == null) {
+            instance = new JDGDSchedule();
+        }
+        return instance;
+    }
+
+    public void doUpdate(Room room) {
+        if (room == null) {
+            logger.error("经典掼蛋主线程逻辑找不到房间实体...");
+            return;
+        }
+
+        switch (room.data.state) {
+            case 0:
+                // 等待状态
+                if (room.checkReadyStart()) {
+                    room.data.state = 1;
+                    room.data.flag = false;
+                    room.data.time = 0;
+                }
+
+                // 120秒未开始直接解散
+                if (room.data.time >= 120) {
+                    logger.debug("解散房间...");
+                }
+                break;
+            case 1:
+                // 开局
+                if (!room.data.flag) {
+                    //开始
+                    if (room.data.time >= 3) {
+                        room.doStart();
+                        room.data.state = 2;
+                        room.data.flag = true;
+                        room.data.time = 0;
+                        logger.debug("检测: 房间号:{}, 房间人数:{}, 当前局数:{}, 状态:开局...VS动画...", room.data.roomId, room.data.playerMap.size(), room.data.curRound);
+                    }
+                }
+                else {
+                    if (room.data.time >= 4) {
+                        room.data.state = 2;
+                        room.data.flag = false;
+                        room.data.time = 0;
+                    }
+                }
+                break;
+            case 2:
+                // 进行中
+                if (!room.data.flag) {
+                    room.data.flag = true;
+                    room.data.time = 0;
+                } else {
+                    logger.debug("强制操作...");
+                }
+                break;
+            case 3:
+                // 结束
+                if (!room.data.flag) {
+                    room.data.flag = true;
+                    room.data.time = 0;
+                    logger.debug("游戏结束: 房间号 : {}, 房间人数 : {}, 当前局数 : {}", room.data.roomId, room.data.playerMap.size(), room.data.curRound);
+                } else {
+
+                }
+                break;
+        }
+
+        room.data.time += 1;
+    }
+
+}

+ 69 - 0
incubator-game/src/main/java/com/incubator/game/room/Room.java

@@ -1,10 +1,15 @@
 package com.incubator.game.room;
 
 import com.incubator.common.log4j.Log4jUtil;
+import com.incubator.core.net.ws.Message;
 import com.incubator.game.data.model.RoomPO;
 import com.incubator.game.player.Player;
+import com.incubator.game.util.MsgUtil;
+import com.incubator.message.proto.CommonProto;
 import org.slf4j.Logger;
 
+import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -62,4 +67,68 @@ public class Room {
             this.scheduler.shutdownNow();
         }
     }
+
+    /**
+     * 检测是否可以开始 3秒倒计时开始
+     *
+     * @return
+     */
+    public boolean checkReadyStart() {
+        if (!this.isStart() || this.data.state != 0) {
+            return false;
+        }
+
+        // 广播3秒倒计时
+        for (Player tmPlayer : this.data.playerMap.values()) {
+            if (tmPlayer != null) {
+                Message msg = new Message();
+                msg.setCmd(CommonProto.Cmd.GameStateChange_VALUE);
+                Map<String, Object> data = MsgUtil.roomToMessage(this, tmPlayer, null);
+                data.put("time", 3);
+                msg.setData(data);
+                tmPlayer.receive(msg);
+            }
+        }
+
+        return true;
+    }
+
+    /**
+     * 是否玩家都已准备,可开始
+     *
+     * @return
+     */
+    public boolean isStart() {
+        int cnt = 0;
+        for (Player player : this.data.playerMap.values()) {
+            if (player != null && player.data.state == 1) {
+                cnt += 1;
+            }
+        }
+        return cnt >= this.data.maxNum;
+    }
+
+    /**
+     * 游戏开局
+     */
+    public void doStart() {
+        this.data.curRound += 1;
+        // 定庄
+        this.data.zhuangPos = 0;
+        // 设置当前操作玩家
+
+        // 发牌
+
+        // 广播
+        for (Player tmPlayer : this.data.playerMap.values()) {
+            if (tmPlayer != null) {
+                Message msg = new Message();
+                msg.setCmd(CommonProto.Cmd.GameStateChange_VALUE);
+                Map<String, Object> data = MsgUtil.roomToMessage(this, tmPlayer, null);
+                data.put("time", 20);
+                msg.setData(data);
+                tmPlayer.receive(msg);
+            }
+        }
+    }
 }

+ 1 - 1
incubator-message/src/main/proto/CommonProto.proto

@@ -74,7 +74,7 @@ enum Cmd {
 
 
     // 服务器推送消息 900000-999999 (全部以偶数结尾)
-    PlayerInfoUpdate = 900002;  //玩家信息数据变更推送
+    PlayerInfoUpdate = 900002;  // 玩家信息数据变更推送
     PlayerOnline = 900004;      // 玩家上线推送
     PlayerOffline = 900006;     // 玩家下线推送
     RoomPlayerJoin = 900008;    // 玩家加入房间推送