오늘부터 "풋살 온라인" 팀 프로젝트 과제가 주어졌습니다.
풋살 온라인 게임서버에대해 생각하고 이해하면서 구현해보는 과제인 것 같습니다.
과제에는 필수기능, 도전기능으로 나누어 집니다.
필수기능을 다 구현하면 추가적으로 도전기능도 해보면서 추가적인 기능들도 구현해 보니다.
필수기능 내용부터 보겠습니다.
리얼 게임 서버 예시) 과제 내용입니다.
클라이언트 유저가 입력한 데이터를 클라이언트 → 게임 서버로 전송하죠!
그리고 게임 서버에서는 최신으로 도착한 데이터를 기반으로 상태 동기화를 합니다!
상태 동기화 시에 선수들끼리 충돌을 하면 어떻게 될까요?
하지만 아직 이러한 로직을 배운적이 없기에 단순하게 만듭니다.
게임에 진행된 팀에서 선수들의 스텟을 가져옵니다. 각 스텟에 가중치를 부여합니다.
각 가중치의 총합은 1로 지정하여 사용합니다.
각 팀 각 선수마다 가중치를 부여한 스탯을 모두 더해서 두 팀의 총 스탯 점수를 구합니다.
총스탯 점수를 가지고 점수가 높은 팀이 유리하게 승리조건을 가집니다.
여기선 두팀 총 점수를 합쳐 그 합친 값만큼의 랜덤수를 가져옵니다. 랜덤 수로 승리를 결정합니다.
과제 예시 코드입니다.
// A 유저 팀과 B 유저 팀의 총 점수
const scoreA = 229.9;
const scoreB = 229.45;
// 최대 점수는 두 팀의 총 점수의 합으로 하시면 됩니다!
const maxScore = scoreA + scoreB;
const randomValue = Math.random() * maxScore;
if (randomValue < scoreA) {
// A 유저 승리 처리
const aScore = Math.floor(Math.random() * 4) + 2; // 2에서 5 사이
const bScore = Math.floor(Math.random() * Math.min(3, aScore)); // aScore보다 작은 값을 설정
result = `A 유저 승리: A ${aScore} - ${bScore} B`;
} else {
// B 유저 승리 처리
const bScore = Math.floor(Math.random() * 4) + 2; // 2에서 5 사이
const aScore = Math.floor(Math.random() * Math.min(3, bScore)); // bScore보다 작은 값을 설정
result = `B 유저 승리: B ${bScore} - ${aScore} A`;
}
도전기능 내용입니다.
스페셜 : 선수 강화 기능
밑 준비
사용할 라이브러리 및 도구
@prisma/client : js코드로, prisma를 통한 DB 수정작업을 할 수 있도록 해주는 도구
bcrypt : 비밀번호 저장시 암호화를 하기위해 그리고 로그인시 입력한 비밀번호와 암호화된 비밀번호를 비교할때 이용합니다.
express : Node js 환경에서 서버개발에 필요한 웹 프레임워크로 여러 기능을 사용할 수 있습니다. API 개발을 위해 사용합니다.
joi : 요청한 데이터의 유효성검사를 하기위해 가져왔습니다. Node.js에서 매우 유용한 데이터 유효성 검사 라이브러리 입니다.
jsonwebtoken : JWT 토큰을 발급하고 인증, 인가하는 과정에 유용하게 사용합니다.
prisma : ORM으로, DB와 상호작용을 유연하게 해주는 라이브러리입니다. 여기서 스키마를 정해 테이블 모델링을 코드로 작성하여 실제 DB에 생성하게 할 수 있게 해주고 DB와 관련되 여러기능을 제공해 줍니다. Node js 및 TypeScript 환경에서 데이터베이스 작업을 간소화하고 효율화하는 강력한 도구입니다.
winston : Node.js에서 사용할 수 있는 로깅 라이브러리 winston 은 다수의 transport 를 지원하는 비동기 로깅 라이브러리 입니다. (여기서 transport 란, 로깅하는 방식을 의미합니다!)
아마 일단 여러 로깅을 남길 수도 있을것 같아 설치해 보았습니다.
// 개발에 도움되는 도구들
다음편에..