지난 번 자동차 경주 게임 만들기 1단계로 참가자 소개 기능을 구현했었는데,
이번에는 Random을 이용해 자동차 경주를 구현해보고 최종 스코어까지 출력하는 프로그램을 만들어보자.
cf) 이 글은 2023년 4월 11일에 진행됐던 sscc 자바 스터디 4주차 스터디 내용을 정리한 글입니다.
자동차 경주를 구현하라. 규칙은 다음과 같다.
1. 경기 시간동안 이동한 거리가 그 자동차의 score 이다.
2. 모든 자동차는 1초 동안 자신의 스피드 만큼 이동할 수 있다.
3. 1초마다 각각의 자동차가 움직일지 여부는 Random으로 결정한다.
random.nextInt(2)로 0 또는 1 두개의 정수를 랜덤으로 생성하여, 1이 나왔을 때 자동차를 움직이게 한다.
-> 자동차가 3대이고, 경기가 4초동안 진행된다면 랜덤값 생성은 12번 이루어진다.
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 값 생성 기능을 가지고 있는 클래스이다.
사용 방법은 다음과 같다.
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을 보냈는데 이번에는 어떤 리뷰를 해 주실지 기대가 된다.