Skip to content

Instantly share code, notes, and snippets.

@jacking75
Last active January 1, 2024 07:11
Show Gist options
  • Save jacking75/4813093e655340ffed585e5058116567 to your computer and use it in GitHub Desktop.
Save jacking75/4813093e655340ffed585e5058116567 to your computer and use it in GitHub Desktop.
게임 서버 학습 목적으로 구현하는 게임 콘텐츠

서버에 게임 로직이 있음.

특징

  • PVP 중심의 대전 오목 게임.
  • AI와 붙는 것은 없다.
  • 광고로 수익을 번다. 클라이언트에서 광고를 보았다고 알려주면 서버는 확인 후 게임 머니를 준다
  • 대전 등을 하려면 광고 클릭을 통해 ‘게임 머니’를 벌어야 한다.
  • 대전에서 이기면 상대방의 ‘게임 머니’를 뺏을 수 있다.
  • 1:1 뿐만이 아닌 다:다 대전도 있다.

1:1 대전

  • 매칭 신청을 하면 적당한 상대방과 대전하도록 한다.
  • 레이팅 기반으로 레벨을 쌓을 수 있도록 해서 최대한 비슷한 레벨끼리 대전하도록 한다.
  • 대전에는 ‘게임 머니’가 필요하고, 승자는 패자는 ‘게임 머니’를 가져간다. ‘게임 머니’를 다 가져가지 않고 70%만 가져간다. 30%는 대전료

다:다 대전

  • 다:다(예 5:5) 대전을 할 수 있다.
  • 참여 숫자가 정해진 방에서 대전을 한다. 최대 인원 수 이내까지 들어갔다 나갔다 할 수 있다.
  • 흑/백으로 나눈 후 백팀의 차례가 되면 선수 중 선착순으로 돌을 놓을 수 있다. 선착 순은 방에 들어온 순서대로 돌을 놓기를 사전에 신청한 순서.
  • 돌을 한번이라도 놓으면 대전 머니를 걸어야 하고, 경기가 끝날 때 이긴 팀의 방에 있는 사람만 게임 머니를 가져간다.

구현 조건

  • 대전 게임이므로 실시간 통신을 한다.

  • 구글 클라우드를 사용한다.

  • API 서버 부분은 Cloud Run을 사용하고 C#을 사용한다.

  • 실시간 서버는 C# 혹은 C++을 사용한다.

    • C#을 사용하면 MemoryPack, C++을 사용하면 ProtoBuf를 사용한다.
  • 클라이언트는 C#의 Winform으로 만든다.

  • Scale-Out 구조로 만든다.

  • 새로운 블럭이 나올 때 클라이언트에 알림.

    • 새로운 블럭의 타입
    • 생성 시간
  • 클라이언트는 새로운 블럭이 멈추면 서버에 알림

    • 서버는 생성 했을 때의 시간과 비교하여 어뷰징은 아닌지 조사한다.
    • 블럭이 멈출 수 있는 곳인지 확인한다.
    • 블럭의 위치를 저장한다
  • 클라이언트는 블럭이 사라짐을 알림

    • 서버는 블럭이 저장된 데이터를 조사하여 사라질 수 있는지 확인한다.
  • 블럭 멈춤과 블럭 사라짐은 하나의 패킷으로 보내도록 한다.

  • 모바일 게임서버(Web API 서버 방식) 실습을 목적으로 XX 퍼즐 게임을 유사하게 만들어본다
  • 재미있는 혹은 아이디어 넘치는 게임을 만드는 것이 목적이 아니고 기술적 학습 목적으로 게임서버를 만드는 것이 목적이다.
  • 클라이언트는 구현하지 않는다. 게임 플레이 컨텐츠는 클라이언트에 있다고 가정한다.
    • 테스트를 할 때는 Postman 같은 툴을 사용을 추천한다.
  • 여기에서 제시한 최소 기능을 구현한 후 XX 게임을 참고해서 기능을 더 만들어본다. 특히 유저 아이템은 꼭 만들어보기를
  • API 서버를 만든다.

구현 조건

  • WebAPI서버는 스케일아웃이 가능해야 한다. 로드밸런스를 사용한다.
  • 인증을 한 후(즉 로그인 후)의 모든 요청에 대해서 아래를 꼭 확인한다
    • 인증 받은 유저인지 확인
    • 클라이언트 앱 버전 확인
    • 클라이언트 마스터데이터(기획데이터) 버전 확인
  • DB는 샤딩을 하지 않는다.
  • 마스터 데이터(기획 데이터)는 서버 실행 후에는 변경되지 않는다.
  • 메모리 디비는 Redis만 사용한다.

기능 리스트

  • 계정 생성
    • 개정 정보 이외에 필수적인 유저의 게임데이터도 이때 만든다
  • 로그인
  • 유저의 게임데이터 로딩(유저에게 보내기)
  • 경험치, 레벨, 게임머니 관리
  • 엑셀로 저장한 마스터데이터를 DB에 넣는 Tool 만들기
    • 게임서버는 시작 시에 이 데이터를 읽어서 메모리에 올린다
  • 새로운 스테이지 입장
  • 스테이지 플레이 결과 저장
  • 출석부
  • 우편함
  • 실시간 랭킹
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment