카테고리 없음
6주차 (5)
jaeoun0238
2024. 12. 6. 21:18
function solution(arr, divisor) {
var answer = [];
for(i=0; i<arr.length; i++){
if(arr[i]%divisor === 0) {
answer.push(arr[i]);
}
}
if(answer.length===0){
answer.push(-1);
}
answer.sort((a,b)=>a-b)
return answer;
}
SoccerSimulator
추가적으로 합치면서 코드 마무리!
import express, { request } from 'express';
import { prisma } from '../uts/prisma/index.js';
import errModel from '../middlewares/error.middleware.js';
import bcrypt from 'bcrypt';
import jwt from 'jsonwebtoken';
import authMiddleware from '../middlewares/auth.middleware.js';
const router = express.Router();
// 회원가입api
/** 사용자 회원가입 API **/
router.post('/sign-up', async (req, res, next) => {
const { userID, userName, userPassword } = req.body;
try {
// 동일한 회원정보 확인하기
const sameUser = await prisma.userData.findUnique({
where: {
userID,
},
});
// 사용자 정보가 이미 존재하는 경우
if (sameUser) {
return res.status(409).json({ message: '이미 존재하는 유저입니다.' });
}
// 비밀번호 해시화 (변경된 부분)
const bcryptPassword = await bcrypt.hash(userPassword, 10); // salt rounds 추가
const players = await prisma.playerData.findMany({
take: 3,
});
const result = await prisma.$transaction(async (tx) => {
// 트랜잭션 내에서 사용자를 생성합니다.
const user = await tx.userData.create({
data: {
userID,
userName,
userPassword: bcryptPassword,
userScore: 1000,
userCash: 5000,
},
});
//스쿼드 만들기
const squard = await tx.playerSquadsData.create({
data: {
userPID: user.userPID,
},
});
for (let i = 0; i < players.length; i++) {
const player = players[i];
const defaultPlayer = await tx.playerRostersData.create({
data: {
userPID: user.userPID,
playerPID: player.playerPID,
playerEnchant: 0,
},
});
//playerPID를 이용해서 장착되게
const equipRoster = await tx.playerEquipRostersData.create({
data: {
playerSquadsPID: squard.playerSquadsPID,
playerRostersPID: defaultPlayer.playerRostersPID,
position: i,
},
});
// console.log(equipRoster);
}
// 에러가 발생하여, 트랜잭션 내에서 실행된 모든 쿼리가 롤백됩니다.
return user;
});
// userData 테이블에 사용자를 추가
return res.status(201).json({ message: '회원가입이 완료되었습니다.' });
} catch (err) {
next(err);
// 오류 처리 시작 (변경된 부분)
// console.error(error); // 오류 로그 출력 (변경된 부분)
// return res.status(500).json({ message: '서버 오류가 발생했습니다.' }); // 오류 응답 반환 (변경된 부분)
}
});
// 로그인api
/** 로그인 API **/
router.post('/sign-in', async (req, res, next) => {
const { userID, userPassword } = req.body;
const user = await prisma.userData.findUnique({ where: { userID } });
if (!user)
return res.status(401).json({ message: '존재하지 않는 유저입니다.' });
// 입력받은 사용자의 비밀번호와 데이터베이스에 저장된 비밀번호를 비교합니다.
else if (!(await bcrypt.compare(userPassword, user.userPassword)))
return res.status(401).json({ message: '비밀번호가 일치하지 않습니다.' });
// 로그인에 성공하면, 사용자의 userId를 바탕으로 토큰을 생성합니다.
// console.log(process.env.JWT_KEY);
const token = jwt.sign(
{
userPID: user.userPID,
},
process.env.JWT_KEY, // 비밀 키를 환경 변수에서 가져옴
{ expiresIn: '1h' }, // 토큰의 만료 시간을 설정 (1시간)
);
// 헤더로 주고받게 바꾸기
res.setHeader('authorization', `Bearer ${token}`);
return res.status(200).json({
message: '로그인 성공',
user: {
userID: user.userID,
},
});
});
// 캐시 구매
router.patch('/buyCash', authMiddleware, async (req, res, next) => {
try {
const { userPID } = req.user;
const { cash } = req.body;
// 현재 보유량 + 추가 캐시 하기위해 현재 user정보 가져옴
const user = await prisma.userData.findUnique({
where: { userPID: +userPID },
});
// cash가 존재하지 않으면 에러, middleware로 따로 빼도 됨
if (!cash) {
return res.status(400).json({ error: '캐시를 입력해 주세요.' });
}
// cash가 유효한 값인지 검사, middleware로 따로 빼도 됨
if (typeof cash !== 'number' || cash < 0) {
return res.status(400).json({ error: '유효한 캐시 값을 입력해 주세요.' });
}
// 캐시 추가해서 업데이트
const updateCash = await prisma.userData.update({
where: { userPID: +userPID },
data: { userCash: user.userCash + cash },
});
return res.status(200).json({ currentCash: updateCash.userCash });
} catch (err) {
next(err);
}
});
//유저 랭킹 조회
router.get('/user/rankings', async (req, res, next) => {
try {
const ranking = await prisma.userData.findMany({
select: {
userName: true,
userScore: true,
},
orderBy: {
userScore: 'desc',
},
take: 10,
});
let rank = 1;
const userRanking = ranking.map((user, index, array) => {
if (index > 0 && array[index - 1].userScore === user.userScore) {
return {
ranking: rank,
userName: user.userName,
Score: user.userScore,
};
}
rank = index + 1;
return {
ranking: rank,
userName: user.userName,
Score: user.userScore,
};
});
// console.log(userRanking);
return res.status(200).json({ rank: userRanking });
} catch (err) {
return res.status(500).json({ error: '서버 오류입니다.' });
}
});
export default router;
import express from 'express';
import { prisma } from '../uts/prisma/index.js';
import { Prisma } from '@prisma/client';
import authMiddleware from '../middlewares/auth.middleware.js';
const maxHave_Rosters = 50; //보유할수 있는 최대값
const maxHave_Squads = 3; //장착 할수 있는 최대값
const max_positon = 1; //
const can_postions = [0, 1, 2]; // 0: striker, 1: midfielder, 2: defender
const router = express.Router();
router.patch(
//인증으로 userPID받아오기 팀에 집어넣는 로직
'/team/Set/:positionIndex/what/:playerRostersPID',
authMiddleware,
async (req, res, next) => {
const { positionIndex, playerRostersPID } = req.params;
const { userPID } = req.user;
try {
let data_temp = await equip(
+userPID,
+playerRostersPID,
+positionIndex,
next,
);
if (!data_temp) {
throw {
status: 404,
message: '전달받은 데이터가 없습니다. 형식에 주의 해주세요.',
};
}
return res
.status(201)
.json({ message: '팀에 성공적으로 배치했습니다!', data: data_temp });
} catch (err) {
next(err);
}
},
);
router.delete(
//인증으로 userPID받아오기 팀에서 빼는 거
'/team/Get/what/:playerRostersPID',
authMiddleware,
async (req, res, next) => {
const { playerRostersPID } = req.params;
const { userPID } = req.user;
try {
let data_temp = await Unequip(+userPID, +playerRostersPID, next);
return res
.status(201)
.json({ message: '팀에서 성공적으로 해제했습니다!', data: data_temp });
} catch (err) {
next(err);
}
},
);
//팀 선택창에서 해제 //인증으로 userPID받아오기
//팀 갱신
router.get('/team/Get/:userPID', async (req, res, next) => {
const { userPID } = req.params;
try {
const checkHaveRouter = await prisma.playerRostersData.findMany({
where: {
userPID: +userPID,
},
});
const squads = await prisma.playerSquadsData.findFirst({
where: {
userPID: +userPID,
},
include: {
playerEquipRostersData: {
include: {
playerRostersData: true,
},
},
},
});
//기본 적인 스쿼드 데이터
return res.status(201).json({
message: ' 팀 스쿼드 배치 보유 선수 현황입니다.',
data: { squads, checkHaveRouter },
});
} catch (err) {
next(err);
}
});
//전체 장착 용도 함수
const equip = async (userPID, playerRostersPID, postionData, next) => {
try {
if (postionData > can_postions.length) {
throw {
status: 400,
message: '포지션 형식에 주의 해주세요.',
};
}
//보유 하고있는 로스터 데이터
const checkHaveRouter = await prisma.playerRostersData.findFirst({
where: {
userPID: userPID,
playerRostersPID: playerRostersPID,
},
select: {
playerPID: true,
playerRostersPID: true,
},
});
// 현재 장착하고 있는 팀
const checkSquads = await prisma.playerSquadsData.findFirst({
where: {
userPID: +userPID,
},
include: {
playerEquipRostersData: {},
},
});
//스쿼드 찾기 나중에 다중 스쿼드로 구성하면 many로 받기
//스쿼드에 집어넣음
if (
!checkHaveRouter ||
!checkSquads ||
checkSquads.playerEquipRostersData.length >= maxHave_Squads
) {
throw {
status: 404,
message: '최대 장착중이거나 데이터가 없습니다.',
};
} else if (isUse(checkSquads.playerEquipRostersData, playerRostersPID, 1)) {
throw {
status: 404,
message: '이미 장착중입니다..',
};
} else if (isUse(checkSquads.playerEquipRostersData, postionData, 0)) {
throw {
status: 400,
message: '장착중인 포지션 입니다.',
};
}
//이제 db에 저장하는 트렌직션
//장착 테이블에 생성
const make_data = await prisma.playerEquipRostersData.create({
data: {
playerSquadsPID: checkSquads.playerSquadsPID,
playerRostersPID: checkHaveRouter.playerRostersPID,
position: postionData,
},
});
return make_data;
} catch (err) {
next(err);
}
};
const Unequip = async (userPID, playerRostersPID, next) => {
try {
//보유 하고있는 로스터 데이터
const checkHaveRouter = await prisma.playerRostersData.findMany({
where: {
userPID: userPID,
},
select: {
playerPID: true,
playerRostersPID: true,
},
});
const checkSquads = await prisma.playerSquadsData.findFirst({
where: {
userPID: +userPID,
},
include: {
playerEquipRostersData: {},
},
});
if (
!checkSquads.playerEquipRostersData.some(
(data) => data.playerEquipRostersPID === playerRostersPID,
)
) {
throw {
status: 404,
message: '지목하신 데이터가 없습니다.',
};
}
console.log(checkSquads);
//스쿼드 데이터 인클루드로 받아서 체크
if (!checkSquads || checkHaveRouter.length >= maxHave_Rosters) {
throw {
status: 404,
message: '최대 보유중 이거나 데이터가 없습니다.',
};
}
//삭제
await prisma.playerEquipRostersData.delete({
where: {
playerEquipRostersPID: playerRostersPID,
},
});
} catch (err) {
next(err);
}
};
// 장착중인 포지션 , 장착중 체크용도.
const isUse = (checkEquipRouter, indexData, statuse) => {
// 0 position 1 선수로스터아이디
switch (statuse) {
case 0:
return checkEquipRouter.some((data) => data.position === indexData);
case 1:
return checkEquipRouter.some(
(data) => data.playerRostersPID === indexData,
);
default:
return false;
}
};
export default router;
import express from 'express';
import { PrismaClient } from '@prisma/client';
import authenticateJWT from '../middlewares/auth.middleware.js';
import { prisma } from '../uts/prisma/index.js';
const router = express.Router();
// 플레이어생성 api
router.post('/player/make', async (req, res, next) => {
try {
//body로 전달 받은 객체 구조분해할당
const {
playerPID,
playerName,
playerAbilityATCK,
playerAbilityDEFEND,
playerAbilityMOBILITY,
} = req.body;
await prisma.$transaction(async (tranPrisma) => {
const player = await tranPrisma.playerData.create({
data: {
playerPID,
playerName,
playerAbilityATCK,
playerAbilityDEFEND,
playerAbilityMOBILITY,
},
});
});
// 성공시 전달 받은
return res.status(201).json({
message: `성공적으로 선수를 생성하였습니다. 선수ID : ${playerPID} 선수 이름 : ${playerName} 공격력 : ${playerAbilityATCK} 수비력 : ${playerAbilityDEFEND} 속력 : ${playerAbilityMOBILITY}
`,
});
} catch (err) {
next(err);
}
});
// 플레이어 뽑기 api
const gachaCosT = 100; // 1회 가챠 비용 (예시로 100 설정)
// 가챠 함수
const performGacha = async (userID) => {
try {
//트랜잭션 추가
const result = await prisma.$transaction(async (prisma) => {
// 유저 정보 조회
const user = await prisma.userData.findUnique({
where: { userID },
});
if (!user) {
throw new Error('User not found');
}
// 유저 캐시 확인
if (user.userCash < gachaCosT) {
throw new Error('Not enough cash for gacha');
}
// 캐시 차감
const updatedUser = await prisma.userData.update({
where: { userID },
data: {
userCash: user.userCash - gachaCosT, // 가챠 비용 차감
},
});
// playerData에서 랜덤한 선수 선택
const players = await prisma.playerData.findMany();
const randomPlayer = players[Math.floor(Math.random() * players.length)];
// 해당 유저의 playerRostersData에 선택한 선수 추가
const playerRoster = await prisma.playerRostersData.create({
data: {
userPID: user.userPID,
playerPID: randomPlayer.playerPID, // 각 선수마다 고유 ID
},
});
return {
updatedUser,
randomPlayer,
};
});
return {
message: `
🌟✨🌟✨🌟✨🌟
Congratulations! You got ${result.randomPlayer.playerName}!
🌟✨🌟✨🌟✨🌟
`,
player: result.randomPlayer,
};
} catch (error) {
return {
error: error.message,
};
}
};
// 선수 뽑기 API
router.post('/player/gacha', authenticateJWT, async (req, res) => {
const { userID } = req.user;
const result = await performGacha(userID);
if (result.error) {
return res.status(400).json({ error: result.error });
}
res.status(200).json({
message: result.message,
player: result.player,
});
});
//선수 강화 API
const upgradePlayer = async (req, res, next) => {
const maxUpgrade = 10; // 최대 강화 단계
try {
const { userPID } = req.user; // 인증된 유저 정보 가져오기
const { playerRostersPID, materials } = req.body; // 요청 바디에서 playerRostersPID와 materials 가져오기
// 유저 정보 조회
const user = await prisma.userData.findUnique({
where: { userPID },
});
if (!user) {
throw new Error('User not found');
}
// playerRostersPID를 통해 특정 선수 찾기
const existingPlayer = await prisma.playerRostersData.findUnique({
where: {
playerRostersPID, // playerRostersPID로 확인
},
});
if (!existingPlayer) {
throw new Error('Player does not exist');
}
// playerPID를 통해 playerData 조회
const playerStats = await prisma.playerData.findFirst({
where: {
playerPID: existingPlayer.playerPID, // existingPlayer에서 playerPID를 사용하여 조회
},
});
if (!playerStats) {
throw new Error('Player data not found');
}
// 강화 재료 확인
if (
!materials ||
!Array.isArray(materials) ||
materials.length < 1 ||
materials.length > 5
) {
return res
.status(400)
.json({ message: '강화에 최소 1명의 선수, 최대 5명이 필요합니다.' });
}
const materialCheck = await prisma.playerRostersData.findMany({
where: {
userPID,
playerRostersPID: { in: materials },
},
});
// // 중복된 playerPID 중 하나만 선택
// const uniqueMaterialCheck = [];
// const seen = new Set();
// materialCheck.forEach((item) => {
// if (!seen.has(item.playerRostersPID)) {
// uniqueMaterialCheck.push(item);
// seen.add(item.playerRostersPID);
// }
// }); >> PlayerID로 강화할 경우 필요
// 강화 재료가 유저 보유 선수인지 확인
if (materialCheck.length !== materials.length) {
return res
.status(400)
.json({ message: '강화 재료로 사용할 선수는 보유 선수가 아닙니다.' });
}
// 현재 강화 단계 확인
const currentUpgradeLevel = existingPlayer.playerEnchant || 0; // 현재 강화 단계
if (currentUpgradeLevel >= maxUpgrade) {
return res
.status(400)
.json({ message: '선수는 이미 최대 강화 단계에 도달했습니다.' });
}
//강화 확률 설정
let maxSuccessRate = Math.min(Math.max(materials.length * 20, 0), 100); //materials에 의한 확률을 최소 0, 최대 100으로 설정
switch (existingPlayer.playerEnchant) {
case 0:
maxSuccessRate -= 0;
break;
case 1:
maxSuccessRate -= 0;
break;
case 2:
maxSuccessRate -= 19;
break;
case 3:
maxSuccessRate -= 36;
break;
case 4:
maxSuccessRate -= 50;
break;
case 5:
maxSuccessRate -= 74;
break;
case 6:
maxSuccessRate -= 85;
break;
case 7:
maxSuccessRate -= 93;
break;
case 8:
maxSuccessRate -= 95;
break;
case 9:
maxSuccessRate -= 96;
break;
//추후 업그레이드 시 단계 추가
default:
break;
}
//강화 성공 시 선수 어빌리티 증가량 설정
let upgradeAbility = 0;
switch (existingPlayer.playerEnchant) {
case 0:
upgradeAbility += 1;
break;
case 1:
upgradeAbility += 1;
break;
case 2:
upgradeAbility += 1;
break;
case 3:
upgradeAbility += 2;
break;
case 4:
upgradeAbility += 2;
break;
case 5:
upgradeAbility += 3;
break;
case 6:
upgradeAbility += 3;
break;
case 7:
upgradeAbility += 4;
break;
case 8:
upgradeAbility += 5;
break;
case 9:
upgradeAbility += 5;
break;
default:
break;
}
const isSuccess = Math.random() * 100 <= maxSuccessRate;
// 강화 실패 처리
if (!isSuccess) {
return res.status(200).json({ message: '강화에 실패하였습니다.' });
}
// playerRostersData에서 해당 playerRostersPID만 업데이트
const result = await prisma.$transaction(async (prisma) => {
const updatedRosterPlayer = await prisma.playerRostersData.update({
where: {
playerRostersPID, // playerRostersPID로 해당 선수만 업데이트
},
data: {
playerEnchant: existingPlayer.playerEnchant + 1, // 강화 단계 증가
},
});
// 선수 강화
// const updatedPlayer = await prisma.playerData.update({
// where: { playerPID: existingPlayer.playerPID }, // 기존 playerPID를 사용하여 업데이트
// data: {
// playerAbilityATCK: playerStats.playerAbilityATCK + upgradeAbility, // 능력치 강화
// playerAbilityDEFEND: playerStats.playerAbilityDEFEND + upgradeAbility,
// playerAbilityMOBILITY: playerStats.playerAbilityMOBILITY + upgradeAbility,
// playerEnchant: existingPlayer.playerEnchant + 1, // 강화 단계 증가
// },
// }); >> 추후 RosterData에 능력치가 적용가능할 시 주석 해제
// 강화 재료 선수들 삭제
await prisma.playerRostersData.deleteMany({
where: {
userPID,
playerRostersPID: { in: materials },
},
});
// 트랜잭션 내에서 변경된 데이터를 반환
return updatedRosterPlayer; // 트랜잭션이 끝날 때 반환
});
return res.status(200).json({
message: `선수 강화가 완료되었습니다!`,
//updatedPlayer,
updatedRosterPlayer: result, //단일 객체로 바로 접근
});
} catch (err) {
next(err);
}
};
// 선수 강화 API 라우터 설정
router.put('/player/upgrade', authenticateJWT, upgradePlayer);
export default router;
/* 기본 게임 기능 */
import express from 'express';
import { prisma } from '../uts/prisma/index.js';
import authMiddleware from '../middlewares/auth.middleware.js';
const router = express.Router();
//게임 매칭 완성
router.post('/game/match', authMiddleware, async (req, res, next) => {
const user_1 = req.user.userPID;
const user_1_score = req.user.userScore;
try {
//스코어 계산
const max_score = user_1_score + 500;
const min_score = user_1_score - 500;
//스코어에 어울리는 사람 찾기
const user_temp = await prisma.userData.findMany({
where: {
NOT: {
userPID: +user_1,
},
gameSessionPID: null,
userScore: {
gte: min_score,
lte: max_score,
},
},
take: 10,
include: {
playerSquadsData: {
include: {
playerEquipRostersData: true,
},
},
},
});
// let userArr = user_temp.filter(user => user.playerSquadsData[0].playerEquipRostersData.length >= 3);
// if(userArr.length === 0){
// // 매칭 실패
// return;
// }
// let random_index = Math.floor(Math.random() * userArr.length);
// let matchingUser = userArr[random_index];
let userArr = [];
for (let i = 0; i < user_temp.length; i++) {
if (user_temp[i].playerSquadsData[0].playerEquipRostersData.length < 3)
continue;
userArr.push(user_temp[i]);
// console.log(i);
// let random_index = Math.floor(Math.random() * user_temp.length);
// if (
// user_temp[random_index].playerSquadsData[0].playerEquipRostersData
// .length >= 3
// ) {
// user_2 = user_temp[random_index];
// return user_2;
// }
}
let random_index = Math.floor(Math.random() * userArr.length);
let user_2 = userArr[random_index];
//매칭 실패
console.log(user_2);
if (!user_2) {
throw { status: 404, message: ' 적합한 유저를 찾지 못했습니다. ' };
}
//성공시 트렌잭션으로 생성하고 플레이어 데이터에 pid 추가
const [game] = await prisma.$transaction(async (tx) => {
const game = await tx.gameSession.create({
data: {
userScore_1: 0,
userScore_2: 0,
sessionTurn: 0,
},
});
await tx.userData.update({
where: {
userPID: user_1,
},
data: {
gameSessionPID: game.gameSessionPID,
},
});
await tx.userData.update({
where: {
userPID: user_2.userPID,
},
data: {
gameSessionPID: game.gameSessionPID,
},
});
return [game];
});
if (!game) {
throw { status: 500, message: ' 매칭에 실패했습니다. ' };
}
res.status(200).json({ date: '적합한 상대와 매칭되었습니다.' });
} catch (err) {
next(err);
}
});
router.post('/game-start', authMiddleware, async (req, res, next) => {
try {
const { gameSessionPID } = req.user;
const user_data = await prisma.gameSession.findUnique({
where: {
gameSessionPID: gameSessionPID,
},
include: {
userData: {
include: {
playerSquadsData: {
include: {
playerEquipRostersData: true,
},
},
},
},
},
});
let user_1_player = [];
// 유저 데이터[0] 첫번째 유저의 스쿼드데이터에 플레이어 로스터 데이터의 갯수만큼 반복
for (
let i = 0;
i <
user_data.userData[0].playerSquadsData[0].playerEquipRostersData.length;
i++
) {
// 유저 데이터[0] 첫번째 유저의 스쿼드데이터에 플레이어 로스터 데이터의[i]번째의 playerRostPID의 보유선수 데이터 잘하면 여기 스킵 가능
const isPlayer_temp = await prisma.playerRostersData.findUnique({
where: {
playerRostersPID:
user_data.userData[0].playerSquadsData[0].playerEquipRostersData[i]
.playerRostersPID,
},
});
// 그 받아온 선수의 데이터를 선수데이터 db를 불러와서 선수의 실질적인 데이터 받아오기.
const player = await prisma.playerData.findFirst({
where: { playerPID: isPlayer_temp.playerPID },
});
//여기서 플레이어 선수 푸쉬 해주기
user_1_player.push({
player: player,
playerPosition:
user_data.userData[0].playerSquadsData[0].playerEquipRostersData[i]
.position,
});
}
//유저2선수
let user_2_player = [];
for (
let i = 0;
i <
user_data.userData[1].playerSquadsData[0].playerEquipRostersData.length;
i++
) {
const isPlayer_temp = await prisma.playerRostersData.findUnique({
where: {
playerRostersPID:
user_data.userData[1].playerSquadsData[0].playerEquipRostersData[i]
.playerRostersPID,
},
});
const player = await prisma.playerData.findFirst({
where: { playerPID: isPlayer_temp.playerPID },
});
user_2_player.push({
player: player,
playerPosition:
user_data.userData[1].playerSquadsData[0].playerEquipRostersData[i]
.position,
});
}
let user1Striker = user_1_player[0];
let user1Midfielder = user_1_player[1];
let user1Defender = user_1_player[2];
let user2Striker = user_2_player[0];
let user2Midfielder = user_2_player[1];
let user2Defender = user_2_player[2];
//스탯 정규화
//유저1
let user1STR =
user1Striker.player.playerAbilityATCK * 1.1 +
user1Striker.player.playerAbilityDEFEND * 0.8 +
user1Striker.player.playerAbilityMOBILITY * 0.7;
let user1MID =
user1Midfielder.player.playerAbilityATCK +
user1Midfielder.player.playerAbilityDEFEND * 0.8 +
user1Midfielder.player.playerAbilityMOBILITY;
let user1DEF =
user1Defender.player.playerAbilityATCK * 0.8 +
user1Defender.player.playerAbilityDEFEND * 1.2 +
user1Defender.player.playerAbilityMOBILITY * 0.7;
//유저2
let user2STR =
user2Striker.player.playerAbilityATCK * 1.1 +
user2Striker.player.playerAbilityDEFEND * 0.8 +
user2Striker.player.playerAbilityMOBILITY * 0.7;
let user2MID =
user2Midfielder.player.playerAbilityATCK +
user2Midfielder.player.playerAbilityDEFEND * 0.8 +
user2Midfielder.player.playerAbilityMOBILITY;
let user2DEF =
user2Defender.player.playerAbilityATCK * 0.8 +
user2Defender.player.playerAbilityDEFEND * 1.2 +
user2Defender.player.playerAbilityMOBILITY * 0.7;
//돌파가능 수치정하기
//유저1
let user1DribbleSTR = user1STR + user2STR;
let user1DribbleMID = user1STR + user2MID;
let user1DribbleDEF = user1STR + user2DEF;
let user1RS = Math.random() * user1DribbleSTR;
let user1RM = Math.random() * user1DribbleMID;
let user1RD = Math.random() * user1DribbleDEF;
//유저2
let user2DribbleSTR = user2STR + user1STR;
let user2DribbleMID = user2STR + user1MID;
let user2DribbleDEF = user2STR + user1DEF;
let user2RS = Math.random() * user2DribbleSTR;
let user2RM = Math.random() * user2DribbleMID;
let user2RD = Math.random() * user2DribbleDEF;
let resultMessage = '';
let gameSession = await prisma.gameSession.findFirst({
where: { gameSessionPID },
});
let currentTurn = gameSession ? gameSession.sessionTurn : 0;
let currentUser_1Score = gameSession ? gameSession.userScore_1 : 0;
let currentUser_2Score = gameSession ? gameSession.userScore_2 : 0;
if (currentTurn % 2 === 0) {
//유저1
resultMessage += `유저1 공격수의 드리블`;
// 공격수 돌파시도
if (user1RS < user1STR) {
resultMessage += `\n유저1의 ${user1Striker.player.playerName} 선수가 상대 ${user2Striker.player.playerName} 선수를 뚫고 지나갑니다. `;
// 미드필더 돌파시도
if (user1RM < user1STR) {
resultMessage += `\n유저1의 ${user1Striker.player.playerName} 선수가 상대 ${user2Midfielder.player.playerName} 선수를 뚫고 지나갑니다. `;
// 수비수 돌파시도
if (user1RD < user1STR) {
resultMessage += `\n유저1의 ${user1Striker.player.playerName} 선수가 상대 ${user2Defender.player.playerName} 선수를 뚫고 골을 넣었습니다!`;
currentUser_1Score++;
resultMessage += `\n현재스코어 ${currentUser_1Score} : ${currentUser_2Score}`;
} else {
resultMessage +=
'\n상대 수비수에게 막혔습니다. 공이 유저2 공격수에게 패스됩니다.';
currentTurn++;
}
} else {
resultMessage +=
'\n상대 미드필더에게 막혔습니다. 공이 유저2 공격수에게 패스됩니다.';
currentTurn++;
}
} else {
resultMessage +=
'\n상대 공격수에게 막혔습니다. 유저2 공격수가 드리블합니다.';
currentTurn++;
}
} else {
//유저2
resultMessage += `유저2 공격수의 드리블`;
// 공격수 시도
if (user2RS < user2STR) {
resultMessage += `\n유저2의 ${user2Striker.player.playerName} 선수가 상대 ${user1Striker.player.playerName} 선수를 뚫고 지나갑니다. `;
// 미드필더 시도
if (user2RM < user2STR) {
resultMessage += `\n유저2의 ${user2Striker.player.playerName} 선수가 상대 ${user1Midfielder.player.playerName} 선수를 뚫고 지나갑니다. `;
// 수비수 시도
if (user2RD < user2STR) {
resultMessage += `\n유저2의 ${user2Striker.player.playerName} 선수가 상대 ${user1Defender.player.playerName} 선수를 뚫고 골을 넣었습니다!`;
currentUser_2Score++;
resultMessage += `\n현재스코어 ${currentUser_1Score} : ${currentUser_2Score}`;
} else {
resultMessage +=
'\n상대 수비수가 막았습니다. 공을 유저1 공격수에게 패스합니다.';
currentTurn++;
}
} else {
resultMessage +=
'\n상대 미드필더가 막았습니다. 공을 유저1 공격수에게 패스합니다.';
currentTurn++;
}
} else {
resultMessage +=
'\n상대 공격수가 막았습니다. 유저1 공격수가 드리블합니다.';
currentTurn++;
}
}
await prisma.gameSession.update({
where: { gameSessionPID },
data: {
sessionTurn: currentTurn,
userScore_1: currentUser_1Score,
userScore_2: currentUser_2Score,
},
});
res.status(200).json({ message: resultMessage });
} catch (err) {
next(err);
}
});
//경기종료
router.delete('/game-end', authMiddleware, async (req, res, next) => {
try {
const { gameSessionPID } = req.user;
//유저데이터
const user_data = await prisma.gameSession.findUnique({
where: {
gameSessionPID: gameSessionPID,
},
include: {
userData: {
include: {
playerSquadsData: {
include: {
playerEquipRostersData: true,
},
},
},
},
},
});
const userPID_1 = user_data.userData[0].userPID;
const userPID_2 = user_data.userData[1].userPID;
//유저스코어
if (user_data.userScore_1 > user_data.userScore_2) {
await prisma.userData.update({
where: {
userPID: userPID_1,
},
data: {
userScore: user_data.userData[0].userScore + 10,
},
});
await prisma.userData.update({
where: {
userPID: userPID_2,
},
data: {
userScore: user_data.userData[1].userScore - 10,
},
});
}
if (user_data.userScore_1 < user_data.userScore_2) {
await prisma.userData.update({
where: {
userPID: userPID_2,
},
data: {
userScore: user_data.userData[1].userScore + 10,
},
});
await prisma.userData.update({
where: {
userPID: userPID_1,
},
data: {
userScore: user_data.userData[0].userScore - 10,
},
});
}
if (user_data.userScore_1 === user_data.userScore_2) {
await prisma.userData.update({
where: {
userPID: userPID_1,
},
data: {
userScore: user_data.userData[0].userScore,
},
});
await prisma.userData.update({
where: {
userPID: userPID_2,
},
data: {
userScore: user_data.userData[1].userScore,
},
});
}
await prisma.gameSessionHistory.create({
data: {
userPID_1: userPID_1,
userPID_2: userPID_2,
userScore_1: user_data.userScore_1,
userScore_2: user_data.userScore_2,
},
});
await prisma.gameSession.delete({
where: {
gameSessionPID: gameSessionPID,
},
});
res.status(200).json({
경기종료: `${user_data.userScore_1} : ${user_data.userScore_2}`,
});
} catch (err) {
next(err);
}
});
export default router;
https://www.youtube.com/watch?v=JUIqi2PS8tk
영상 업로드 완료!