Skip to content

kharabiner/WatermelonGame

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

26 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🍉 Watermelon Game (수박 게임)

닌텐도 스위치의 인기 게임 "수박 게임"을 Java로 구현하고, 멀티플레이어 기능을 추가한 프로젝트입니다.

Java JBox2D Swing

📋 목차

🎮 게임 소개

수박 게임은 같은 종류의 과일을 합쳐서 더 큰 과일을 만들고, 최종적으로 수박을 만드는 것을 목표로 하는 퍼즐 게임입니다.

이 프로젝트는 원작의 게임 메커니즘을 Java로 재현하고, 실시간 멀티플레이어 대전 기능을 추가하여 여러 플레이어가 동시에 경쟁할 수 있도록 구현했습니다.

✨ 주요 기능

싱글플레이어 모드

  • ✅ 물리 엔진 기반의 현실적인 과일 움직임
  • ✅ 11단계의 과일 진화 시스템 (체리 → 딸기 → 포도 → 귤 → 오렌지 → 사과 → 배 → 복숭아 → 파인애플 → 멜론 → 수박)
  • ✅ 실시간 점수 시스템
  • ✅ 게임 오버 및 재시작 기능
  • ✅ 다음 과일 미리보기

멀티플레이어 모드

  • 🌐 최대 5명의 동시 플레이어 지원
  • 🎯 실시간 매칭 시스템
  • 👀 상대방 게임 화면 실시간 관찰
  • 🏆 순위 시스템 및 승패 판정
  • 🔄 재대결(Rematch) 기능
  • 💬 플레이어 닉네임 시스템

UI/UX

  • 🎨 커스텀 폰트 (CookieRun)
  • 🖼️ 고품질 과일 이미지 리소스
  • 📐 반응형 UI (최소 크기: 560x350)
  • 🎭 아름다운 배경 및 효과

🛠 기술 스택

게임 엔진 & 물리

  • JBox2D 2.2.1.1: 2D 물리 시뮬레이션
    • 중력 시뮬레이션
    • 충돌 감지 및 처리
    • 강체 역학

GUI & 그래픽

  • 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: 게임 상태 전송 객체

UI 컴포넌트

  • 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

멀티플레이어 실행

  1. 서버 시작
java -cp bin:jbox2d-library-2.2.1.1.jar GameServer
  1. 클라이언트 실행 (여러 터미널에서)
java -cp bin:jbox2d-library-2.2.1.1.jar WatermelonGame
  1. 게임 화면에서 "멀티플레이" 버튼 클릭
  2. 닉네임 입력 후 "매칭 시작" 버튼 클릭
  3. 2명 이상 매칭되면 3초 후 자동으로 게임 시작

🎲 게임 규칙

기본 규칙

  1. 과일 떨어뜨리기: 화면 상단에서 과일을 떨어뜨립니다
  2. 과일 합치기: 같은 종류의 과일이 충돌하면 한 단계 큰 과일로 진화합니다
  3. 점수 획득: 과일을 합칠 때마다 점수를 얻습니다
  4. 게임 오버: 과일이 상단 라인을 넘으면 게임이 종료됩니다

조작법

  • 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: 재대결 실패

GameStateDTO 구조

{
    "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/                           # 컴파일된 클래스 파일

🎨 주요 구현 내용

1. 물리 엔진 통합

  • JBox2D를 활용한 현실적인 물리 시뮬레이션
  • 중력, 마찰, 반발 계수 설정
  • 충돌 감지 및 콜백 처리

2. 과일 병합 시스템

// 같은 과일이 충돌하면 병합
if (fruitA.getName().equals(fruitB.getName())) {
    Fruit nextFruit = FruitType.getNextFruit(fruitA);
    // 새로운 과일 생성
    // 기존 과일 제거
    // 점수 추가
}

3. 네트워크 동기화

  • 논블로킹 I/O를 통한 실시간 상태 동기화
  • DTO 패턴을 활용한 효율적인 데이터 전송
  • 멀티스레딩을 통한 동시 다중 클라이언트 처리

4. 게임 상태 관리

  • 게임 시작, 진행, 종료 상태 관리
  • 재시작 및 재대결 로직
  • 순위 계산 및 결과 표시

🐛 알려진 이슈

  • 간헐적으로 과일 병합 시 물리 엔진 오류 발생 가능
  • 네트워크 지연 시 상대방 화면 동기화 지연 가능
  • 고해상도 디스플레이에서 이미지 스케일링 이슈

🔮 향후 개선 계획

  • 사운드 이펙트 추가
  • 배경 음악 추가
  • 더 다양한 게임 모드 (시간 제한, 서바이벌 등)
  • 리더보드 시스템
  • 리플레이 기능
  • 모바일 버전 개발

📝 라이선스

이 프로젝트는 교육 목적으로 제작되었습니다. 원작 게임의 저작권은 원저작자에게 있습니다.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages