[Java 스터디] 자동차 경주 게임 만들기 (2단계) - 경주 및 결과 발표
개요
지난 번 자동차 경주 게임 만들기 1단계로 참가자 소개 기능을 구현했었는데,
이번에는 Random을 이용해 자동차 경주를 구현해보고 최종 스코어까지 출력하는 프로그램을 만들어보자.
cf) 이 글은 2023년 4월 11일에 진행됐던 sscc 자바 스터디 4주차 스터디 내용을 정리한 글입니다.
문제
자동차 경주를 구현하라. 규칙은 다음과 같다.
- 경기 시간동안 이동한 거리가 그 자동차의 score 이다.
- 모든 자동차는 1초 동안 자신의 스피드 만큼 이동할 수 있다.
- 1초마다 각각의 자동차가 움직일지 여부는 Random으로 결정한다.
random.nextInt(2)로 0 또는 1 두개의 정수를 랜덤으로 생성하여, 1이 나왔을 때 자동차를 움직이게 한다.
-> 자동차가 3대이고, 경기가 4초동안 진행된다면 랜덤값 생성은 12번 이루어진다.
예시
- 지난 번 과제 코드를 기반으로 추가 작성할 것
- 경기를 몇 초 동안 진행할지 입력
- Random을 이용한 자동차 경주 구현
- 최종 스코어 출력
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;
class Car {
private final int speed;
private final String name;
private int score;
Car(int speed, String name) {
this.speed = speed;
this.name = name;
}
void plusScore(int num) {
score += num;
}
void printInfo() {
System.out.println("스피드는" + speed + "이고, 이름은 " + name + "입니다.");
}
int getSpeed() {
return speed;
}
int getScore() {
return score;
}
}
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
long seed = System.currentTimeMillis();
Random random = new Random(seed);
int n;
System.out.println("자동차의 갯수를 입력하세요.");
n = scanner.nextInt();
ArrayList<Car> cars = new ArrayList<>();
for (int i = 0; i < n; i++) {
System.out.println(i + 1 + "번 째 자동차의 스피드를 입력하세요.");
int speed = scanner.nextInt();
System.out.println(i + 1 + "번 째 자동차의 이름을 입력하세요.");
String name = scanner.next();
Car car = new Car(speed, name);
cars.add(i, car);
}
System.out.println("\n-----경기 참가자 소개-----");
for (Car participant : cars)
participant.printInfo();
System.out.println("\n경기를 몇 초 동안 진행할까요?");
int runningTime = scanner.nextInt();
for (int i = 0; i < runningTime; i++) {
for (Car participant : cars)
participant.plusScore(participant.getSpeed() * random.nextInt(2));
}
System.out.println("\n---최종 결과 발표---");
for (Car participant : cars)
System.out.println(participant.getScore());
}
}
후기
이번 과제는 사실 4주차 스터디를 진행한 후 중간고사 기간 때문에 휴강한 3주 이후에 진행했기 때문에, 자료구조와 객체지향 프로그래밍 중간고사를 거친 이후에 나에게는 굉장히 쉽게 진행할 수 있었다.
(교수님 시험 난이도가 넘 어렵네요…)
그리고 이미 지난 번 과제 1단계였던 참가자 소개 뼈대 코드에 살만 덧붙이는 방식이라 구현할 것도 적었다.
굳이 그럴 필요는 없었지만 그래도 캡슐화를 배운 입장으로서 private 접근 지정자와 getter setter를 활용해보았다.
Random 클래스
이번 과제에서 핵심이 되는 random 값 생성 기능을 가지고 있는 클래스이다.
사용 방법은 다음과 같다.
1
2
3
4
5
6
7
8
9
10
import java.uitl.Random;
public class Pokemon {
public static void main(String[] args) {
long seed = System.currentTimeMillis();
Random random = new Random(seed);
System.out.println(random.nextInt(10));
}
}
우선 Random 클래스를 사용하기 위해서는 java.util.Random
을 import 시켜야 한다.
그 후에 C언어와 비슷하게 매번 프로그램을 실행할 때마다 다른 랜덤 값을 얻어내기 위하여 seed 값을 현재 시간으로 설정하는 코드가 필요하다.
현재 시간을 알려주는 코드는 System.currentTimeMillis()
이다.
이후에 random 객체를 생성할 때 인자로 seed 값을 전달하면 초기 설정은 끝.
이후 Random 클래스로 이루어진 random 객체의 다양한 옵션을 사용하면 된다.
그 중 자주 사용되는 주요 메소드인 nextInt()는 int 타입 난수를 리턴해준다.
괄호 안에 int 타입 인자를 적으면 int 타입의 0 ~ 매개값까지의 난수를 리턴한다.
4주차 스터디를 할 때 과제 설명을 돕기 위해 현장에서 우수 코드를 보면서 지난 번 과제를 리뷰했었는데,
그 우수 코드의 코드가 내 코드였다.
너무 뿌듯하다 ☆: .。. o(≧▽≦)o .。.:☆
열심히 한 보람이 있다. 방금 과제를 다 하고 막 PR을 보냈는데 이번에는 어떤 리뷰를 해 주실지 기대가 된다.
댓글남기기