[Toy PJT] 포켓볼 시뮬레이터

Park Yeongseo·2024년 4월 17일
1

Project

목록 보기
4/5
post-thumbnail

소스코드는 바로 여기

1. 소개

작년 3월 SSAFY에서 진행했던 일타싸피를 대비하기 위해 만들었던 시뮬레이터다. 대회 자체는 월요일에 있었고, 그 전주 금요일에 싸피 내에서 실행해볼 수 있는 클라이언트가 제공됐던 걸로 기억한다. 다만 코드를 실행해보려면 서버와 통신을 해야만 했기 때문에, 로컬에서 실행해볼 수 있는 시뮬레이터를 만들어 동기들에게 뿌려 주면 대회 대비에 도움이 되지 않을까 싶어 제작했다.

대체로 잘 돌아가기는 했지만 몇 가지 버그들도 있었고, 그땐 패키지나 클래스에 대해서도 제대로 생각하지도 않았다. 사실 작년 하반기나 올해 2-3월에 제대로 정리를 해서 올렸다면 좋았겠지만, 이번에 경험 정리 겸 깃허브에 방치해놨던 코드들을 정리해보면서 버그 픽스도 하고 리팩토링도 하게 됐다. 여전히 리팩토링할 부분들도 있고 찾지 못한 버그들도 있겠지만, 관심이 있거나 나중에 일타싸피를 하게 될 사람들을 위해 올려본다.

2. 패키지 별 소개

사실 구성 요소들 사이의 의존 문제가 여전히 남아있지만, 전체적으로는 MVC 패턴을 따르는 방식으로 만들었다. 처음에 만들 땐 패키지를 따로 구분하지 않고 모든 파일을 디폴트 패키지에 넣어 놨고, 클래스 필드의 접근제한자도 모두 default를 썼지만, 이번에 수정하면서 패키지도 구분하고 접근제한자도 수정했다.

model

model 패키지에는 우선, 당구공에 해당하는 Ball 클래스가 있다. 내부에는 공의 현 위치, 다음 위치, 속력, 유효 여부, 색 등등의 필드가 있고, 부딪히고 튕기는 등의 물리를 구현한 메서드 등의 여러 메서드가 있다.
Vector 클래스는 이 공의 움직임 및 충돌 계산을 위해 필요한 2차원 벡터에 해당하는 클래스로, 단위 벡터, 내적, 크기를 구하는 등의 메서드들이 있다. 게임 내 여러 상수값들을 넣어 놓은 Constant 클래스도 있다.

controller

controller 패키지에는 게임의 상태 및 로직을 처리하는 Game 클래스가 있다.

view

view 패키지에는 게임 화면을 그리는 Display 클래스가 있다. 화면을 그리기 위해서는 자바 swing을 이용했다.

3. 사용법

코드를 테스트하려면 player.PlayergetAngle(), getPower() 메서드를 수정해야 한다. Player 클래스의 balls에는 현재 공들의 위치가 들어가 있으니 해당 정보를 활용하자.

public class Player {
	//이 플레이어의 순서
	private int order;

	//공의 위치. 첫 번째가 흰 공, 마지막이 검은 공이다. 
	//balls[i][0]이 x, balls[i][1]이 y다. 
	//포켓된 공의 좌표는 (0, 0)으로 바뀐다.
	private double[][] balls;

	public double getAngle();
	public double getPower();
}

getAngle()getPower()가 적당한 값들을 반환하도록 작성했다면, Main.main()을 실행해 프로그램을 실행하자. 실행 시 아래의 메시지가 터미널에 나타난다. 플레이어의 수와 플레이어 별 공 수(수구와 마지막 공을 제외)를 입력하면 GUI와 함께 게임이 시작된다.

플레이어 수(최대 2), 플레이어 별 공 수(최대 2)를 빈 칸 하나를 두고 입력해주세요.

단 실제 대회에서는 코드를 main()에 전부 작성하고 powerangle 변수를 서버에 메시지로 보내는 방식으로 되어있고, 각도도 이 시뮬레이터와 달리 270도? 돌려야 했던 걸로 기억한다. 또한 실제 사용하는 클라이언트는 이 시뮬레이터와 물리 상수들에 차이가 있고, 무엇보다 각 홀 주변의 생김새가 달라 이 시뮬레이터보다 넣기 어렵다. 이 시뮬레이터는 대회를 준비하기 위한 보조 도구 정도로만 사용하도록 하자.

4. 후기

재작년에도 비슷하게 공을 이용한 토이 프로젝트를 했던 적이 있기도 했고, 마침 그때 (아마) 자바 swing을 배워서 써먹어 보고 싶기도 해서, 금요일에 집에 돌아가자마자 시작해서 일요일 오후까지는 집 근처의 지하 스터디 카페에 박혀 시뮬레이터만 만들었다. 시뮬레이터를 다 만들고 나서는 (버그가 있기는 해도) '다음 날 대회 대비에 도움이 되겠지' 생각하며 뿌듯하게 잠에 들었지만, 그런 일은 일어나지 않았다.

정작 다음 날 대회 당일에는 늦잠을 자서 오전 테스트를 못 봤기 때문에...

profile
박가 영서라 합니다

0개의 댓글