[Java 스터디] 자동차 경주 게임 만들기 (3단계) - 슈퍼카

🐧코딩하는 애기 펭귄·2023년 5월 25일
1

sscc Java 스터디

목록 보기
9/10
post-thumbnail

지난 번 자동차 경주 게임 만들기 2단계였던 경주 및 결과 발표 기능에 이어,

이번에는 랜덤으로 부스터를 발동하는 SuperCar 클래스를 상속을 이용하여 만들어보자.

cf) 이 글은 2023년 5월 9일에 진행됐던 sscc 자바 스터디 5주차 스터디 내용을 정리한 글입니다.


문제

슈퍼카 클래스를 구현하라.

  • 슈퍼카 선택 기능
    스피드, 이름 입력시 슈퍼카 여부 입력 가능
    SuperCar는 Car 클래스를 상속받음.
    Car는 go(), sayScore()를 가지고 있음.
    SuperCar는 이 두 개의 메소드를 Override 해야 함.
  • SuperCar의 go(), SayScore()
    슈퍼카는 go()가 실행되었을 때 50% 확률로 스피드의 2배만큼 갈 수 있음 (부스터)
    (random으로 구현)
    SuperCar는 부스터가 발동된 횟수를 기록하였다가, sayScore가 실행되었을 때 점수와 부스터 발동 횟수를 같이 말해야 함.

예시


코드

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

class Car {
    protected int speed = 0;
    protected String name;
    protected int score = 0;

    Car(int speed, String name) {
        this.speed = speed;
        this.name = name;
    }

    void go() {
        score += speed;
    }

    void printInfo() {
        System.out.println("스피드는" + speed + "이고, 이름은 " + name + "입니다.");
    }

    void sayScore() {
        System.out.println("Score: " + score);
    }
}

class SuperCar extends Car {
    private final Random random;
    private int booster = 0;

    SuperCar(int speed, String name) {
        super(speed, name);
        final long seed = System.currentTimeMillis();
        random = new Random(seed);
    }

    @Override
    void go() {
        if (random.nextInt(2) == 1) {
            score += 2 * speed;
            booster++;
        } else {
            score += speed;
        }
    }

    @Override
    void sayScore() {
        System.out.println("Score: " + score + ", booster: " + booster);
    }
}

public class HwCar {
    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();
            System.out.println("이 자동차는 슈퍼카인가요? 0 또는 1 입력");
            int IsSuperCar = scanner.nextInt();

            if (IsSuperCar == 1) {
                Car car = new SuperCar(speed, name);
                cars.add(i, car);
            } else if (IsSuperCar == 0) {
                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)
                if (random.nextInt(2) == 1) {
                    participant.go();
                }
        }

        System.out.println("\n---최종 결과 발표---");
        for (Car participant : cars)
            participant.sayScore();
    }
}

후기

사실 이번 과제는 한 번에 통과되진 못했고, 클래스 내부에서 seed 값을 필드로 갖는 것이 적절한 방법은 아니기 때문에 코멘트가 하나 달려서 수정한 코드이다.

요즘 학교 과제가 너무 많아 정신이 없어서 스터디 과제를 1시간 만에 급하게 작성했다 보니 볼품없는 코드를 만들어 버린 것 같다. (이 정도가 아직 2학년이라는 사실이 슬프다...)

학교 강의에서 상속이 들어가고부터 좀 어려워진 것 같아 맘 속에 걱정이 많았는데, 그래도 스터디에서 한 번 이렇게 직접 구현해보니까 낯선 것은 좀 줄어든 것 같다.

이제 스터디도 얼마 안 남았고, 종강도 얼마 안 남았다.
시간이 정말 빠르게 흘러가고 있는 것 같다.

누구에게나 공평하게 주어진 시간을 알차게 사용하는 것이 생각보다 쉬운 일이 아님을 깨닫는 요즘이다. 정말 강한 사람은 같은 시간을 살았더라도 그 시간의 농도가 다른 사람.
그런 사람이 되기 위해서 오늘 하루도 마음을 다잡고 열심히 하자.

0개의 댓글

관련 채용 정보