Kotlin : Movie Maker 에서 Object 키워드 사용해보기

언어/Kotlin

Kotlin : Movie Maker 에서 Object 키워드 사용해보기

해리누나 2022. 11. 3. 01:56
반응형
import kotlin.random.Random
import kotlin.math.round

class Actor(val firstName: String, val lastName: String, val genre: List<Genre>){

    var salary = round(Random.nextDouble(100000.0, 2000000.0))
    val skill : Skill = Skill()

    fun movieSuccessfullyProduced(){
        skill.currentSkill += skill.learningSpeed
    }

}
 
 
class Director(val firstName: String, val lastName: String, val preferredActor: Actor){

    var salary = round(Random.nextDouble(100000.0, 2000000.0))
    val skill : Skill = Skill()

    fun movieSuccessfullyProduced(){
        skill.currentSkill += skill.learningSpeed
    }

}
 
 
class Skill{

    val maxSkill = Random.nextInt(250,500)
    var currentSkill = Random.nextInt(100,maxSkill)
        set(value){
            if(value > field && value <= currentSkill){
               field = value
            }
        }

    val learningSpeed = Random.nextInt(2,10)

}


class Movie(val title: String, val director: Director, val mainActor: Actor, val budget: Int, val genre : Genre){

    private val ratings = mutableListOf<Double>()

    val costs = director.salary + mainActor.salary + budget
    var revenue = 0.0
        private set

    fun produce()
    {
        val baseRevenue = round(Random.nextDouble(1_000_000.0,2_000_000.0))
        rating()

        var totalRevenue = 0.0

        for(rating in ratings){
            val additionalRevenue = (baseRevenue * rating)
            totalRevenue +=  additionalRevenue
            println("영화 새 평점이 등록되었습니다. 평점: $rating | 영화수익: $additionalRevenue")
        }

        this.revenue = totalRevenue
        println("영화 총 수익: $revenue")

        val profit = revenue - costs
        if(profit > 0) {
            println("성공!")
            println("영화 이윤은 $profit 입니다.")
        }else{
            println("실패!")
            println("영화 적자는 ${profit*(-1)} 입니다.")
        }

        mainActor.movieSuccessfullyProduced()
        director.movieSuccessfullyProduced()
    }

    fun rating(){
        for( x in 1..5){
            val rating = round(Random.nextDouble(0.0,5.0))
            ratings.add(rating)
        }
    }

}

 

지난번 Movie Maker 시뮬레이션 글에서 썼던 코드를 가져왔다.

게임을 위해선 플레이어의 잔고 그리고 지금까지 성공적이었던 영화들의 목록, 배우와 감독 등의 데이터가 필요할 것이다.

새로운 영화가 제작될 때, 플레이어는 영화에 출연할 사람을 고를 수 있어야 한다.

 

이를 위해  게임데이터 오브젝트를 만들어보자. [코틀린에서는 키워드 object를 사용해 객체를 직접 정의하는 방법이 있다.]

import kotlin.random.Random

object Gamedata {

    var account = 1000000
    val actors = mutableListOf<Actor>()
    val directors = mutableListOf<Director>()

    init{
        actors.add(Actor("Emma","Thompson",listOf(Genre.DRAMA,Genre.FANTASY,Genre.THRILLER)))
        actors.add(Actor("Ahin","Yoo",listOf(Genre.DRAMA,Genre.THRILLER)))
        actors.add(Actor("Andrew", "Garfield",listOf(Genre.DRAMA,Genre.FANTASY)))
        actors.add(Actor("Jungmin","Hwang",listOf(Genre.FANTASY,Genre.THRILLER)))
        actors.add(Actor(" Jennifer","Lawrence",listOf(Genre.DRAMA,Genre.FANTASY,Genre.THRILLER)))

        directors.add(Director("Steve","Spielburg", getRandomActor()))
        directors.add(Director("Roland","Emmerich", getRandomActor()))
        directors.add(Director("Joonho","Bong", getRandomActor()))

    }

    fun getRandomActor() : Actor = actors.random()

}

위처럼 init 을 사용해 객체의 속성 초기화를 제어하는 것도 가능하다. Gamedata 란 개체에 게임 플레이어의 계정 잔액과 감독, 배우, 영화 장르 등이 저장되었다.  감독이 선호하는 배우는 걍 랜덤으로 아무나 뽑히는 애로 설정해둠.. (오브젝트 안에 메서드 정의도 가능하다. getRandomActor는 랜덤으로 리스트에서 배우를 하나 받아오는 메서드이니 그 전에 배우들이 목록에 저장되어 있어야 함을 잊지 말자. 그렇지 않은 경우 메서드 사용시 exception (NoSuchElemetException) 뜬다.

 

이 오브젝트 키워드는 전체 프로젝트의 구조를 좀 명확히 하기 위해 다른  새 파일에 저장해두었다.

 

 

다시 본래 작업하던 파일로 돌아와서 만든 GameData를 이용해보자.

fun main(){

    Gamedata.genres
    Gamedata.actors.add(Actor("Seoyeon","Jin",listOf(Genre.DRAMA,Genre.FANTASY,Genre.THRILLER)))
    Gamedata.directors.add(Director("Chanwook","Park",Gamedata.getRandomActor()))

    Gamedata.directors.clear()

}

이런식으로 Gamedata 내 속성이나 메서드들을 호출해 직접 작업할 수 있다.

 

 

 

 

출처:

내용 / 도움준 곳: 학교 교수님 (Christian Kohls) 강의

728x90
반응형