본문 바로가기
게임 공부/게임 개발 일지

[Gomoku] 멀티 플레이어 오목 게임 개발 중...

by woohyeon 2020. 10. 30.
반응형

한달 전 정도부터 Win32 API로 멀티 플레이어 오목 게임을 개발 중이다.. 우리가 보통 생각하는 장르의 2D 또는 3D 게임을 만들어 보기 전에 간단하게 오목 한 번 만들어 보려 했는데 생각보다 어렵고 오래 걸린다.

C/C++, 간단한 소켓 프로그래밍 정도만 할 줄 아는 상태였는데 오목 게임 하나에 필요한 지식들이 꽤나 많다.

우선 윈도우즈 프로그램이기에 WinAPI를 어느정도 공부해야 된다. MFC는 예전에 조금 배웠었는데 그냥 raw api로 한번 익혀보는 게 학습용에선 더 나을 것 같아 WinAPI를 선택. 처음엔 간단한거 하나 구현하는 것도 어려웠는데 지금은 꽤나 익숙해졌다. OOP 형태로 구현하면 현재 학습 목적에 집중하지 못할 것 같아서 웬만한 건 API 그대로 사용했다.

그리고 Winsock API에 대해서도 어느정도 지식이 필요하다. 얼마 전에 <멀티 플레이어 게임 프로그래밍> 책을 샀는데 이론적으로나 코드로나 도움이 많이 됐다. 좀 읽다 보니 지금까지 했던 소켓 프로그래밍은 너무나 간단 했던 것... 어쨌든 오목 게임을 만들다 보니 논블로킹 소켓, 비동기와 같은 기법에 대해 좀 더 필요성을 느끼게 되었다. 그리고 객체 직렬화라는 것도 배웠다. 대충 설명하면 상대방에게 클래스 타입과 같은 복잡한 타입의 패킷을 보낼 때 효율적으로 전송하기 위해 클래스의 모든 멤버를 하나에 버퍼에 나열하는 것을 말한다. 이외에도 무슨 엔트로피 어쩌구와 같은 기법이 엄청 나게 많다. 오목 게임 자체가 상대방과 공유해야 하는 데이터가 그렇게 많지 않다보니 객체 직렬화도 의미가 크게 있을 것 같진 않았는데 그냥 연습삼아 억지로 만들어서 적용했다.

TCP 프로토콜을 사용했고 통신 형태는 P2P(Peer to Peer)로 했다. 게임을 시작하면 다음과 같은 메뉴가 나타나는데 방을 만들면 호스트가 되고, 방에 입장하는 사람은 클라이언트(peer)가 된다. 호스트와 클라이언트의 코드는 따로 나누지 않고 하나의 프로그램 내에서 루틴을 다르게 했다. 

       

이외에도 게임의 전체적인 흐름이 끊기지 않게 하기 위해 멀티 스레드에 대한 지식도 필요하다. 예를 들면 게임의 메인 루프는 계속 돌게 하면서 소켓과 관련된 부분은 또 따로 돌리도록 해야 한다. 

지금까지 구현된 건 호스트가 방을 만들고 대기하면 클라이언트가 입장할 수 있다. 그리고 각자에 맞는 화면이 그려진다. 두 명 모두 Ready 버튼을 누르면 방장(호스트)이 게임을 시작할 수 있도록 할 것이다. 항상 검은돌이 먼저 시작하며, 호스트에게 검은돌이 할당된다.

임시 서버 화면(검은돌)

그리고 오목판과 오목알을 놓는 부분, 승리 조건과 관련된 부분은 가장 초기에 구현해 놓았다. 네트워크만 적용시키면 된다. 처음엔 어떻게 할지 감이 잘 안잡혀서 내 생각대로 구현했다. 오목판은 파워포인트로 만들고 이미지로 저장해서 GDI+로 출력했다. 그리고 깔끔함과 같은 곳에 여러번 두는 것을 방지하기 위해 아래처럼 오목판의 좌표를 조사해서 위 사진처럼 각 교차점에만 돌이 놓아지도록 했다. 그런데 정확히 교차점만 클릭하도록 하면 불편하니까 교차점으로부터 어느정도 거리 이내를 클릭하면 자동으로 교차점에 돌이 놓아지도록 했다. 

   

빨리 마무리하고 Direct3D 공부해야겠다..




댓글