Compare commits
No commits in common. "59db9d6e61bb3c01d54d68d8fe9665f890daed1b" and "e5169086f6be90e9cc611b796fd7b6177022dfd3" have entirely different histories.
59db9d6e61
...
e5169086f6
@ -29,11 +29,6 @@ router.post('/signup', async function (req, res, next) {
|
|||||||
return res.status(400).send("모든 필드를 입력하세요.")
|
return res.status(400).send("모든 필드를 입력하세요.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if(password.length < 6 || password.length > 18){
|
|
||||||
return res.status(400).send("비밀번호는 6자 이상 18자 이하로 입력해야합니다.")
|
|
||||||
}
|
|
||||||
|
|
||||||
// 이메일 형식 검증
|
// 이메일 형식 검증
|
||||||
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
||||||
if (!emailRegex.test(email)) {
|
if (!emailRegex.test(email)) {
|
||||||
|
@ -16,18 +16,6 @@ module.exports = function(io, socket, gameState) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// 타임아웃 주고 받기
|
|
||||||
socket.on('sendTimeout', function(data) {
|
|
||||||
try {
|
|
||||||
const roomId = data.roomId;
|
|
||||||
|
|
||||||
socket.to(roomId).emit('receiveTimeout', { message: "상대방 타임아웃" });
|
|
||||||
} catch (err) {
|
|
||||||
logger.error(`타임아웃 처리 중 오류: ${err}`);
|
|
||||||
socket.emit('error', { message: "상대방에게 타임아웃 정보를 전달하지 못했습니다." });
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// 항복 요청
|
// 항복 요청
|
||||||
socket.on('requestSurrender', function(data) {
|
socket.on('requestSurrender', function(data) {
|
||||||
try {
|
try {
|
||||||
|
@ -6,15 +6,13 @@ module.exports = function(io, socket, gameState) {
|
|||||||
try {
|
try {
|
||||||
const rating = data.rating;
|
const rating = data.rating;
|
||||||
const nickname = data.nickname;
|
const nickname = data.nickname;
|
||||||
const imageIndex = data.imageIndex;
|
|
||||||
gameState.playerRating.set(socket.id, rating);
|
gameState.playerRating.set(socket.id, rating);
|
||||||
gameState.nickname.set(socket.id, nickname);
|
gameState.nickname.set(socket.id, nickname);
|
||||||
gameState.imageIndex.set(socket.id, imageIndex);
|
|
||||||
|
|
||||||
logger.info(`플레이어 등록: ID ${socket.id}, 닉네임: ${nickname}, 급수 ${rating}, 프로필 이미지 인덱스: ${imageIndex}`);
|
logger.info(`플레이어 등록: ID ${socket.id}, 닉네임: ${nickname}, 급수 ${rating}`);
|
||||||
|
|
||||||
// 급수에 따른 매칭 진행
|
// 급수에 따른 매칭 진행
|
||||||
findMatch(socket, rating, nickname, imageIndex);
|
findMatch(socket, rating, nickname);
|
||||||
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
logger.error(`플레이어 등록 중 오류: ${err}`);
|
logger.error(`플레이어 등록 중 오류: ${err}`);
|
||||||
@ -22,22 +20,7 @@ module.exports = function(io, socket, gameState) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const switchToAI = (roomId, socket) => {
|
const findMatch = (socket, playerRating, nickname) => {
|
||||||
// 대기방 목록에서 제거
|
|
||||||
gameState.rooms = gameState.rooms.filter(room => room.roomId !== roomId);
|
|
||||||
|
|
||||||
// 플레이어 매칭 정보 제거
|
|
||||||
gameState.playerRating.delete(socket.id);
|
|
||||||
gameState.nickname.delete(socket.id);
|
|
||||||
gameState.imageIndex.delete(socket.id);
|
|
||||||
gameState.matchingTimeouts.delete(socket.id);
|
|
||||||
|
|
||||||
socket.emit('switchAI', {
|
|
||||||
message: "타임아웃 AI로 전환"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const findMatch = (socket, playerRating, nickname, imageIndex) => {
|
|
||||||
let matchedRoom = null;
|
let matchedRoom = null;
|
||||||
|
|
||||||
// 1. 같은 급수의 방 찾기
|
// 1. 같은 급수의 방 찾기
|
||||||
@ -63,21 +46,19 @@ module.exports = function(io, socket, gameState) {
|
|||||||
// 흑백 여부 결정 50% 확률
|
// 흑백 여부 결정 50% 확률
|
||||||
let isHostFirst = Math.random() < 0.5;
|
let isHostFirst = Math.random() < 0.5;
|
||||||
|
|
||||||
// 클라이언트에게 방 정보 전송 (상대 정보 포함)
|
// 클라이언트에게 방 정보 전송 (상대 급수 정보 포함)
|
||||||
socket.emit('joinRoom', {
|
socket.emit('joinRoom', {
|
||||||
roomId: roomId,
|
roomId: roomId,
|
||||||
opponentRating: gameState.playerRating.get(matchedRoom.hostId),
|
opponentRating: gameState.playerRating.get(matchedRoom.hostId),
|
||||||
opponentNickname: gameState.nickname.get(matchedRoom.hostId),
|
opponentNickname: gameState.nickname.get(matchedRoom.hostId),
|
||||||
opponentImageIndex: gameState.imageIndex.get(matchedRoom.hostId),
|
|
||||||
isBlack: !isHostFirst
|
isBlack: !isHostFirst
|
||||||
});
|
});
|
||||||
|
|
||||||
// 상대방에게 게임 시작 알림 (내 정보 포함)
|
// 상대방에게 게임 시작 알림 (내 닉네임과 급수 정보 포함)
|
||||||
socket.to(roomId).emit('startGame', {
|
socket.to(roomId).emit('startGame', {
|
||||||
opponentId: socket.id,
|
opponentId: socket.id,
|
||||||
opponentRating: playerRating,
|
opponentRating: playerRating,
|
||||||
opponentNickname: nickname,
|
opponentNickname: nickname,
|
||||||
opponentImageIndex: imageIndex,
|
|
||||||
isBlack: isHostFirst
|
isBlack: isHostFirst
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -92,8 +73,7 @@ module.exports = function(io, socket, gameState) {
|
|||||||
gameState.rooms.push({
|
gameState.rooms.push({
|
||||||
roomId: roomId,
|
roomId: roomId,
|
||||||
hostId: socket.id,
|
hostId: socket.id,
|
||||||
rating: playerRating,
|
rating: playerRating
|
||||||
imageIndex: imageIndex
|
|
||||||
});
|
});
|
||||||
|
|
||||||
gameState.socketRooms.set(socket.id, roomId);
|
gameState.socketRooms.set(socket.id, roomId);
|
||||||
@ -103,23 +83,6 @@ module.exports = function(io, socket, gameState) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
logger.info(`대기방 생성: ID ${socket.id}, 급수 ${playerRating}, 방 ID ${roomId}`);
|
logger.info(`대기방 생성: ID ${socket.id}, 급수 ${playerRating}, 방 ID ${roomId}`);
|
||||||
|
|
||||||
// 15초 타임아웃 설정
|
|
||||||
const timeoutId = setTimeout(() => {
|
|
||||||
logger.info("타이머 종료, 15초 경과");
|
|
||||||
// 타임 아웃 AI로 던지기
|
|
||||||
|
|
||||||
// 아직 방에 혼자인지 확인
|
|
||||||
const room = gameState.rooms.find(r => r.roomId === roomId);
|
|
||||||
if (room) {
|
|
||||||
// 방이 남아 있으면 매칭 전임
|
|
||||||
logger.info("방이 남아 있어 방 삭제 후 AI로 전달");
|
|
||||||
switchToAI(roomId, socket);
|
|
||||||
}
|
|
||||||
},15000)
|
|
||||||
|
|
||||||
// 타임아웃 ID 저장
|
|
||||||
gameState.matchingTimeouts.set(socket.id, timeoutId);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -12,18 +12,8 @@ module.exports = function(io, socket, gameState) {
|
|||||||
|
|
||||||
// 혼자 대기 중인 경우 대기방 목록에서 제거
|
// 혼자 대기 중인 경우 대기방 목록에서 제거
|
||||||
gameState.rooms = gameState.rooms.filter(room => room.roomId !== roomId);
|
gameState.rooms = gameState.rooms.filter(room => room.roomId !== roomId);
|
||||||
|
|
||||||
// 타임아웃이 있으면 제거
|
|
||||||
if (gameState.matchingTimeouts.has(socket.id)) {
|
|
||||||
clearTimeout(gameState.matchingTimeouts.get(socket.id));
|
|
||||||
gameState.matchingTimeouts.delete(socket.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 매핑 정보 삭제
|
// 매핑 정보 삭제
|
||||||
gameState.socketRooms.delete(socket.id);
|
gameState.socketRooms.delete(socket.id);
|
||||||
gameState.playerRating.delete(socket.id);
|
|
||||||
gameState.nickname.delete(socket.id);
|
|
||||||
gameState.imageIndex.delete(socket.id);
|
|
||||||
|
|
||||||
logger.info(`방 나가기 처리: 플레이어 ${socket.id}, 방 ${roomId}`);
|
logger.info(`방 나가기 처리: 플레이어 ${socket.id}, 방 ${roomId}`);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
@ -9,9 +9,7 @@ const gameState = {
|
|||||||
rooms: [], // {roomId, hostId, rating} 형태로 저장
|
rooms: [], // {roomId, hostId, rating} 형태로 저장
|
||||||
socketRooms: new Map(), // 소켓ID와 방ID 매핑
|
socketRooms: new Map(), // 소켓ID와 방ID 매핑
|
||||||
playerRating: new Map(), // 소켓ID와 플레이어 급수 매핑
|
playerRating: new Map(), // 소켓ID와 플레이어 급수 매핑
|
||||||
nickname: new Map(), // 플레이어 닉네임
|
nickname: new Map() // 플레이어 닉네임
|
||||||
imageIndex: new Map(), // 플레이어 프로필 이미지 인덱스
|
|
||||||
matchingTimeouts: new Map(), // 매치메이킹 타임아웃
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = function(server) {
|
module.exports = function(server) {
|
||||||
@ -36,12 +34,6 @@ module.exports = function(server) {
|
|||||||
socket.on('disconnect', function(reason) {
|
socket.on('disconnect', function(reason) {
|
||||||
logger.info('Disconnected: ' + socket.id + ', Reason: ' + reason);
|
logger.info('Disconnected: ' + socket.id + ', Reason: ' + reason);
|
||||||
|
|
||||||
// 타임아웃이 있으면 제거
|
|
||||||
if (gameState.matchingTimeouts.has(socket.id)) {
|
|
||||||
clearTimeout(gameState.matchingTimeouts.get(socket.id));
|
|
||||||
gameState.matchingTimeouts.delete(socket.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 해당 소켓이 속한 방 찾기
|
// 해당 소켓이 속한 방 찾기
|
||||||
const roomId = gameState.socketRooms.get(socket.id);
|
const roomId = gameState.socketRooms.get(socket.id);
|
||||||
|
|
||||||
@ -57,10 +49,8 @@ module.exports = function(server) {
|
|||||||
gameState.socketRooms.delete(socket.id);
|
gameState.socketRooms.delete(socket.id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 플레이어 매칭 정보 제거
|
// 플레이어 급수 정보 제거
|
||||||
gameState.playerRating.delete(socket.id);
|
gameState.playerRating.delete(socket.id);
|
||||||
gameState.nickname.delete(socket.id);
|
|
||||||
gameState.imageIndex.delete(socket.id);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
};
|
};
|
Loading…
x
Reference in New Issue
Block a user