Java Swing手搓童年坦克大战游戏(III)

坦克大战豪华山寨版二期工程

计划:实现【道具功能】【分数统计、排行榜】【多种类型敌军坦克派遣】【自建地图】【游戏存档读档】【联网实现双人配合】等,修复一些严重的bug。由于功能比较多,目测会分多篇文章记录......

前言

通过对原游戏的观察,携带道具的敌方坦克有一圈红线围绕,当玩家击中这个坦克,地图上就会出现一个道具,道具有6种:星星炸弹护盾(圈)钟表城堡坦克。每种道具有不同的功能,初步推测,道具出现的位置也是随机的。

坦克周围的红线圈有一个绕坦克转圈的动画效果;一局游戏20辆坦克,有5个道具,平均每4辆一个道具,每4个坦克,第三辆将出现道具坦克。

6种道具

名称 效果
星星 增强火力和炮弹速度、移动速度
炸弹 消灭地图上所有敌军坦克
护盾 一段时间内无视敌军炮弹
钟表 一段时间内敌军坦克停止移动、停止发射炮弹
城堡 老家周围出现一圈钢铁保护,持续20秒
坦克 增加一条生命

星星

玩家获得此道具,坦克外观会发生变化,移动速度加快,坦克火力增强,随着获得星星道具的增多,这些变化都是渐进的,会逐步增加。三个星星封顶,再多吃也不会有更强的火力了。

炸弹

炸弹道具,吃掉此道具后,地图上的敌军坦克全部被摧毁。

kt 复制代码
darkAI?.let { dai ->
    //消灭地图上的所有敌军坦克,然后播放一次爆炸音效
    var enemyDie = false
    for (enemy in dai.list) {
        if (!enemy.shells.isDestroyed) {
            die(enemy)
            boom(enemy)
            enemyDie = true
        }
    }
    if (enemyDie) {
        AC.soundManager?.play(AC.bang)
    }
}

护盾(圈)

在玩家坦克刚出现的时候,或者玩家吃了护盾道具的时候,会有一定时间的无敌状态,刚出现在地图上大约有5秒。吃了护盾道具大约有1分钟或者30秒的无敌时间,这个还需要测试。实测结果,感觉30秒的时间过长,还是改为20秒比较合理一点。

通过对Battle City游戏的观察,他的道具显示时间为30秒,暂时就定30s了。在这30秒的时间内,玩家坦克周围出现一个保护圈,当敌军坦克击中玩家坦克,这个保护圈就可以挡住敌军炮弹,保护玩家坦克免遭袭击。

kt 复制代码
if (prop is Shield) {
	player.invincible = true
	player.invincibleCounter = 60 * 30//30 seconds
}

玩家无敌状态的逻辑处理

java 复制代码
if (!enemy.shells.isDestroyed && !player.isDestroyed) {
    //敌军的炮弹击中了玩家坦克
    if (player.pickRect().intersects(enemy.shells.pickRect())) {
        //判断玩家是否处于无敌状态,如果是则玩家对炮弹免疫
        if (player.invincible) {
            die(enemy.shells)
        } else {//玩家处于普通状态
            AC.soundManagerPD?.play(AC.playerdie)
            die(player)
            die(enemy.shells)
            boom(player)
        }
    }
}

钟表

一段时间内敌军坦克停止移动、停止发射炮弹。这个道具的效果在坦克出生位置如果出现多个坦克的情况会出现bug,后续会修复。目前先维持现状。

城堡

老家周围出现一圈钢铁保护,持续20秒。

kt 复制代码
if (prop is Castle) {// 城堡道具类,用钢铁代替砖头保护老家20秒
    for (iron in ironArray) {
        for ((index1, gameObject) in list.withIndex()) {
            if (iron?.id == gameObject.id) {
                CP.tileArray[iron.row][iron.col] = iron
                CP.mapArray[iron.row][iron.col] = CP.TILE_IRON.toByte()
                list[index1] = iron
            }
        }
    }
    protectFps = protectTime * getFps()
}

坦克

当玩家坦克吃掉一个坦克道具,将增加一条生命。lightAI.addLife(1)

目前存在的问题

bug#22\]钟表效果结束后,敌军坦克有异常,某些敌军被挤出窗口,卡在边缘动弹不得。 有时候还会造成arrayIndexOutOfBoundsException。后续修复。 \[bug#23\]多个敌军坦克排队前进向同一个方向发射炮弹,有bug,导致有些坦克无法发射炮弹,炮弹飞跃瓦片 \[bug#24\]多个坦克在出生位置产生重叠,这种情况在定时结束后,如何处理移动、被炮弹击中,比较理想呢。 ## 效果 ![在这里插入图片描述](https://file.jishuzhan.net/article/1786780318770925569/4076838e5d612da5c71243e04ebd214b.webp) ## 总结   项目代码已经开源,可以访问[github](https://github.com/ximen502/WarOfTank)或[gitee](https://gitee.com/ximen502/WarOfTank)进行获取。   链接中release和发行版有编译好的可执行jar包,也可以直接下载后,在命令行或终端中执行`java -jar WarOfTank.jar`,就可以愉快的玩起来了。当然前提是电脑中已经安装了java环境。理论上,Windows,Mac,Linux都能运行。Linux和Windows测试功能正常。

相关推荐
ChinaRainbowSea12 分钟前
1. 初始 RabbitMQ 消息队列
java·中间件·rabbitmq·java-rabbitmq
lmryBC4921 分钟前
golang接口-interface
java·前端·golang
ゞ 正在缓冲99%…22 分钟前
leetcode75.颜色分类
java·数据结构·算法·排序
橘猫云计算机设计34 分钟前
基于springboot的考研成绩查询系统(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·python·考研·django·毕业设计
时光呢39 分钟前
JAVA常见的 JVM 参数及其典型默认值
java·开发语言·jvm
程序媛学姐1 小时前
SpringKafka错误处理:重试机制与死信队列
java·开发语言·spring·kafka
向阳2561 小时前
SpringBoot+vue前后端分离整合sa-token(无cookie登录态 & 详细的登录流程)
java·vue.js·spring boot·后端·sa-token·springboot·登录流程
XiaoLeisj1 小时前
【MyBatis】深入解析 MyBatis XML 开发:增删改查操作和方法命名规范、@Param 重命名参数、XML 返回自增主键方法
xml·java·数据库·spring boot·sql·intellij-idea·mybatis
风象南1 小时前
SpringBoot实现数据库读写分离的3种方案
java·spring boot·后端
振鹏Dong1 小时前
策略模式——本质是通过Context类来作为中心控制单元,对不同的策略进行调度分配。
java·策略模式