feat: 添加走棋记录、对局记录实体,房间新增观战开关

This commit is contained in:
2026-06-23 10:59:49 +08:00
parent be37d51930
commit 05520a2b1d
5 changed files with 150 additions and 0 deletions

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -67,6 +67,12 @@ public class GameRoomEntity extends UUIDBaseEntity {
@Column(name = "password", length = 64) @Column(name = "password", length = 64)
private String password; private String password;
/**
* 是否允许观战
*/
@Column(name = "allow_spectate", nullable = false)
private Boolean allowSpectate = true;
/** /**
* 房间状态waiting / playing / finished * 房间状态waiting / playing / finished
*/ */

View File

@@ -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);
}
}

View File

@@ -6,6 +6,7 @@ import com.alibaba.fastjson2.JSONObject;
import com.webgame.webgamebackend.service.GomokuGameService; import com.webgame.webgamebackend.service.GomokuGameService;
import com.webgame.webgamebackend.ws.dto.WsInboundMessage; import com.webgame.webgamebackend.ws.dto.WsInboundMessage;
import com.webgame.webgamebackend.ws.dto.WsMessage; import com.webgame.webgamebackend.ws.dto.WsMessage;
import com.webgame.webgamebackend.ws.dto.WsOutboundMessage;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;