1. Warrior, Knight, Monster는 체력, 공격력, 방어력, 생존여부에 대한 정보가 필요
2. Warrior는 Monster를 특정 마리수 이상 처치하면 Knight로 레벨업이 가능하다.
3. Knight는 hardAttack기능이 있고 이 기능을 사용하려면 energy 3이 필요하다.
4. Warrior가 레벨업을 하는 반복문이 존재해야 한다.
<프로그램 동작 예시>
Monster 생성
Monster가 아직 살아 있습니다. 체력: 50
Warrior가 공격합니다.
Monster가 아직 살아 있습니다. 체력: 41
Monster가 공격합니다.
Warrior는 죽었습니다.
open class Warrior(hp: Int, var power: Int, var armor: Int) { //hp의 setter를 설정해주기 위해 var를 삭제
var killCount: Int = 0
var isAlive: Boolean = true
get() {
if (field == true) println("Warrior는 아직 살아있다. 체력: ${this.hp}")
else println("Warrior는 죽었습니다.")
return field
}
var hp: Int = 100
set(value) {
if (value <= 0) {
field = 0
this.isAlive = false
} else field = value
}
init {
this.hp = hp
}
open fun attack(monster: Monster) {
println("Warrior가 공격합니다.")
if (!monster.defense(this)) {
this.killCount += 1
println("몬스터 처치함. 킬카운트 : ${this.killCount}")
}
}
fun defense(monster: Monster): Boolean {
val damage: Int = monster.power - this.armor
this.hp -= if (damage > 0) damage else 0
return this.isAlive
}
fun levelUp(): Knight? { // 레벨업을 하면 Knight가 되어야 한다.
if (this.killCount > 5) {
println("Knight로 레벨업~!!!")
return Knight(this)
} else {
println("레벨업 할 수 없습니다. 부족한 킬 카운트 : ${this.killCount}")
return null
}
}
}
class Knight(warrior: Warrior) : Warrior(warrior.hp, warrior.power, warrior.armor) {
var energy: Int = 0
init {
this.hp = warrior.hp
this.power = warrior.power + 2
this.armor = warrior.armor + 1
}
override fun attack(monster: Monster) {
super.attack(monster)
this.energy += 1
}
fun hardAttack(monster: Monster) {
if (this.energy >= 3 && monster.isAlive) {
monster.hp -= this.power + 30
this.energy -= 3
} else println("에너지가 부족합니다. 현재 에너지 : ${this.energy}")
}
}
class Monster(hp: Int, var power: Int, var armor: Int) {
var isAlive: Boolean = true
get() {
if (field == true) println("Monster는 아직 살아있다. 체력: ${this.hp}")
else println("Monster는 죽었습니다.")
return field
}
var hp: Int = 100
set(value) {
if (value <= 0) {
field = 0
this.isAlive = false
} else field = value
}
init {
this.hp = hp
}
fun bite(warrior: Warrior) {
println("Monster가 물었습니다.")
warrior.defense(this)
}
fun defense(warrior: Warrior): Boolean {
val damage: Int = warrior.power - this.armor
this.hp -= if (damage > 0) damage else 0
return this.isAlive
}
}
val warrior = Warrior(100, 10, 10)
while (warrior.killCount < 10) {
val monster = Monster(15, 1, 1)
while (monster.isAlive) {
warrior.attack(monster)
monster.bite(warrior)
}
}
val knight: Knight = warrior.levelUp()!!
// 내가 만든 간단한 버전
// levelup과 knight로 바뀌는 부분이 없다.
class Warrior(var hp: Int, var power: Int, var armor: Int) {
var killCount: Int = 0
fun attack(monster: Monster) {
if (killCount == 0) {
if (monster.defense(this) <= 0) {
println("Warrior가 Monster를 죽였습니다.")
killCount += 1
} else {
println("Warrior가 Monster를 공격했습니다.")
println("Monster는 아직 살아있습니다. Monster의 현재 체력: ${monster.hp}")
}
} else {
println("Warrior가 이미 Monster를 죽였습니다.")
}
}
fun defense(monster: Monster): Int {
val damage: Int = monster.power - this.armor
this.hp -= if (damage > 0) damage else 0
return this.hp
}
}
class Monster(var hp: Int, var power: Int, var armor: Int) {
var killCount: Int = 0
var isAlive: Boolean = true
fun bite(warrior: Warrior) {
if (killCount == 0) {
if (warrior.defense(this) <= 0) {
println("Monster가 Warrior를 죽였습니다.")
killCount += 1
} else {
println("Monster가 Warrior를 공격했습니다.")
println("Warrior는 아직 살아있습니다. Warrior의 현재 체력: ${warrior.hp}")
}
} else {
println("Monster가 이미 Warrior를 죽였습니다.")
}
}
fun defense(warrior: Warrior): Int {
val damage: Int = warrior.power - this.armor
this.hp -= if (damage > 0) damage else 0
return this.hp
}
}
var warrior = Warrior(100, 10, 10)
var monster = Monster(20, 20, 5)
// 레벨업 버전
open class Warrior(var hp: Int, var power: Int, var armor: Int) {
var killCount: Int = 0
var isAlive: Boolean = true
open fun attack(monster: Monster) {
if (monster.defense(this) <= 0) {
killCount += 1
println("Warrior가 Monster를 죽였습니다. 킬 카운트: ${this.killCount}")
} else {
println("Warrior가 Monster를 공격했습니다.")
println("Monster는 아직 살아있습니다. Monster의 현재 체력: ${monster.hp}")
}
}
fun defense(monster: Monster): Int {
val damage: Int = monster.power - this.armor
this.hp -= if (damage > 0) damage else 0
return this.hp
}
fun levelUp(): Knight {
if (this.killCount >= 3)
println("Knight로 레벨업~~!!")
return Knight(this)
}
}
class Monster(var hp: Int, var power: Int, var armor: Int) {
var isAlive: Boolean = true
fun bite(warrior: Warrior) {
if (warrior.defense(this) <= 0) {
println("Monster가 Warrior를 죽였습니다.")
warrior.isAlive = false
} else {
println("Monster가 Warrior를 공격했습니다.")
println("Warrior는 아직 살아있습니다. Warrior의 현재 체력: ${warrior.hp}")
}
}
fun defense(warrior: Warrior): Int {
val damage: Int = warrior.power - this.armor
this.hp -= if (damage > 0) damage else 0
return this.hp
}
}
class Knight(warrior: Warrior) : Warrior(warrior.hp, warrior.power, warrior.armor) {
init {
this.hp = warrior.hp + 10
this.power = warrior.power + 10
this.armor = warrior.armor + 10
}
override fun attack(monster: Monster) {
super.attack(monster)
}
fun hardAttack(monster: Monster) {
if (monster.isAlive) {
monster.hp -= this.power + 50
println("Knight가 hardAttack을 시전하였습니다.")
}
}
}
var warrior = Warrior(100, 10, 10)
loop@while (warrior.killCount <= 5) {
val monster = Monster(20, 20, 5)
while (monster.isAlive) {
warrior.attack(monster)
if (!warrior.isAlive) break@loop
}
}
val knight: Knight = warrior.levelUp()
'# 1. Language > 🔰 Kotlin' 카테고리의 다른 글
Kotlin # LinearLayout/RelativeLayout/Margin&Padding (0) | 2022.07.06 |
---|---|
Kotlin # XML/단위/뷰컴포넌트/뷰속성 (0) | 2022.07.05 |
Kotlin # 고차함수/람다/클래스 과제 (0) | 2022.07.01 |
Kotlin # 배열/콜렉션/이터러블/반복문 과제 (0) | 2022.07.01 |
Kotlin # 변수/자료형/Null/연산자/메소드/흐름제어 과제 (0) | 2022.07.01 |