프로그램 구조
Card 클래스
게임에서 사용되는 카드를 클래스로 만든 것이다. 카드의 숫자는 A~K까지이고, 무늬는 4가지로 불변의 값이기 때문에 타입에 안전한 enum 키워드를 이용하여 속성값을 정의하였다. 그리고 적절하지 않을지 모르겠지만 GUI 구현시 데이터와 화면표시가 따로 노는 것을 방지하기 위해 JButton 클래스를 상속하여 실제 카드의 데이터와 화면에 보이는 버튼이 한 몸이 되도록 하였다. Player 클래스에서 카드를 순서대로 정렬하기 위해 Comparable 인터페이스를 구현하였다.
Deck 클래스
52장의 카드 한 벌을 Deck 이라고 한다. 초기엔 카드를 저장하기 위해 Stack 클래스를 사용하여 구현하였다. 하지만 API 문서에서 Deque 인터페이스를 활용하는 것을 권장하기에 이를 따르기로 했다. 이 클래스의 기능 중에 카드를 섞는 shuffle 메소드를 손쉽게 구현하기 위해 Collections 클래스의 shuffle 메소드를 이용하였고 이 메소드는 인자로 List 인터페이스를 구현한 객체를 필요로 하기 때문에 Deque와 List를 둘다 구현하고 있는 LinkedList 클래스를 사용하였다.
Player 클래스
게임에서 유저나 컴퓨터와 같은 플레이어를 정의한 클래스이다. 컴퓨터와 유저의 공통적인 특성들을 모아놓았고 거의 대부분이 구현되어 있다. abstract 키워드로 하위 클래스에서 객체를 생성하도록 유도하였다. Sort 기능도 Collections 클래스의 Sort 메소드를 이용해 손쉽게 구현하였다.
HumanPlayer 클래스
유저를 정의하는 클래스이다. 생성자 파라미터로 유저의 이름을 넣을 수 있고 버릴 카드를 직접 선택할 수 있다.
ComputerPlayer 클래스
게임상의 컴퓨터를 정의하는 클래스이다. 유저와는 반대로 이름과 버릴 카드를 선택할 수 없다.
UserInterface 인터페이스
UI를 쉽게 변경할 수 있도록 인터페이스를 정의하였다. 나중에 프로그램을 확장해 자신만의 UI를 만들더라도 쉽게 만들 수 있을 것이다.
BabyHoolaConsole 클래스
위의 클래스들을 이용해 Console 환경으로 구현하였다. GUI 환경을 만들기 전에 테스트 용도로 만들었고 UserInterface 인터페이스를 구현해 UI를 손쉽게 바꿀수 있도록 하였다.
BabyHoolaGUI 클래스
위의 클래스들을 이용해 GUI 환경으로 구현하였다. 보드 게임의 형식을 갖추고 직관적인 인터페이스를 유지하려고 노력하였다. UserInterface 인터페이스를 구현하였다.
프로그램 실행환경
- 펜티엄4 2.4Ghz, 메모리 1G
- 윈도우즈 XP, JRE 1.6
결과화면
콘솔 환경
이름 입력
초기 화면
게임 도중
승리시 화면