뱀과 사다리 (Linux)
게임서버프로그래밍입문 A+System V 공유 메모리 갱신과 SDL2 렌더링이 맞물리는 반복 구조를 제안하고, 구동 시험으로 화면 표시 완성을 도왔습니다.
- 개발 기간
- 2024년 2학기
- 팀 구성
- 대학 수업 팀 프로젝트
- 담당 역할
- 공유 메모리·렌더링 갱신 루프 제안 및 구동 검증
플레이 영상
‘게임서버프로그래밍입문’ 수업에서 C 언어와 Linux 프로세스 간 통신(IPC)을 활용해 만든 2인용 턴제 보드게임입니다. 고전 게임 ‘뱀과 사다리’를 모티브로 삼아, 주사위를 굴려 말을 옮기고 특정 칸의 이동 규칙이나 미니게임 결과에 따라 앞뒤로 이동합니다.
아래의 멀티프로세스 통신 체계는 팀 전체가 함께 구축한 결과물이며, 그중 저는 공유 메모리 데이터와 SDL2 렌더링이 맞물려 돌아가는 갱신 루프를 설계·제안하고 테스트 코드로 동작을 검증해 담당 팀원이 그래픽 파트를 완성할 수 있도록 도왔습니다.
문제: 바뀐 게임 정보를 언제 그릴 것인가
공유 메모리에 진행 상태가 기록되더라도, 그래픽 프로세스가 어느 시점에 값을 읽고 다시 그릴지 정해지지 않으면 플레이어는 말의 이동이나 턴 변화를 제때 볼 수 없었습니다. 그래픽 출력을 맡은 팀원이 이 시점을 잡는 데 어려움을 겪고 있어 전체 동작 순서를 명확히 정리해야 했습니다.
저는 공유 메모리 상태 읽기 → 게임 규칙 처리 → 변경된 보드 상태 렌더링을 한 주기로 묶어 반복하는 루프 구조를 제안했습니다. 작은 프로토타입으로 데이터 변경 직후 그래픽 창이 정상적으로 갱신되는지 함께 확인했고, 팀원은 이 뼈대를 바탕으로 전체 보드와 연출 작업을 마무리했습니다.
이 과정을 통해 프로세스 간 데이터 공유와 그래픽 렌더링은 각자 따로 작성하는 데서 끝나지 않고, 누가 어떤 순서로 상태를 소비할지까지 맞물려야 비로소 하나의 프로그램으로 동작한다는 점을 배웠습니다.
멀티프로세스 통신 구조
단일 Linux 환경에서 매니저 프로세스 1개와 플레이어 클라이언트 2개를 띄워 진행합니다. 두 참가자가 동일한 방 번호를 입력하면, 해당 번호를 키(Key)로 삼아 같은 공유 메모리 세그먼트에 접속합니다. 그래픽 창을 띄우기 위해 Linux 데스크톱 또는 WSLg 환경을 사용합니다.
공유 구조체인 GameData에는 두 말의 좌표, 현재 턴, 승자, 진행 여부, 지름길 연결 정보, 미니게임 칸 위치가 담깁니다. 매니저가 shmget으로 메모리 공간을 할당하면 양쪽 클라이언트가 이를 연결(shmat)해 동일한 보드 상태를 바라봅니다.
턴 제어에는 POSIX 시그널을 썼습니다. 매니저가 현재 차례인 측에 SIGUSR1을 보내 행동을 시작시키고, 클라이언트가 이동과 미니게임을 마친 뒤 SIGUSR2로 완료를 알리면 매니저가 도착 여부를 판정한 뒤 다음 차례로 넘깁니다. 승부가 나면 SIGINT로 양측에 종료를 통보합니다.
각 클라이언트는 fork로 SDL 렌더링 전용 자식 프로세스를 생성하고, 양방향 파이프(Pipe)를 통해 마우스 클릭 좌표와 안내 문구를 주고받습니다. 보드판과 캐릭터는 SDL2 및 SDL2_image로 그리고, 한글 안내는 SDL2_ttf로 출력합니다. 미니게임 정답 입력은 터미널에서 받고 결과 연출은 그래픽 창에 반영했습니다.
플레이 규칙과 결과
자신의 차례에 창을 클릭하면 16 사이의 주사위가 굴러가며 말이 전진합니다. 문어 다리가 놓인 칸에 멈추면 이어진 칸으로 이동하고, 미니게임 칸에 도착하면 퀴즈·타자 연습·업다운 중 하나가 무작위로 시작됩니다. 성공하면 12칸 추가로 나아가고 실패하면 1~2칸 밀려나며, 먼저 마지막 칸에 도달한 쪽이 승리합니다.
데이터 동기화와 렌더링 주기를 일찍 정돈한 덕분에 팀원들과 기한 내에 프로젝트를 완성할 수 있었고, 해당 과목에서 A+ 성적을 거두었습니다.