2024-09-13 CH3 풋살 온라인 팀 프로젝트 시작 1

MOON·2024년 9월 13일
0

내일배움캠프 과제

목록 보기
6/36

오늘부터 "풋살 온라인" 팀 프로젝트 과제가 주어졌습니다.
풋살 온라인 게임서버에대해 생각하고 이해하면서 구현해보는 과제인 것 같습니다.
과제에는 필수기능, 도전기능으로 나누어 집니다.
필수기능을 다 구현하면 추가적으로 도전기능도 해보면서 추가적인 기능들도 구현해 보니다.

필수기능 내용부터 보겠습니다.

  1. 회원가입/ 로그인 기능
  • 회원가입시 기본적인 게임 캐시 설정
  • 로그인시 헤더에 토큰반환
  1. 캐시 구매 기능
  • 단순히 캐시를 구매하는 API 구현하기
  1. 선수 데이터 준비
  • 사전에 미리 선수 데이터를 DB에 준비해놓습니다.
  • 선수 데이터에는 : name, speed, power, defense 등등 선수에 필요한 데이터를 컬럼을 만들어 사용합니다.
  1. 선수 뽑기 기능
  • 선수를 1회 뽑을때마다 캐시를 소비합니다.
  • 가챠시스템 처럼 랜덤으로 선수를 뽑습니다.
  • (아마 그럼 뽑은 선수의 테이블이 필요할 것 같습니다.)
  1. 나만의 팀 꾸리기 기능
  • 뽑은 선수로 팀을 꾸려봅니다.
  • 팀을 꾸리지 않고는 게임을 진행할 수 없습니다.
  • 편의상 1팀에 최대 3명의 선수로 구성합니다.
  1. 축구 게임 기능

리얼 게임 서버 예시) 과제 내용입니다.

  • 클라이언트 유저가 입력한 데이터를 클라이언트 → 게임 서버로 전송하죠!

    • 이동, 패스, 슛, …
  • 그리고 게임 서버에서는 최신으로 도착한 데이터를 기반으로 상태 동기화를 합니다!

    • 고도의 동기화 기술이 구현이 되어있어야 랙 현상을 느끼지 않고 게임을 플레이 할 수 있어요!
  • 상태 동기화 시에 선수들끼리 충돌을 하면 어떻게 될까요?

    • 충돌 처리 테크닉을 사용해서 중요한 판정을 수행해야 됩니다! 이것도 게임 서버가 하죠!
    • 누군가 태클에 걸려서 넘어지거나 태클을 무시하거나 오히려 태클 건 친구가 날아가거나…
  • 하지만 아직 이러한 로직을 배운적이 없기에 단순하게 만듭니다.

  • 게임에 진행된 팀에서 선수들의 스텟을 가져옵니다. 각 스텟에 가중치를 부여합니다.
    각 가중치의 총합은 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`;
}

도전기능 내용입니다.

  1. 승리/ 패배 시 게임 점수 조정 기능
  • 기본 유저의 게임 점수는 1000점입니다.
  • 일단 심플하게 이기면 +10점 지면 -10점이 주어집니다.
  1. 유저 랭킹 조회 기능
  • 게임점수로 각 유저의 랭킹을 조회해 봅니다.
  • 승률과 승/무/패까지 적어주면 있어 보일 것 같습니다.
  1. 점수 기반 자동 매치 메이킹 기능
  • 게임 시작(진행)시 비슷한 점수대의 유저랑 매칭이되어 게임을 진행합니다.

스페셜 : 선수 강화 기능

  • 선수 강화 시스템을 도입해 봅니다.
  • 여러 강화 조건들이 많아 생각하면서 기획하고 구현해 봅니다.

밑 준비

사용할 라이브러리 및 도구

  • @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 란, 로깅하는 방식을 의미합니다!)
    아마 일단 여러 로깅을 남길 수도 있을것 같아 설치해 보았습니다.

// 개발에 도움되는 도구들

  • dotenv : 민감한 정보를 환경변수로 저장하는 .env 파일의 환경변수를 사용하기 위해 사용합니다.
  • nodemon : 개발환경에서 코드를 계속 수정해도 자동으로 서버를 재시작해 주어 여러번 서버를여는 번거로움을 줄여줍니다.
  • prettier : 코드 컨밴션등 이 프로젝트 파일의 코드 스타일을 지정해 일관성 있는 코드를 작성하는데 도움을 줍니다.

다음편에..

profile
안녕하세요

0개의 댓글