网上关于Kotlin的教程远远不如Java那么丰富,因此基于我的学习,出一版面向新手的练手小游戏,未来可能会在此基础上逐渐升级优化,下面进入正文------
一.首先是目录结构,有助于新手有个基础思路
除了main函数外,另外建了三个类,这三个类中hero是基类,zhaoyun和lvbu可以理解为子类,继承自hero的基类
二. hero基类
hero类加了关键词open用以被后续创建的zhaoyun,lvbu子类继承,武将应该有姓名,血量,攻击力,因此给该类创建了name,hp,atk三个参数;
每个武将我希望上场的时候能弹出提示,因此定义了startFight方法,以此类推,定义了startAttack(),underAttack(),died()一共四个方法,方便后续的调用
open class hero(val name:String, val hp:Int, val atk:Int) {
fun startFight(){
println("${name}加入战场")
}
fun startAttack(){
println("${name}使用了一次攻击,造成了${atk}点伤害")
}
fun underAttack(){
println("${name}正在被攻击...")
}
fun died(){
println("${name}受到致命伤,退出战场")
}
}
三.zhaoyun类
简单实现一个语音效果,后续也可以继续扩展
class zhaoyun: hero("赵云",100,5) {
fun says(){
println("''吾乃常山赵子龙也!!!''")
}
}
四.lvbu类
同样实现一个语音效果
class lvbu: hero("吕布",105,6) {
fun says(){
println("''大丈夫生居天地间,岂能郁郁久居人下!''")
}
}
五.Main主函数
主函数中的代码比较多,但是逻辑是很清楚的,根据代码块来看,每一块都有清楚的注释,没有用到高阶函数和其他复杂的操作,有不明白的地方可以留言
// 定义main函数
fun main(args: Array<String>) {
// 输出欢迎信息和选择武将提示
println("------欢迎来到幻想三国------\n【请选择你的武将】")
println("1:赵云,2吕布")
// 读取用户输入的武将选择
val num1str = readLine()
if (num1str != null) {
when(num1str.toInt()) {
1 -> {
// 创建赵云对象并展示信息
val zhaoyun = zhaoyun()
zhaoyun.startFight()
zhaoyun.says()
// 提示选择对战的武将
println("【请选择你要对战的武将】")
println("1:赵云,2吕布")
// 读取用户输入的对战武将选择
val num2str = readLine()
if (num2str != null) {
// 检查是否选择了相同的武将
if (num2str.toInt() == num1str.toInt()){
println("不能选择相同的武将")
} else {
when(num2str.toInt()) {
2 -> {
// 创建吕布对象并展示信息
val lvbu = lvbu()
lvbu.startFight()
lvbu.says()
var zhaoyunHpNum = zhaoyun.hp
var lvbuHpNum = lvbu.hp
var zhaoyunAtkNum =zhaoyun.atk
var lvbuAtkNum = lvbu.atk
// 持续攻击直到一方血量小于等于0
while (zhaoyunHpNum > 0 && lvbuHpNum > 0) {
//赵云发动攻击
zhaoyun.startAttack()
lvbuHpNum -= zhaoyunAtkNum
//确保赵云最低血量为0
if (lvbuHpNum < 0) {
lvbuHpNum = 0
}
println("吕布剩余血量:$lvbuHpNum")
println("吕布发起反攻...")
lvbu.startAttack()
if (zhaoyunHpNum > 0) {
zhaoyunHpNum -= lvbuAtkNum
if (zhaoyunHpNum < 0) {
zhaoyunHpNum = 0
}
println("赵云剩余血量:$zhaoyunHpNum")
}
}
// 判断战斗结果并调用died方法
if (zhaoyunHpNum <= 0) {
zhaoyun.died()
} else if (lvbuHpNum <= 0) {
lvbu.died()
}
}
}
}
}
}
2 -> {
// 创建吕布对象并展示信息
val lvbu = lvbu()
lvbu.startFight()
lvbu.says()
// 提示选择对战的武将
println("【请选择你要对战的武将】")
println("1:赵云,2吕布")
// 读取用户输入的对战武将选择
val num2str = readLine()
if (num2str != null) {
// 检查是否选择了相同的武将
if (num2str.toInt() == num1str.toInt()){
println("不能选择相同的武将")
} else {
when(num2str.toInt()) {
1 -> {
// 创建赵云对象并展示信息
val zhaoyun = zhaoyun()
zhaoyun.startFight()
zhaoyun.says()
var zhaoyunHpNum = zhaoyun.hp
var lvbuHpNum = lvbu.hp
var zhaoyunAtkNum =zhaoyun.atk
var lvbuAtkNum = lvbu.atk
// 持续攻击直到一方血量小于等于0
while (zhaoyunHpNum > 0 && lvbuHpNum > 0) {
//吕布发动攻击
lvbu.startAttack()
zhaoyunHpNum -= lvbuAtkNum
//确保赵云血量最低为0
if (zhaoyunHpNum < 0) {
zhaoyunHpNum = 0
}
println("赵云剩余血量:$zhaoyunHpNum")
println("赵云发起反攻...")
zhaoyun.startAttack()
if (zhaoyunHpNum > 0) {
lvbuHpNum -= zhaoyunAtkNum
//确保吕布最低血量为0
if (lvbuHpNum < 0) {
lvbuHpNum = 0
}
println("吕布剩余血量:$lvbuHpNum")
}
}
// 判断战斗结果并调用died方法
if (zhaoyunHpNum <= 0) {
zhaoyun.died()
} else if (lvbuHpNum <= 0) {
lvbu.died()
}
}
}
}
}
}
}
}
}
六.运行结果
下面是游戏运行结果