# 2022TankCampaign **Repository Path**: Sohu1024Tank/2022TankCampaign ## Basic Information - **Project Name**: 2022TankCampaign - **Description**: 1024AI坦克大赛 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 10 - **Created**: 2022-07-30 - **Last Updated**: 2023-10-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 搜狐1024|第三届AI坦克大赛赛程 ## 第一轮 小组赛 ### 小组赛-A组: >名称:AI RANK
>时间:10月13日
>参赛人数:最多16支
>地图:0.AIrank_simple
>赛制:单人赛,按照击杀数排名,击杀数一致的,用时少者排名靠前,共计7轮,首轮敌方坦克数量15,按轮次递增,第7轮增至45辆,积分排名选出前8 ### 小组赛- B组: >名称:车轮赛
>时间:10月12日、10月14日
>参赛人数:最多16支
>地图:0.AIrank_simple,90s
>赛制:车轮赛,敌方坦克25辆,两两PK,换边双赛,不互杀,以杀敌总数量积分排名选出前8 ## 第二轮 预决赛 >时间:10月18日、10月20日
>参赛人数:16支
>地图:sanguo_huarong_road_2022,90s
>参赛人数:AB组共16支队伍进入预决赛
>赛制:车轮赛,敌方坦克21辆,两两PK,换边双赛,不互杀,以杀敌总数量积分选出前8 ## 第三轮 决赛 >时间:10月24日下午
>参赛人数:8支
>地图:99.battle_double_mountain_simple_2022,90s
>赛制:单血模式,小组抽签选边,两两pk,三局两胜制 ## ✦决赛备注 >①一方击杀对手:AI坦克击杀完毕进入红蓝互杀模式,击杀对手方获胜;
>②一方被AI击杀:另一方击杀完AI或存活至90s后均可获胜;
>③AI杀完,双方僵持:读秒结束以积分判胜负;
>④被AI双杀:重赛。
# 参赛指南 ## Description 玩家在提交的JS脚本中,需要提供一个`land`方法的实现,用于配置本队坦克的攻击行为和移动模式。

```typescript // simple demo: 举例搜狐队的a b文件大体框架 // 搜狐队playerA.js class PlayerA { // 具体参数签名见下方land说明 // 返回的字符串是队伍名称 land(args: any): string {} } // 搜狐队playerB.js class PlayerB { land(args: any): string {} } ``` ## land land方法能够获取游戏主程序提供的关键参数,并将在游戏主程序被调用: 签名如下: ```javascript const playerName = land(aMyTankCount, aTankCount, aBulletCount, aMyBulletCount1, aMyBulletCount2, aworld, screenX, screenY, config) ``` ### Return 1. playerName `string` 玩家队伍名称。 ### Parameters 1. aMyTankCount `Array` 我方坦克实例,其中`id == 100`的是A队坦克,(非aiRank模式下)`id == 200`的是B队坦克。 2. aTankCount `Array` 所有敌方坦克(即ai坦克)。 3. aBulletCount `Array` 所有敌方子弹。 4. aMyBulletCount1 `Array` 我方A队的所有子弹。 5. aMyBulletCount2 `Array` (非aiRank模式下)我方B队的所有子弹。 6. aworld `Array<[x, y, width, height, type, life]>` 地图被划分为多个格子,按照从左到右、从上到下的顺序,被记录在一个数组中。 单个格子的信息使用数组表示,其中`x、y`为位置坐标,`width、height`为宽高(固定为50px),`type`为格子类型,`life`为阻挡物的当前剩余血量。 | type | description | maximum life | | ---- | ----------- | ---- | | 0 | 道路 | 9999 | | 1 | 金属 | 300 | | 2 | 水域 | 9999 | | 3 | 草丛 | 4000 | | 4 | 冰块 | 50 | | 5 | A队坦克的出生点 | — | | 6 | B队坦克的出生点 | — | | 7 | 敌方坦克的出生点 | — | | 8 | 砖块 | 18 | | 9 | 再生砖 | 18 | | 10 | 再生冰 | 50 | 7. screenX `number` 地图宽度。 8. screenY `number` 地图高度。 9. config `Readonly Object` 本场游戏配置: | property | type | description | | -------------------------------------------------------------- | ------------------------- | ------------------------------------------------------ | | gameMode | 1 \| 2 \| 3 \| 4 \| 0 | 本场游戏模式:1 -> 预赛A组(aiRank),2 -> 预赛B组(车轮赛) ,3 -> 预决赛(车轮战), 4 -> 决赛 ,0 -> 未识别。 | | | | isAIRank | boolean | 当前是否处于aiRank模式。 | | isBattleMode | boolean | 是否能够击杀对面玩家。 | | weatherTypes | \["rain", "snow", "wind"] | 所有天气类型。 | | currentWeather | "rain" \| "snow" \| "wind" | 当前天气。 | | isAiSuperBullet | boolean | AI坦克的子弹是否处于暴击状态,如果此时天气为雪天就是暴击。 | | aiTankBulletSpeed | number | AI坦克的子弹速度。 | | equip | { life: [number, number]; power: [number, number]; bullet: [number, number] } \| undefined | 道具位置坐标。 | playerAKill | number | A队当前击杀数。 | playerBKill | number | B队当前击杀数。

## MyTank 我方坦克,包含以下属性: | property | type | initialValue | description | | --------- | ------- | ----------------------- | ----------------------------- | | Hp | number | n \* 10 | 剩余血量,初始值由地图指定,如果该地图未指定则默认为10 | | speed | number | 7 | 移动速度 | | direction | 0|1|2|3 | 0 | 移动方向,0-上,1-右,2-下,3-左 | X | number | A队:400,B队:screenX - 400 | 位置横坐标 | | Y | number | 400 | 位置纵坐标 |


## Tank AI坦克,包含以下属性: | property | type | initialValue | description | | --------- | ------- | ----------------------- | ----------------------------- | | Hp | 10 \| 20 \| 30 \| 40 | n \* 10 | 剩余血量,初始值由地图指定 | | speed | number | 2 | 移动速度 | | direction | 0|1|2|3 | 随机值 | 移动方向,0-上,1-右,2-下,3-左 | | X | number | 地图指定 | 位置横坐标 | | Y | number | 地图指定 | 位置纵坐标 |


## Bullet 子弹,包含以下属性: | property | type | initialValue | description | | --------- | ------- | ----------------------- | ----------------------------- | | direction | 0|1|2|3 | 随机值 | 移动方向,0-上,1-右,2-下,3-左 | | X | number | 地图指定 | 位置横坐标 | | Y | number | 地图指定 | 位置纵坐标 |


## 坦克操控原理 在js脚本中,玩家通过模拟不同按键的键盘事件来控制坦克移动和开火。 1. A队玩家使用 `W、S、A、D` 按键(keycode为87、83、65、68)控制坦克移动,使用 `Space` 按键(keycode为32)开火; 2. B队玩家使用 ⬆️、⬇️、⬅️、➡️ 按键(keycode为38、40、37、39)控制坦克移动,使用 `BackSpace` 按键(keycode为8)开火。


## URL参数介绍 游戏配置参数可通过修改URL的查询字段进行配置: | param | description | | -------- | ---------------------------------------- | | campaign | 1-关闭互杀模式;其他-开启互杀模式(默认) | | debug | 1-开启debug模式,比赛数据不上传至服务器(默认);其他-关闭debug模式 | | eCount | AI坦克数量,未指定时则读取地图提供的默认值 | | equip | 1-开启装备增强模式(默认);其他-关闭装备增强模式 |


## 新玩法 ✨ 2022年坦克大赛加入了“天气”的地图环境属性,目前的天气类型包括风、雪、雨三种。 比赛开始一段时间后,会随机出现一种天气,目前天气出现的时间为开赛后2秒,在正式比赛中将延长为15秒。 开启天气后,会出现如下变化: 1. 💨 风:AI坦克移速(`speed`)加1。 2. ❄️ 雪:我方坦克子弹速度(`playerBulletSpeed`)增加10%(注:天气出现前射出的子弹不受影响)。 3. 🌧️ 雨:AI坦克开启暴击状态(`isAiSuperBullet`)。