基于上一篇的基础,主要改进了以下两点:
①在双方武将对战的基础上增加了随机的暴击率数值,增强可玩性
②挑选完武将后,系统会随机选择武将进行对战
优化了逻辑,为了添加武将方便,去除了zhaoyun,lvbu类,将语音在hero类中统一定义——代码如下:
一.hero类
import kotlin.random.Random
open class hero(val name:String, var hp:Int, val atk:Int, val says: String) {
fun startFight(){
println("${name}加入战场")
}
fun attack(target: hero) {
val basicDamage = atk
val critical = Random.nextInt(5,30 ) // 生成5-30的随机数作为暴击值
val totalDamage = basicDamage + critical
println("${name}发起了攻击,对${target.name}造成了${basicDamage}点基础伤害和${critical}点暴击伤害,共计${totalDamage}点伤害")
target.underAttack(totalDamage)
}
fun underAttack(damage: Int){
println("${name}正在被攻击...")
hp -= damage
if (hp <= 0) {
died()
}
}
open fun counterAttack(target: hero) {
val basicDamage = atk
val critical = Random.nextInt(3, 25) // 生成3-25的随机数作为暴击值
val totalDamage = basicDamage + critical
println("${name}反击了${target.name},造成了${basicDamage}点基础伤害和${critical}点暴击伤害,共计${totalDamage}点伤害")
target.underAttack(totalDamage)
}
open fun died(){
println("${name}受到致命伤,退出战场")
}
}
二.Main主函数
import kotlin.random.Random
fun main() {
// 定义武将列表
val heroes = listOf(
hero("赵云", 100, 12,"吾乃常山赵子龙!"),
hero("吕布", 112,15,"大丈夫生居天地间,岂能郁郁久居人下!" ),
hero("诸葛亮", 89,21,"先帝创业未半,而..." ),
// 可以添加更多的武将
)
// 展示可选的武将
println("【请选择你要对战的武将】")
for ((index, hero) in heroes.withIndex()) {
println("${index + 1}: ${hero.name}")
}
// 读取用户输入的对战武将选择
val num1 = readLine()
if (num1 != null) {
val num = num1.toInt() - 1
if (num in heroes.indices) {
val selectedHero = heroes[num]
selectedHero.startFight()
println( selectedHero.says)
// 随机选择一个不同的武将进行对战
val opponentIndex = (0 until heroes.size).filter { it != num }.random()
val opponentHero = heroes[opponentIndex]
opponentHero.startFight()
println(opponentHero.says)
// 战斗逻辑
var round = 1
while (selectedHero.hp > 0 && opponentHero.hp > 0) {
println("第${round}回合")
selectedHero.attack(opponentHero)
if (opponentHero.hp > 0) {
opponentHero.counterAttack(selectedHero)
}
if (opponentHero.hp < 0){
opponentHero.hp = 0
}
if (selectedHero.hp < 0){
selectedHero.hp = 0
}
println("${selectedHero.name}当前hp:${selectedHero.hp},${opponentHero.name}当前hp:${opponentHero.hp}")
round++
}
} else {
println("请选择正确的武将序号")
}
}
}
可以明显看到,相比于上一篇代码,精简了很多,功能反而更丰富了