坦克大战-kotlin

news2025/1/17 16:04:46

坦克大战

    • 游戏需求
      • 👇核心玩法👇
      • 👇界面原型👇
      • 👇成品演示👇
    • 游戏开发
      • 1.代码实现
    • 源码下载

专栏简介

💒个人主页
📰专栏目录

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

游戏需求

  仿照IT黑马kotlin教程中的坦克大战,在它的基础上做了以下升级:
  1.增加侧边栏,显示敌我双方的坦克数量
  2.敌方坦克生成的同时,随机生成不同样式的坦克
  3.追加坦克打击视图

👇核心玩法👇

  1️⃣.经典坦克大战

👇界面原型👇

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

👇成品演示👇

在这里插入图片描述

游戏开发

   下面就总结下实现过程。

gradle7.4.2
jdk1.8

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

1.代码实现

1.build.gradle.kts 配置

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时子弹持续发射

  //发射频率限制-防止一直按着发射键时,循环发射
    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.敌方坦克视图样式随机生成

//绘制
    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.坦克(墙面)受击视图反馈 (追加相应音效)
两种视图,一种为受击不销毁,一种为受击销毁视图

 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

    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

interface BarAble:View {
}

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

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.敌我双方坦克数量在侧边栏重新绘制

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.结束判断

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

10.结束视图

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

源码下载

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/896354.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

<CodeGeeX>基于大模型的全能AI编程助手

CodeGeex官网 智谱AI官网 CodeGeex是由清华大学 KEG 实验室和智谱 AI 公司于2023共同训练的代码生成模型 CodeGeeX 开发的AI助手。它基于深度学习技术&#xff0c;能够针对用户的问题和要求提供适当的答复和支持。CodeGeex的功能包括代码生成、自动添加注释、代码翻译以及智能问…

Unity制作一个简单的登入注册页面

1.创建Canvas组件 首先我们创建一个Canvas画布&#xff0c;我们再在Canvas画布底下创建一个空物体&#xff0c;取名为Resgister。把空物体的锚点设置为全屏撑开。 2.我们在Resgister空物体底下创建一个Image组件&#xff0c;改名为bg。我们也把它 的锚点设置为全屏撑开状态。接…

看完这篇文章,被这个学习技巧狠狠吸引了!

思政课程的学习不仅仅是课堂知识的传授&#xff0c;更是培养学生全面发展和积极参与社会的能力的过程。学生应该认真学习思政课程&#xff0c;积极思考&#xff0c;结合自己的实际情况&#xff0c;形成独立的思考和判断。 通过思政通学习小程序的多样化知识&#xff0c;学生可以…

剑指Offer37.序列化二叉树 C++

1、题目描述 请实现两个函数&#xff0c;分别用来序列化和反序列化二叉树。你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑&#xff0c;你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结…

利用css动画和定时器setTimeout,实现上传图片进度条

思路 利用css动画和js定时器&#xff08;setTimeout&#xff09;&#xff0c;实现简单的进度条。 优势 不使用 setInterval&#xff0c;减少js代码量&#xff0c;业务代码更加简洁。 示意图 上传中上传成功上传失败 代码 html <!-- img-wrap有两种状态&#xff1a;u…

【O2O领域】Axure外卖订餐骑手端APP原型图,外卖配送原型设计图

作品概况 页面数量&#xff1a;共 110 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;外卖配送、生鲜配送 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本品为外卖订餐骑手端APP原型设计图&#x…

以太网(一):PoE供电

一、定义&#xff1a; PoE系统包括供电端设备&#xff08;PSE&#xff09;和受电端设备&#xff08;PD&#xff09;两部分PoE&#xff08;Power over Ethernet&#xff09;&#xff1a;​是一种可以在以太网中透过双绞线来传输电力与数据到设备上的技术PSE&#xff08;Power S…

ROS局部路径规划器插件teb_local_planner规划流程概括总结

本部分文章主要用于对ROS局部路径规划器插件teb_local_planner的规划流程进行梳理&#xff0c;并概括总结&#xff0c;本部分计划包含5~6篇文章&#xff0c;各文章主要内容如下&#xff1a; ☆第一篇&#xff1a;主要介绍ROS导航包Navigation中的 Movebase节点中的路径规划的相…

1000元到3000元预算的阿里云服务器配置大全

1000元、2000元或3000元预算能够买的阿里云服务器配置有哪些&#xff1f;可以选择ECS通用算力型u1云服务器、ECS计算型c7或通用型g7实例规格&#xff0c;当然&#xff0c;如果选择轻量应用服务器的话&#xff0c;更省钱&#xff0c;阿里云百科分享1000-3000元预算能买的阿里云服…

敏捷项目管理解决方案

Leangoo领歌是一款永久免费的专业敏捷研发管理工具&#xff0c;提供敏捷研发解决方案&#xff0c;解决研发痛点&#xff0c;打造成功产品。帮助团队实现需求、迭代、缺陷、任务、测试、发布等全方位研发管理。 敏捷产品路线图管理&#xff1a; 产品路线图是一个高层次的战略计…

Android 9.0 Vold挂载流程解析(下)

Android 9.0 Vold挂载流程解析&#xff08;上&#xff09; 前言 上一篇介绍了Android 文件系统中Vold挂载机制的总体框架&#xff0c;我们分析了vod进程的main.cpp.接下来我们分析下存储卡挂载和卸载的流程。 存储卡挂载 在上篇文章文章提到&#xff0c;监听驱动层挂载和卸…

SOLIDWORKS 2023中装配体配合的正确使用方法 硕迪科技

-SOLIDWORKS 装配体打开时是由不同的阶段和性能检查组成的。如果在创建装配体时未应用基本的配合方法&#xff0c;问题会随着时间的推移而累积&#xff0c;并且在使用时会出现明显的速度减慢。 如果您的装配体运行速度很慢&#xff0c;则很可能是在创建配合时出现了不良操作的症…

腾讯云 CODING 荣获 TiD 质量竞争力大会 2023 软件研发优秀案例

点击链接了解详情 8 月 13-16 日&#xff0c;由中关村智联软件服务业质量创新联盟主办的第十届 TiD 2023 质量竞争力大会在北京国家会议中心召开。本次大会以“聚焦数字化转型 探索智能软件研发”为主题&#xff0c;聚焦智能化测试工程、数据要素、元宇宙、数字化转型、产融合作…

Python入门--变量

变量是指在程序运行期间可以改变其值的数据类型。在Python中&#xff0c;变量可以指定任何数据类型&#xff0c;如字符串、整数、浮点数等。 要创建一个变量&#xff0c;我们必须先指定变量的名称&#xff0c;然后将其赋值。在Python中&#xff0c;变量名可以是任何有意义的名…

分布式基础

1、分布式简介 1.1、分布式定义 分布式系统是一个硬件或软件组件分布在不同的网络计算机上&#xff0c;彼此之间仅仅通过消息传递进行通信和协调的系统。 1.2、分布式特点 分布性&#xff1a;分布式系统中的多台计算机都会在空间上随意分布&#xff0c;同时&#xff0c;机器…

本地访问远程web服务

1、 2、以管理员身份运行cmd ssh usernameremote_address -L 127.0.0.1:8888:127.0.0.1:8008 3、在远程服务器上去运行web服务 4、本地访问

【BASH】回顾与知识点梳理(三十六)

【BASH】回顾与知识点梳理 三十六 三十六. 认识与分析登录档36.1 什么是登录档CentOS 7 登录档简易说明登录档的重要性Linux 常见的登录档档名登录档所需相关服务 (daemon) 与程序CentOS 7.x 使用 systemd 提供的 journalctl 日志管理 登录档内容的一般格式 36.2 rsyslog.servi…

C++中String的语法及常用接口用法

在C语言中&#xff0c;string是一个标准库类&#xff08;class&#xff09;&#xff0c;用于处理字符串&#xff0c;它提供了一种更高级、更便捷的字符串操作方式&#xff0c;string 类提供了一系列成员函数和重载运算符&#xff0c;以便于对字符串进行操作和处理。 一、string…

大模型系列|基于大模型的聊天助手案例(三)

大模型系列&#xff5c;垂直大模型的几种训练策略&#xff08;一&#xff09; 大模型系列&#xff5c;基于大模型复杂数据系统架构&#xff08;二&#xff09; 本篇主要是采集一些大模型在聊天机器人中的案例&#xff0c;因为目前很多企业都会考虑将LLM与业务结合&#xff0c;L…

LSTM网络模型:从基础到应用播

目录 介绍 LSTM的基础结构 LSTM的训练方法 LSTM的应用场景 总结 LSTM&#xff08;Long Short-Term Memory&#xff09;网络模型是一种递归神经网络&#xff0c;被广泛应用于自然语言处理、语音识别、图像处理等领域。本文将从LSTM的基础结构、训练方法、应用场景等方面进行…