[Java] 두 개의 주사위를 던진다. 각 주사위는 여섯 개의 면이 있으며, 각 면에는 1,2,3,4,5,6개의 점이 있다. 주사위가 멈추면 두 주사위 윗면에 있는 점의 개수를 더한다. 게임을 100번 시행했을 때, 승률은 어떻게 되는가? 그 과정들을 보이고 승률을 %로 나타내어라
문제:
두 개의 주사위를 던진다. 각 주사위는 여섯 개의 면이 있으며, 각 면에는 1,2,3,4,5,6개의 점이 있다. 주사위가 멈추면 두 주사위 윗면에 있는 점의 개수를 더한다. 게임을 100번 시행했을 때, 승률은 어떻게 되는가? 그 과정들을 보이고 승률을 %로 나타내어라.
게임 조건
처음 주사위를 굴렸을 때 더한 합이 7, 또는 11이면 굴린 사람이 이긴다. 처음 주사위를 굴렸을 때 함이 2,3 또는 12이면 진다. 4,5,6,8,9,10이면 굴린 사람의 점수가 되고, 이경우는 다음 사항을 반복 시행한다. 굴린 사람의 점수가 다시 나오면 이긴다. 7이 나오면 진다.
0. 해법 정리
- Dice(주사위) 객체 선언 및 초기화
- 점수 변수 선언 및 초기화
- 랜덤으로 주사위(2회; 각각 a,b라고 칭함) 굴린 값을 변수에 저장
- 처음에 a+b=7 or 11이면 플레이어 1 승리
- 그리고 a+b 2 or 3 or 12 플레이어 1 패배(플레이어 2 승리)
- 처음 조건을 만족하지 못하면 a+b=4,5,6,8,9,10인 경우이다 = 포인트 점수 저장
- 플레이어 2가 굴려서 내 점수와 같으면 컴퓨터 승리
- 승률 및 횟수 저장해서 출력
1. 객체 모델링(UML 그리기)
초기에 만든 모델링:
완성된 결과:
2. 풀이 과정
처음에 객체 모델링을 한 대로 FaceValue(값 저장), roll(주사위 굴리기), saveDice(값 저장)으로 나누어 만들어 봤습니다.
하지만 구체적으로 수업시간에 배운 클래스의 속성들이 잘 생각나지 않아 어떤 식으로 서로를 연결시켜야 할지에 대해 고민이 많았습니다.
그래서 일단은 첫 번째 및 두 번째 주사위를 굴렸을 때 나오는 값을 나오도록 유도해 보았습니다. main()함수에서는 마치 C언어에서 함수를 호출하듯이 클래스를 가져오는 방법을 사용해 보기도 했습니다.
하지만 함수간에 서로 어떤식으로 상호작용해야 하는지에 대해 너무 많은 시간을 소모해서, 제한된 시간 안에 문제를 풀 수 있도록 생각을 고쳐 보았습니다. 주사위 클래스에서 넘겨 주는 랜덤한 값만 이용하고, main안에서 해결하는 방식으로 만들었습니다.
일단 주사위의 합이 7과 11일 때 이긴 경우를 표시해 주는 것으로 구현해 봤습니다.
그리고 합이 2,3일때의 결과를 구하는 것도 만들었습니다.
마지막으로 그 외의 경우(4,5,6,8,9,10)일 때 처리해야 할 프로세스에 대해서도 구현에 성공했습니다.
3. 소스 코드
4. 실행 화면
5. 시행 착오
원래 Dice 객체 안에 roll(굴린 값 저장)만 저장하는 것이 아니라 주사위를 던지고, 값을 저장하도록 만들었습니다.
하지만 풀이 과정에서도 말씀 드린 것처럼 서로간의 연결을 어떻게 해야 하는지에 대해 제대로 알지 못했습니다.
그래서 결과적으로 랜덤값만 저장하는 기능 밖에 하지 못하게 되었습니다. 따라서 처음 계획했던 객체 모델링(1번의 UML 그리기 부분)대로 만들지 못했습니다.
그래서 프로그램을 완성하고도 못내 아쉬움이 많이 남았습니다.
레포트 작성을 마치고
1. 작성 후기
문제 자체는 어렵지 않았습니다. 규칙에 따라 주사위를 굴리고 그 값을 비교하는 일련의 과정은 금방 이해할 수 있었습니다. 하지만 앞에서 말씀 드렸던 ‘객체 모델링’ 부분을 제대로 수행하지 못해서 많은 부분 시간을 소모했고, 아쉬움이 남았습니다. 그 동안 C언어를 통해 함수의 사용법을 익혀 왔습니다. 그러다가 객체 지향 개념이 조금 들어간 부분에 들어와서 장벽을 느꼈습니다. 제 생각에는 그 동안 학습했던 많은 문법적, 논리적 자바 기술들도 중요하지만 최근 학습한 객체 지향 개념이 매우 중요한 것 같습니다.
2. 참고 자료
서적:
- 명쾌한 JAVA 입문(영진닷컴)
'프로그래밍 실습 > 자바(Java)' 카테고리의 다른 글
| [Java] 메모 노트(Memo Note) 프로그램 (1) | 2011.01.02 |
|---|---|
| [Java] High-Low 게임 만들기(AWT 사용) (0) | 2011.01.02 |
| [Java] Integer 클래스의 메소드를 조사, 예제 프로그램 작성하기 (0) | 2011.01.02 |
| Math 클래스의 메소드들을 조사하고 다음 메소드 5개에 대하여 예제 프로그램을 작성하고 결과를 보여라. (0) | 2010.05.13 |
| 숫자 873의 약수를 모두 구하라. 모두 합하면 얼마이며, 또한 그들의 평균은 얼마인가 ? (0) | 2010.05.13 |
