坦克大战-kotlin

坦克大战

|------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------|----------|
| 专栏简介 |||
| 💒个人主页 📰专栏目录 点击上方查看更多内容 | 📖心灵鸡汤📖 人生中,有些事情是我们可以掌控的,把握得好,我们会拥有更多的成功机会,即使失败,也不会怨天尤人。 | 欢迎订阅!收藏! |

游戏需求

  仿照IT黑马kotlin教程中的坦克大战,在它的基础上做了以下升级:

  1.增加侧边栏,显示敌我双方的坦克数量

  2.敌方坦克生成的同时,随机生成不同样式的坦克

  3.追加坦克打击视图

👇核心玩法👇

  1️⃣.经典坦克大战

👇界面原型👇

主图采用9X9布局,侧边栏使用3X9

👇成品演示👇

游戏开发

   下面就总结下实现过程。

|--------|-------|
| gradle | 7.4.2 |
| jdk | 1.8 |

我这里只贴与it黑马kotlin教程中的演示代码不同部分。代码并非完整代码

1.代码实现

1.build.gradle.kts 配置

kotlin 复制代码
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile

plugins {
    kotlin("jvm") version "1.7.10"
}

group = "org.example"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
    maven{url=uri("https://jitpack.io")}
}

dependencies {
    testImplementation(kotlin("test"))
    implementation("com.github.shaunxiao:kotlinGameEngine:v0.0.4")
}

tasks.test {
    useJUnitPlatform()
}

tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

2.我方坦克

限制坦克连接发射,防止持续按Enter时子弹持续发射

kotlin 复制代码
  //发射频率限制-防止一直按着发射键时,循环发射
    var lastShot=0L
    var shotSpeed=500

fun shot():Bullet?{
        var currentTimeMillis = System.currentTimeMillis()
        //连击限制
        if (currentTimeMillis-lastShot>=shotSpeed){
            lastShot=currentTimeMillis
        }  else {
            return null
        }
        var bulletX=0
        var bulletY=0
        var bulletWidth=17
        var bulletHeight=17
        when(crueeDirection){
            Direction.UP->{
                bulletX=x+(width-bulletWidth)/2
                bulletY=y-bulletHeight
            }
            Direction.DOWN->{
                bulletX=x+(width-bulletWidth)/2
                bulletY=y+height
            }
            Direction.LEFT->{
                bulletX=x-bulletWidth
                bulletY=y+(height-bulletHeight)/2
            }
            Direction.RIGHT->{
                bulletX=x+width
                bulletY=y+(height-bulletHeight)/2
            }
            else -> {}
        }
        Composer.play("sond/fire.wav")
        return Bullet(crueeDirection,bulletX,bulletY,this)
    }

3.敌方坦克视图样式随机生成

kotlin 复制代码
//绘制
    var i = Random.nextInt(1..2)
    override fun drow() {
        println(i)
        var imgPath = when (crueeDirection) {
            Direction.UP -> "/img/enemy${i}U.gif"
            Direction.DOWN -> "/img/enemy${i}D.gif"
            Direction.LEFT -> "/img/enemy${i}L.gif"
            Direction.RIGHT -> "/img/enemy${i}R.gif"
            else -> {"/img/p1tankU.gif"}
        }
        Painter.drawImage(imgPath,x,y)
    }

4.坦克(墙面)受击视图反馈 (追加相应音效)

两种视图,一种为受击不销毁,一种为受击销毁视图

kotlin 复制代码
 override fun notifySuffer(attackAble: AttackAble): Array<View>? {
        if (attackAble.woner is Enemy){
            //自己打自己不反应
            return null
        }
        blood-=attackAble.atk
        if (blood==0){
            Composer.play("sond/blast.wav")
            return arrayOf(Blast(x-30,y-30))
        }else{
            Composer.play("sond/hit.wav")
            return arrayOf(Born(x,y))
        }
    }

5 侧边栏绘制 Bar.ks

kotlin 复制代码
    class Bar(override val x: Int, override val y: Int) :View {
    
        override val width: Int=60
        override val height: Int=60
    
        override fun drow() {
            Painter.drawImage("/img/bar.jpeg",x,y)
            Painter.drawText("敌方坦克:",x,y+30, Color.BLACK, Font.font(20.00))
            Painter.drawText("我方坦克:",x,Config.gameHeight-100, Color.BLACK, Font.font(20.00))
        }
    
    }

6.创建BarAble

kotlin 复制代码
interface BarAble:View {
}

7.创建MiniTank.ks 和 TankLife.ks 用于侧边栏中敌方坦克和我方坦克数量的展示

kotlin 复制代码
class MiniTank(override var x: Int, override var y: Int,var totalTank:Int) :BarAble {


    override val width: Int = 30
    override val height: Int =30

    var nowTankCount=totalTank;

    var indexLst= arrayListOf<Pair<Int,Int>>()
    init {
        var tankX=x+5
        var tankY=y+40
        var index=0
        (0..nowTankCount).forEach {
            if (index==5){
                tankX=x+5
                tankY+=40
                indexLst.add(Pair(tankX,tankY))
                index=0
            }else{
                indexLst.add(Pair(tankX,tankY))
            }
            tankX+=35
            index++
        }
    }

    override fun drow() {
        var i=0
        indexLst.forEach { index->
            if (i>=nowTankCount){
            }else{
                Painter.drawImage("img/mintank.gif",index.first,index.second)
            }
            i++
        }
    }
}

8.敌我双方坦克数量在侧边栏重新绘制

kotlin 复制代码
views.filter {  it is DestoryAble }.forEach { dis->
            dis as DestoryAble
            if (dis.isDestory()){
                views.remove(dis)
                if (dis is Enemy){
                    totalEnemyNum--
                    views.filter {  it is MiniTank }.forEach { mini->
                        mini as MiniTank
                        views.remove(mini)
                        //bar 处理
                        views.add(MiniTank(Config.gameWidth,0,totalEnemyNum))
                    }
                }

                if (dis is PTank){
                    totolMyTank--
                    views.filter {  it is TankLife }.forEach { mini->
                        mini as TankLife
                        views.remove(mini)
                        if (totolMyTank>0){
                            tank=PTank(Config.block*7,Config.block*8)
                            views.add(tank)
                        }
                        //bar 处理
                        views.add(TankLife(Config.gameWidth,Config.gameHeight-130,totolMyTank))
                    }
                }
            }
        }

9.结束判断

kotlin 复制代码
        if ((views.filter { it is Camp }.isEmpty()) or (totalEnemyNum<=0) or(totolMyTank<=0)) gameOver=true

10.结束视图

kotlin 复制代码
 if (gameOver){
            Painter.drawImage("img/over.gif",Config.block*4,Config.block*4)
            return
        }

源码下载

|----------------------------------------------|----------------------------------------------|
| 源码下载 ||
| 🙊营业公告🙊 | 源码获取 🔗 |
| 🕣工作日:早8:30-晚5:30 | 源码获取 🔗 |
| 📢可在👇下方留言👇获取源码 | 源码获取 🔗 |
| 源码获取 🔗 |

相关推荐
小羊没烦恼!4 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
千里马学框架4 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台4 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone4 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
伞伞悦读4 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
致远ccc4 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
C语言小火车4 天前
C/C++ 为什么需要编译器?
开发语言·c++
霍霍的袁4 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
ttyyttemo4 天前
Kotlin 协程中的 Job 结构化并发与取消
android
孙启超4 天前
【AI开发之Rust】第 11 课:智能指针与内部可变性
开发语言·后端·rust