Skip to content

Latest commit

 

History

History
71 lines (56 loc) · 5.32 KB

File metadata and controls

71 lines (56 loc) · 5.32 KB

Baseball Simulator (야구 시뮬레이터)

1. 프로젝트 소개

본 프로젝트는 두 팀의 라인업과 선수 개별 스탯을 기반으로 9이닝 야구 경기를 자동으로 예측하고 진행하는 시뮬레이터입니다.

타자와 투수의 실제 통계 데이터를 바탕으로 확률적 모델을 설계하여, 경기 흐름을 현실감 있게 구현하였습니다. JavaFX를 활용한 GUI 시각화 기능을 통해 사용자는 실시간으로 경기 상황을 파악할 수 있습니다.

2. 주요 기능

  • 팀 라인업 구성:
    • CSV 데이터 소스를 바탕으로 사용자로부터 양 팀의 팀명, 타자 라인업(9명), 투수 스케줄(4명)을 입력받습니다.
  • 스탯 기반 확률 모델:
    • 타자 스탯: 타율, 출루율, 장타율, 삼진율, 볼넷률, 도루성공률
    • 투수 스탯: 피안타율, WHIP, 피장타율, 삼진율, 볼넷률
    • 각 타석의 결과는 타자와 투수의 스탯을 조합한 확률(예: 안타 확률 = (타율 + 피안타율) / 2)에 따라 결정됩니다.
  • 경기 시뮬레이션 엔진:
    • 9이닝 자동 진행, 공/수 전환, 회차 관리를 수행합니다.
    • 안타, 홈런, 볼넷, 아웃 등 결과에 따른 주자 이동 로직 및 점수 계산을 처리합니다.
    • 3아웃 공수 교대, 9회말 끝내기 등 실제 경기 종료 조건을 모두 처리합니다.
  • GUI 시각화 및 로그:
    • 시각화: JavaFX를 활용하여 점수판, 주자 상태(베이스 다이아몬드), 아웃 카운트(빨간색 원)를 시각적으로 제공합니다.
    • 로그 출력: 이닝별 결과, 타석별 상세 로그, 홈런/득점 등 주요 이벤트를 텍스트로 출력합니다.
    • 진행 모드: '일반 진행'(타석당 1초 지연)과 '빠른 진행'(즉시 종료) 모드를 지원합니다.

3. 개발 환경

  • 개발 언어: Java 17
  • GUI: JavaFX (실행 시 JavaFX SDK 필요)
  • 빌드 도구: 없음

4. 실행 방법

  1. 프로그램 실행 (JavaFX 지원 환경 필요)
  2. 원정팀의 팀 이름을 입력합니다.
  3. 원정팀 타자 9명의 이름을 타순대로 공백으로 구분하여 입력합니다.
  4. 원정팀 투수 4명의 이름을 순서대로 공백으로 구분하여 입력합니다.
  5. 홈팀에 대해서도 2~4번 과정을 동일하게 반복합니다.
  6. 진행 방식 버튼을 선택합니다:
    • 빠른 진행: 클릭 즉시 9이닝 시뮬레이션이 완료되며, 최종 결과와 전체 로그가 출력됩니다.
    • 일반 진행: 클릭 시 각 타석당 1초의 지연 시간을 두고 경기가 진행됩니다. GUI를 통해 실시간 경기 상황(아웃 카운트, 주자 상태)을 확인할 수 있습니다.

5. 프로젝트 구조 (UML)

본 프로젝트는 객체지향 설계를 기반으로 역할별 모듈을 분리하고 단일 책임 원칙을 따르도록 구성되었습니다.

주요 클래스 설명

  • 도메인 모델 (Data)
    • Player: BatterPitcher의 공통 부모 추상 클래스.
    • Batter: 타자 정보(타율, 출루율, 장타율 등)를 관리합니다.
    • Pitcher: 투수 정보(피안타율, WHIP, 피장타율 등)를 관리합니다.
    • Team: 타자 라인업(List<Batter>)과 투수 스케줄(List<Pitcher>)을 관리합니다.
  • 경기 상태 및 로직 (Engine)
    • Game: 이닝, 아웃 카운트, 점수, 현재 주자 상태(BaseState) 등 전체 경기의 상태를 관리합니다.
    • BaseState: 1루~3루 주자 상태를 관리하며, 타석 결과에 따른 주자 진루 및 득점 계산을 담당합니다.
    • OutcomeType (enum): 타석 결과(단타, 홈런, 삼진 등)를 열거형으로 정의합니다.
    • AtBatOutcome: OutcomeType을 포함하여 한 타석의 상세 결과를 나타냅니다.
  • GUI (View)
    • SimulatorGUI: 시뮬레이터의 전체 GUI를 구성하는 진입점입니다.
    • SimulatorEngineGUI: Game 객체를 받아 실제 경기 진행 상황을 시각화하며, LoggerGUI와 상호작용하는 제어자 역할을 합니다.
    • LoggerGUI: 타석 결과 및 주요 이벤트를 GUI에 텍스트로 출력합니다.

6. 개발 중 이슈 및 해결

  • 이슈 1: 9회말 끝내기 상황에서 홈팀이 이겼음에도 3아웃까지 경기가 계속 진행되는 문제.
    • 해결: simulateHalfInning() 또는 simulateGame() 함수 내에, 9회말이면서 홈팀이 앞서는 경우 경기를 즉시 종료하는 분기 조건을 추가하여 해결했습니다.
  • 이슈 2: 시뮬레이션이 한 번에 전부 실행되어 사용자가 경과를 따라가기 어렵고 재미가 반감되는 문제.
    • 해결: '일반 진행' 모드를 추가하여, simulateAtBat() 함수 실행 사이에 1초의 지연 시간(Thread.sleep)을 부여함으로써 사용자가 각 타석의 결과를 충분히 확인하고 따라갈 수 있도록 개선했습니다.
  • 이슈 3: SimulatorEngineGUIGame, BaseState, LoggerGUI 등 다수 객체를 복잡하게 참조하여 의존성이 높아지고 유지보수가 어려운 문제.
    • 해결: MVC 패턴을 일부 도입하여, SimulatorEngineGUI를 중간 제어자(Controller) 역할로 두고, 각 구성 요소가 인터페이스를 통해 상호작용하도록 구조를 개선했습니다.