닌텐도 스위치의 인기 게임 "수박 게임"을 Java로 구현하고, 멀티플레이어 기능을 추가한 프로젝트입니다.
수박 게임은 같은 종류의 과일을 합쳐서 더 큰 과일을 만들고, 최종적으로 수박을 만드는 것을 목표로 하는 퍼즐 게임입니다.
이 프로젝트는 원작의 게임 메커니즘을 Java로 재현하고, 실시간 멀티플레이어 대전 기능을 추가하여 여러 플레이어가 동시에 경쟁할 수 있도록 구현했습니다.
- ✅ 물리 엔진 기반의 현실적인 과일 움직임
- ✅ 11단계의 과일 진화 시스템 (체리 → 딸기 → 포도 → 귤 → 오렌지 → 사과 → 배 → 복숭아 → 파인애플 → 멜론 → 수박)
- ✅ 실시간 점수 시스템
- ✅ 게임 오버 및 재시작 기능
- ✅ 다음 과일 미리보기
- 🌐 최대 5명의 동시 플레이어 지원
- 🎯 실시간 매칭 시스템
- 👀 상대방 게임 화면 실시간 관찰
- 🏆 순위 시스템 및 승패 판정
- 🔄 재대결(Rematch) 기능
- 💬 플레이어 닉네임 시스템
- 🎨 커스텀 폰트 (CookieRun)
- 🖼️ 고품질 과일 이미지 리소스
- 📐 반응형 UI (최소 크기: 560x350)
- 🎭 아름다운 배경 및 효과
- JBox2D 2.2.1.1: 2D 물리 시뮬레이션
- 중력 시뮬레이션
- 충돌 감지 및 처리
- 강체 역학
- Java Swing: GUI 프레임워크
- AWT: 그래픽 렌더링
- Custom Fonts: CookieRun 폰트
- Java Socket Programming: TCP/IP 기반 통신
- 멀티스레딩: 동시 다중 클라이언트 처리
- DTO 패턴: 게임 상태 직렬화 및 전송
- WatermelonGame: 메인 프레임 및 게임 시작점
- BackgroundPanel: 배경 및 화면 전환 관리
-
GamePanel: 싱글플레이어 게임 로직 및 렌더링
- 물리 시뮬레이션
- 과일 생성 및 병합
- 충돌 처리
- 점수 계산
-
Fruit: 과일 데이터 모델
-
FruitType: 과일 종류 및 속성 정의 (Enum)
-
GameServer: 게임 서버 (포트: 30000)
- 클라이언트 연결 관리
- 매칭 시스템
- 게임 룸 생성 및 관리
- 게임 상태 동기화
-
MultiplayerPanel: 멀티플레이어 UI 및 네트워크 통신
-
OpponentPanel: 상대방 게임 화면 표시
-
GameStateDTO: 게임 상태 전송 객체
- SelectPanel: 게임 모드 선택 화면
- SelectButton: 커스텀 버튼
- ScorePanel: 점수 표시 패널
- BorderedLabel: 테두리가 있는 라벨
- Java JDK 8 이상
- JBox2D 라이브러리 (jbox2d-library-2.2.1.1.jar)
# 프로젝트 디렉토리로 이동
cd WatermelonGame/WatermelonGame
# 컴파일
javac -cp .:jbox2d-library-2.2.1.1.jar src/*.java -d bin
# 실행
java -cp bin:jbox2d-library-2.2.1.1.jar WatermelonGame- 서버 시작
java -cp bin:jbox2d-library-2.2.1.1.jar GameServer- 클라이언트 실행 (여러 터미널에서)
java -cp bin:jbox2d-library-2.2.1.1.jar WatermelonGame- 게임 화면에서 "멀티플레이" 버튼 클릭
- 닉네임 입력 후 "매칭 시작" 버튼 클릭
- 2명 이상 매칭되면 3초 후 자동으로 게임 시작
- 과일 떨어뜨리기: 화면 상단에서 과일을 떨어뜨립니다
- 과일 합치기: 같은 종류의 과일이 충돌하면 한 단계 큰 과일로 진화합니다
- 점수 획득: 과일을 합칠 때마다 점수를 얻습니다
- 게임 오버: 과일이 상단 라인을 넘으면 게임이 종료됩니다
- A 키 또는 ← 키: 왼쪽으로 이동
- D 키 또는 → 키: 오른쪽으로 이동
- S 키 또는 ↓ 키: 과일 떨어뜨리기
체리 (30px) → 딸기 (40px) → 포도 (60px) → 귤 (70px) → 오렌지 (90px) →
사과 (110px) → 배 (130px) → 복숭아 (160px) → 파인애플 (180px) →
멜론 (220px) → 수박 (260px)
각 과일 합성 시 획득 점수:
- 체리 병합: 33점
- 딸기 병합: 43점
- 포도 병합: 61점
- 귤 병합: 69점
- 오렌지 병합: 89점
- 사과 병합: 114점
- 배 병합: 129점
- 복숭아 병합: 161점
- 파인애플 병합: 177점
- 멜론 병합: 220점
- 포트: 30000
- 프로토콜: TCP/IP
- 최대 동시 플레이어: 5명
- 매칭 대기 시간: 3초
서버와 클라이언트 간 다음 메시지를 주고받습니다:
READY:<닉네임>: 매칭 준비CANCEL: 매칭 취소GAME_STATE:<JSON>: 게임 상태 전송GAME_OVER:<점수>: 게임 오버REMATCH: 재대결 투표
WAITING: 대기 중GAME_START:<플레이어수>:<플레이어목록>: 게임 시작OPPONENT_STATE:<JSON>: 상대방 상태RANK:<순위>: 순위 정보GAME_END:<결과>:<순위>: 게임 종료REMATCH_REQUEST: 재대결 요청REMATCH_ACCEPTED: 재대결 승인REMATCH_FAILED: 재대결 실패
{
"nickname": "플레이어 닉네임",
"score": 점수,
"isGameOver": 게임오버 여부,
"fruits": [
{
"type": "과일 이름",
"x": x 좌표,
"y": y 좌표,
"radius": 반지름
},
...
]
}WatermelonGame/
├── jbox2d-library-2.2.1.1.jar # JBox2D 물리 엔진 라이브러리
├── src/ # 소스 코드
│ ├── WatermelonGame.java # 메인 프레임
│ ├── BackgroundPanel.java # 배경 패널
│ ├── GamePanel.java # 게임 패널 (싱글)
│ ├── MultiplayerPanel.java # 멀티플레이어 패널
│ ├── OpponentPanel.java # 상대방 화면 패널
│ ├── GameServer.java # 게임 서버
│ ├── GameStateDTO.java # 게임 상태 DTO
│ ├── Fruit.java # 과일 모델
│ ├── FruitType.java # 과일 타입 Enum
│ ├── SelectPanel.java # 선택 화면
│ ├── SelectButton.java # 커스텀 버튼
│ ├── ScorePanel.java # 점수 패널
│ ├── BorderedLabel.java # 테두리 라벨
│ └── resources/ # 리소스 파일
│ ├── base/ # 이미지 리소스
│ │ ├── 00_cherry.png # 체리
│ │ ├── 01_strawberry.png # 딸기
│ │ ├── 02_grape.png # 포도
│ │ ├── 03_gyool.png # 귤
│ │ ├── 04_orange.png # 오렌지
│ │ ├── 05_apple.png # 사과
│ │ ├── 06_pear.png # 배
│ │ ├── 07_peach.png # 복숭아
│ │ ├── 08_pineapple.png # 파인애플
│ │ ├── 09_melon.png # 멜론
│ │ ├── 10_watermelon.png # 수박
│ │ ├── back.png # 배경
│ │ ├── background.png # 배경
│ │ ├── bubble.png # 버블
│ │ ├── cloud.png # 구름
│ │ └── evolution.png # 진화 효과
│ └── fonts/ # 폰트 리소스
│ ├── CookieRun Bold.ttf
│ └── CookieRun Regular.ttf
└── bin/ # 컴파일된 클래스 파일
- JBox2D를 활용한 현실적인 물리 시뮬레이션
- 중력, 마찰, 반발 계수 설정
- 충돌 감지 및 콜백 처리
// 같은 과일이 충돌하면 병합
if (fruitA.getName().equals(fruitB.getName())) {
Fruit nextFruit = FruitType.getNextFruit(fruitA);
// 새로운 과일 생성
// 기존 과일 제거
// 점수 추가
}- 논블로킹 I/O를 통한 실시간 상태 동기화
- DTO 패턴을 활용한 효율적인 데이터 전송
- 멀티스레딩을 통한 동시 다중 클라이언트 처리
- 게임 시작, 진행, 종료 상태 관리
- 재시작 및 재대결 로직
- 순위 계산 및 결과 표시
- 간헐적으로 과일 병합 시 물리 엔진 오류 발생 가능
- 네트워크 지연 시 상대방 화면 동기화 지연 가능
- 고해상도 디스플레이에서 이미지 스케일링 이슈
- 사운드 이펙트 추가
- 배경 음악 추가
- 더 다양한 게임 모드 (시간 제한, 서바이벌 등)
- 리더보드 시스템
- 리플레이 기능
- 모바일 버전 개발
이 프로젝트는 교육 목적으로 제작되었습니다. 원작 게임의 저작권은 원저작자에게 있습니다.