diff --git a/src/main/java/com/webgame/webgamebackend/entities/GameMoveEntity.java b/src/main/java/com/webgame/webgamebackend/entities/GameMoveEntity.java new file mode 100644 index 0000000..8048831 --- /dev/null +++ b/src/main/java/com/webgame/webgamebackend/entities/GameMoveEntity.java @@ -0,0 +1,47 @@ +package com.webgame.webgamebackend.entities; + +import com.webgame.webgamebackend.entities.base.UUIDBaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; + +/** + * 走棋记录实体 + * + * 记录每一步走棋:所属房间、下棋玩家、棋盘坐标、步序号。 + * 坐标系约定:(0,0) 为棋盘左上角。 + */ +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +@Table(name = "game_move") +public class GameMoveEntity extends UUIDBaseEntity { + + /** 所属房间 ID */ + @Column(name = "room_id", nullable = false, length = 64) + private String roomId; + + /** 下棋玩家的 account_id */ + @Column(name = "player_id", nullable = false, length = 64) + private String playerId; + + /** 落子行坐标(0 起始,从上往下) */ + @Column(name = "row_num", nullable = false) + private Integer rowNum; + + /** 落子列坐标(0 起始,从左往右) */ + @Column(name = "col_num", nullable = false) + private Integer colNum; + + /** 步序号(从 1 开始递增) */ + @Column(name = "move_index", nullable = false) + private Integer moveIndex; +} diff --git a/src/main/java/com/webgame/webgamebackend/entities/GameRecordEntity.java b/src/main/java/com/webgame/webgamebackend/entities/GameRecordEntity.java new file mode 100644 index 0000000..cfa33ff --- /dev/null +++ b/src/main/java/com/webgame/webgamebackend/entities/GameRecordEntity.java @@ -0,0 +1,48 @@ +package com.webgame.webgamebackend.entities; + +import com.webgame.webgamebackend.entities.base.UUIDBaseEntity; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 对局记录实体 + * + * 每局游戏结束后生成一条记录,包含胜负结果。 + */ +@Entity +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor +@Accessors(chain = true) +@Table(name = "game_record") +public class GameRecordEntity extends UUIDBaseEntity { + + /** 所属房间 ID */ + @Column(name = "room_id", nullable = false, length = 64) + private String roomId; + + /** 胜方 account_id(平局时为 null) */ + @Column(name = "winner_id", length = 64) + private String winnerId; + + /** 结果类型:win(一方获胜)、draw(平局)、resign(认输) */ + @Column(name = "result_type", nullable = false, length = 16) + private String resultType; + + /** 对局开始时间 */ + @Column(name = "started_at", nullable = false) + private LocalDateTime startedAt; + + /** 对局结束时间 */ + @Column(name = "ended_at") + private LocalDateTime endedAt; +} diff --git a/src/main/java/com/webgame/webgamebackend/entities/GameRoomEntity.java b/src/main/java/com/webgame/webgamebackend/entities/GameRoomEntity.java index 4d9a444..3d164dc 100644 --- a/src/main/java/com/webgame/webgamebackend/entities/GameRoomEntity.java +++ b/src/main/java/com/webgame/webgamebackend/entities/GameRoomEntity.java @@ -67,6 +67,12 @@ public class GameRoomEntity extends UUIDBaseEntity { @Column(name = "password", length = 64) private String password; + /** + * 是否允许观战 + */ + @Column(name = "allow_spectate", nullable = false) + private Boolean allowSpectate = true; + /** * 房间状态:waiting / playing / finished */ diff --git a/src/main/java/com/webgame/webgamebackend/service/GomokuGameService.java b/src/main/java/com/webgame/webgamebackend/service/GomokuGameService.java new file mode 100644 index 0000000..dbf5226 --- /dev/null +++ b/src/main/java/com/webgame/webgamebackend/service/GomokuGameService.java @@ -0,0 +1,48 @@ +package com.webgame.webgamebackend.service; + +import com.webgame.webgamebackend.ws.RoomSessionManager; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * 五子棋游戏服务 + * + * 处理五子棋对局的核心逻辑:落子、胜负判定、认输、和棋、准备等。 + * TODO: 后续任务完善实现 + */ +@Slf4j +@Service +public class GomokuGameService { + + public void placeStone(String roomId, String userId, int row, int col, RoomSessionManager sessionManager) { + log.warn("[GomokuGameService] placeStone 暂未实现, roomId={}, userId={}, row={}, col={}", roomId, userId, row, col); + } + + public void toggleReady(String roomId, String userId, RoomSessionManager sessionManager) { + log.warn("[GomokuGameService] toggleReady 暂未实现, roomId={}, userId={}", roomId, userId); + } + + public void resign(String roomId, String userId, RoomSessionManager sessionManager) { + log.warn("[GomokuGameService] resign 暂未实现, roomId={}, userId={}", roomId, userId); + } + + public void requestDraw(String roomId, String userId, RoomSessionManager sessionManager) { + log.warn("[GomokuGameService] requestDraw 暂未实现, roomId={}, userId={}", roomId, userId); + } + + public void respondToDraw(String roomId, String userId, boolean accept, RoomSessionManager sessionManager) { + log.warn("[GomokuGameService] respondToDraw 暂未实现, roomId={}, userId={}, accept={}", roomId, userId, accept); + } + + public void leaveRoom(String roomId, String userId, RoomSessionManager sessionManager) { + log.warn("[GomokuGameService] leaveRoom 暂未实现, roomId={}, userId={}", roomId, userId); + } + + public void startGame(String roomId, String userId, RoomSessionManager sessionManager) { + log.warn("[GomokuGameService] startGame 暂未实现, roomId={}, userId={}", roomId, userId); + } + + public void handleDisconnect(String roomId, String userId, RoomSessionManager sessionManager) { + log.warn("[GomokuGameService] handleDisconnect 暂未实现, roomId={}, userId={}", roomId, userId); + } +} diff --git a/src/main/java/com/webgame/webgamebackend/ws/RoomWebSocketHandler.java b/src/main/java/com/webgame/webgamebackend/ws/RoomWebSocketHandler.java index b24eada..84e4fae 100644 --- a/src/main/java/com/webgame/webgamebackend/ws/RoomWebSocketHandler.java +++ b/src/main/java/com/webgame/webgamebackend/ws/RoomWebSocketHandler.java @@ -6,6 +6,7 @@ import com.alibaba.fastjson2.JSONObject; import com.webgame.webgamebackend.service.GomokuGameService; import com.webgame.webgamebackend.ws.dto.WsInboundMessage; import com.webgame.webgamebackend.ws.dto.WsMessage; +import com.webgame.webgamebackend.ws.dto.WsOutboundMessage; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component;