Linux에서 C로 구현된 터미널 기반 멀티플레이어 체스 게임입니다. 컴파일하는 동안 가벼운 체스 게임을 즐기고 싶은 개발자를 위해 설계되었습니다 — GUI 오버헤드 없이 순수한 CLI의 매력을 경험하세요!
- 전체 코드 라인 수(C언어): 6,108라인
- 클라이언트 3,345라인, 서버 1,300라인, 공통 코드 773라인
![]() |
![]() |
![]() |
|---|---|---|
| 권영준 | 김문기 | 황부연 |
| 24인컴 체스 룰, 기물 정의, PGN 파서 등 구현 |
24글솝 UI 구현, 리플레이 구현 |
24글솝 PM, 프로젝트 세팅, UI/서버/통신 구현 |
- 닉네임만 입력해 간편 접속
- 중앙 서버 기반 자동 매칭
- TUI 기반 체스 UI (체스판, 기물, 메뉴 등)
- 체스 규칙 완전 구현 (캐슬링, 프로모션, 앙파상, 3수 동형 등)
- PGN 포맷으로 기보 저장 및 리플레이
- 클라이언트 ↔ 서버 실시간 동기화
- 실시간 채팅 기능
- 제한 시간 동기화 (타이머)
- 마우스 클릭을 통한 체스판 조작 지원 (ncurses 활용)
체스판에서 옮길 기물을 클릭한 후, 옮길 위치를 클릭하여 움직일 수 있습니다.
- 리플레이는 게임 종료 시 자동으로 현재 작업 디렉토리의
replays폴더에 저장됩니다. - 리플레이 파일은 확장자가
.pgn인 파일로 저장됩니다. - 클라이언트 실행 후
2. Replay메뉴를 통해 리플레이 파일을 확인할 수 있습니다. - 화살표 키 또는 엔터키로 시점을 이동할 수 있으며 Space 키로 자동 재생/정지를 할 수 있습니다.
replays/sample.pgn파일에 샘플 PGN 파일이 있습니다. 리플레이 기능을 테스트해보세요!
프로젝트 구조를 표현한 다이어그램 이미지입니다.
| Area | Technologies & Tools |
|---|---|
| Language | C |
| Networking | Socket API (socket, bind, listen, accept, select) |
| Multithreading | pthread, mutex |
| UI | ncurses, ASCII escape codes |
| Data Format | protobuf-c |
| Game Records | PGN (Portable Game Notation) |
| Build & Deploy | CMake, Docker, GitHub Actions |
- 운영체제: Linux (Ubuntu 24.04)
- 컴파일러: gcc
- 빌드 도구: CMake
- 협업 도구: GitHub, GitHub Actions (CI/CD)
이 프로젝트는 클라이언트, 서버, 그리고 공통 코드를 분리하여 관리하며, CMake를 통해 빌드 시스템을 구성합니다.
multiplay-chess/
│
├── CMakeLists.txt # 최상위 CMake 설정
├── build.sh # 빌드 스크립트
├── README.md
│
├── common/ # 클라이언트와 서버가 공통으로 사용하는 코드
│ ├── CMakeLists.txt
│ └── ... (common source/headers)
│
├── client/ # 클라이언트 전용 코드
│ ├── CMakeLists.txt
│ └── ... (client source/headers)
│
└── server/ # 서버 전용 코드
├── CMakeLists.txt
└── ... (server source/headers)
- 공통 코드는
common/에 두고, 라이브러리로 빌드해서 클라이언트/서버에서 링크합니다. - 클라이언트/서버는 각각 독립적인 실행 파일로 빌드 가능합니다
-
Cmake 설치 필요
sudo apt install cmake
-
라이브러리 설치 필요
sudo apt install build-essential pkg-config protobuf-compiler protobuf-c-compiler libprotobuf-dev libprotobuf-c-dev libncurses-dev
아래와 같이 make 명령어 또는 build.sh 스크립트를 사용하여 빌드할 수 있습니다.
-
전체 빌드 (client, server 모두):
make # 또는 ./build.sh -
클라이언트만 빌드:
make client # 또는 ./build.sh client -
서버만 빌드:
make server # 또는 ./build.sh server -
빌드 파일 삭제
make clean # 또는 rm -rf build/
빌드가 완료되면 build/client/client, build/server/server에 실행 파일이 생성됩니다.
-
클라이언트 실행:
./run.sh client # 또는 ./build/client/client -
서버 실행:
./run.sh server # 또는 ./build/server/server
클라이언트/서버 기본 포트는 8080입니다. 포트를 변경하려면 명령행 인자 -p를 사용하세요.
- 클라이언트 실행 (8081 포트) 예시:
./run.sh client -p 8081
- 서버 실행 (8081 포트) 예시:
./run.sh server -p 8081
클라이언트의 경우, 게임서버의 호스트명(IP주소, 도메인 이름 등)도 변경할 수 있습니다. 기본값은 localhost(127.0.0.1)입니다. 호스트명을 변경하려면 명령행 인자 -h를 사용하세요.
- 클라이언트 실행 (8081 포트, 192.168.0.100 호스트) 예시:
./run.sh client -p 8081 -h 192.168.0.100
- 클라이언트 로그:
logs/chess_client_[PID].log(PID별로 파일 출력) - 서버 로그: 콘솔에 색상과 함께 직접 출력
DEBUG: 상세한 디버그 정보INFO: 일반 정보 메시지WARN: 경고 메시지ERROR: 오류 메시지FATAL: 심각한 오류 메시지
기본적으로 클라이언트는 실행 시 로그를 logs/ 디렉토리에 저장합니다.
watch_logs.sh 스크립트를 사용하여 클라이언트의 실시간 로그를 모니터링할 수 있습니다.
./watch_logs.sh-
클라이언트 로그 모니터링 (권장):
# 모든 클라이언트 로그를 색상과 함께 표시 ./watch_logs.sh # 단일 로그 파일만 모니터링 ./watch_logs.sh --single # 에러/경고만 보기 ./watch_logs.sh --error # ERROR, FATAL만 ./watch_logs.sh --warn # WARN 이상 ./watch_logs.sh --info # INFO 이상 # 도움말 보기 ./watch_logs.sh --help
Protocol Buffers(protobuf)는 Google에서 개발한 데이터 직렬화 형식입니다. 이 프로젝트에서는 protobuf-c를 사용하여 C 언어로 구현된 클라이언트-서버 간의 통신 메시지를 정의하고 직렬화합니다.
- 효율적인 직렬화: JSON이나 XML보다 더 작은 크기로 데이터를 직렬화할 수 있습니다.
- 타입 안전성: 컴파일 시점에 메시지 구조를 검증합니다.
- 언어 독립성: 다양한 프로그래밍 언어에서 사용 가능합니다.
- 자동 코드 생성: .proto 파일로부터 C 코드를 자동 생성합니다.
common/proto/:.proto파일 위치common/generated/:protoc-c로 생성된 C 소스/헤더 파일 위치
기본적으로 프로젝트에서 사용하는 메시지 스펙은 common/proto/message.proto 파일에 정의되어 있습니다. 이 파일을 수정하여 새로운 메시지 타입을 추가할 수 있습니다.
새 protobuf 메시지를 추가하려면 다음 단계를 따르세요:
- protobuf 메시지 정의를
common/proto/message.proto에 추가 - 아래 명령어로 C 파일 생성
protoc-c -I common/proto --c_out=common/generated/ common/proto/message.proto또는 빌드 스크립트(./build.sh)를 실행하면 자동으로 컴파일됩니다.




