Coder Social home page Coder Social logo

2017_ele_hackathon_tank's Introduction

比赛形式

  1. 比赛采取循环赛制,即每组队伍循环和其他队伍进行两两对战,单局比赛获胜方得3分,败者得0分,平局各得1分。最终获得分数高的队伍获胜。
  2. 组委会提供5张对战地图。第一个星期一张(公开),第二个星期一张(公开),最后一天提供三张(不公开)。最终单局比赛成绩取最后一天两只队伍在5张地图上的对战结果计算,每局比赛胜利算一分,最终分数高的获胜。然后各个队伍间按循环赛积分进行排名。
  3. 前期的比赛只公布各团队的积分,对对战过程进行保密。

比赛细节描述

  1. 地图大小为N*N(每张地图可能大小不一致),中心旋转对称,队伍的tank出生在地图的两个对边角上。
  2. 地图上有以下元素(但是不保证所有的元素在每一张地图中都会出现)
    1. 障碍物,不可被摧毁。地图的最外围会被一圈障碍物覆盖。
    2. 战旗,始终固定在地图中心出现。可被经过的tank获得。战旗消失后会在固定回合后重新出现。
    3. 森林,处于森林中的tank不会被敌方发现。处于森里中的炮弹对双方均不可见。
  3. 每只队伍M量tank。
  4. 每辆tank在地图上最多只能存在一发炮弹。必须在之前发射的炮弹消失掉之后才能进行开火的操作。
  5. tank可以进行如下操作:左转,右转,掉头,前进,原地不动,开火。开火方向可以和坦克的行进方向不一样。开火方向限制在上下左右四个方向(游戏中所有的方向均以地图为基准,即向左转向会转到地图向左的方向,而不是tank自己的左方。)。每个回合只能执行一个操作。前进只能走完tank速度的全程。
  6. tank速度为x,炮弹速度为y,其中x<y。
  7. 炮弹之间不能互相抵消,炮弹不区分敌我。
  8. tank有H格血量,每发炮弹只能打掉tank一格血量。
  9. 炮弹具有最高优先结算权,即游戏首先结算炮弹的行进,然后再结算tank的开火,最后结算行进和移动操作。如果炮弹击毁一辆tank,此辆tank将不具有进行下一步操作的权利。炮弹命中tank或障碍物之后炮弹即消失。多发炮弹命中同一量坦克后,所有炮弹全部消失,即使被命中的tank只有一滴HP。tank行进路上遭遇炮弹会被判定为被击中。
  10. 同一坐标不允许有两辆tank存在,即两辆tank的下一步操作导致进入相同坐标,这两辆tank的位置停留在进入相同坐标前的位置。例如,如果两辆坦克行进两格后会处于同于位置,则两辆坦克各自行进一格。
  11. 单场地图比赛获胜条件: A)在限定的回合当中,一方的坦克被全部击毁则游戏结束,幸存的一方获胜。 B)在限定的回合结束后,双方均有坦克存留,按以下方式结算:
    1. 每辆剩余的tank获得i分
    2. 每一面获取的战旗得j分
    3. i+j分数高的一方获胜

游戏方式

回合制。每回合敌我双方都有行动一次的机会。子弹先行动。

游戏引擎设计

  1. 参赛选手的程序和判题程序通过thrift协议交互。idl定义在 src/main/resources/player.idl中。
  2. 参赛选手的程序部署在独立的docker上,并启动相应的thrift服务。
  3. 游戏初始,判题程序向参赛双方提供如下数据:地图,每辆坦克的属性
  4. 之后判题程序工作于询问模式,每回合询问参赛双方一次操作指令,然后对操作指令进行结算,并将结算结果返回参赛双方,并进入下一回合。
  5. 每回个超时时间为s毫秒,如果超时则视参赛方tank不进行任何操作。
  6. 比赛最多进行t回合。如果t回合之前一方tank全部被击毁,游戏结束。

选手程序设计

  1. 参赛选手的程序需要实现src/main/resources/player.idl中定义的服务,并启动在80端口上。
  2. 参赛选手需要自己订制docker容器,启动脚本为 /data/start.sh

为了保证比赛的公平性以及区分度,组委会保留对以上描述中的变量(n,m,x,y,h,i,j,t)进行临时调整的权利。大致范围如下 N<30,M<5, X<Y<=4, h<4, i=j, t<=200, s<=2000ms

构建

1.由于比赛需要2名玩家,所以本地要先构建出2名玩家的 server。项目文件夹下有2个文件夹,一个是8080,另一个是8081,分别代表2名玩家。分别进入到2个文件夹下,执行

go build server.go

编译出最新的 server 的可执行文件。

注:比赛由于需要提交 80 端口的程序,运行在 Docker 内。所以在 Mac 上需要交叉编译 Linux 平台,编译命令 :

GOOS=linux GOARCH=amd64 go build server.go

至于 Docker 打包成 image 的步骤见另外 repo 内另外一份 docker文档

2.执行 play_game 文件夹下的 start_play_game.sh 文件,把游戏引擎跑起来。最终游戏输出的结果会存在 play_game/data/logs 路径下。

3.上传 log 文件到游戏回放网页观看游戏回放。游戏回放网页 可能会变成内网访问。

游戏最终结果由于游戏引擎判出:


Game result: {
  "result" : "draw",
  "win" : null,
  "state" : "localhost:8080: 6,localhost:8081: 6",
  "reason" : ""
}


更改游戏参数

更改游戏参数和游戏地图都是在 start_play_game.sh 文件中进行更改的。


#! /bin/bash


exec java -cp ./data/client/tank.jar:./data/client/classes ele.me.hackathon.tank.GameEngine ./data/secondweekmap.txt 4 1 2 1 1 1 100 2000 localhost:8080 localhost:8081 2>&1  | tee ./data/logs/engine.log


依次说明一下参数:

./data/secondweekmap.txt 地图。目前在 ./play_game/data/ 路径下包含7张地图可以选择。

4 坦克数量
1 坦克速度
2 炮弹速度
1 每辆坦克的血量格
1 击毁坦克得分
1 夺旗得分
100 比赛最多进行的回合数
2000 每回个超时时间毫秒

依次更改上述的参数可以达到游戏选关和难度调整的目的。

7张地图依次是:

我方坦克策略

寻路:A* 寻路

躲避:A* 自动判断。把子弹2回合以后的行径路线上标识为不可达。为何是2回合?因为坦克转向需要一回合,另外一个回合移动。所以要先预判2回合。

坦克角色分配:

第一辆坦克,“杀手”职业,追着敌方坦克打。
第二辆坦克,“夺旗”职业,围着地图中心点周围 9 * 9 的格子徘徊。
第三辆坦克,“辅助”职业,围着地图中心点周围四分之一地图大小徘徊。
第四辆坦克,“猥琐”职业,专门躲在草丛中,放暗剑,在草丛中游走。

这四辆坦克的重要性依次降低。最重要的就是第一辆。所以每死一辆坦克,职业都要进行重新排列,按照坦克编号重新编排一下职业。这里就会有职业转换的问题。

第一辆坦克有可能找不到敌方的坦克,因为敌方都躲在草里。这时候,杀手就会开启“扫荡”模式,走到每个草丛前,朝着草丛开一枪就走人,换下个草丛,依次轮过去。

作者

Produced by halfrostmmoaay and EyreFree.

2017_ele_hackathon_tank's People

Contributors

eyrefree avatar halfrost avatar mmoaay avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

asdlei99

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.