您好,欢迎来到星星旅游。
搜索
您的当前位置:首页statement

statement

来源:星星旅游
“国家队爷”杯液体战争AI比赛

VFleaKing&hzhwcmhf

May26,2014

1󳚠󱱃

在很遥远的地方有一个星球,上面的几乎全是固体,液态物质很少。经过漫长的演化,有一天液体内部突然产生了精细结构,从而有了自己的意识。紧接着,这个星球很快被液态生命布满了。

液体是没有脑子的,没有脑子就无法思考。

在漫长的演化过程中,液体终于发现最佳的策略是让一部分个体聚集起形成一个大脑,通过奇妙的电信号来指导其它液体的行动。这样才不会乱成一团。

以硫酸为首的酸率先发现了这样优秀的生活方式,聚集了一个由酸组成的大脑。紧接着以氢氧化钠为首的碱也组成了一个由碱组成的大脑。于是酸和碱的领地不断扩张,最后几乎瓜分了整个星球。

但是,酸和碱的敌对关系是与生俱来的:酸生活的地方,碱就不能生存;碱生活的地方,酸就不能生存。终于,液体战争一触即发。

2规则󱽖述

首先放张图……

按照石蕊试液的口味,游戏分两方:红方是酸,蓝方是碱。

1

游戏在一个[0,10000]×[0,10000]的整数平面上进行,共1800回合。每回合双方都可以造液滴、移动液滴、让液滴攻击,最后摧毁敌方大脑的那一方取得胜利。

2.1造液滴

初始时没有任何液滴。

双方各有一个可造液滴数nWaiting,初始为1。每5回合自增1。红方和蓝方每回合都可以至多造nWaiting个液滴,每造完1个液滴,nWaiting会相应地减少1。

红方只能在(0,y)处产生液滴(即左边界),蓝方只能在(10000,y)处产生液滴(即右边界)。(y为整数,1≤y≤10000)

2.2移动液滴

每回合双方可以移动己方液滴。液滴行动速度很慢,一回合只能在所处位置为圆心,半径为30的圆内选择一个整点,移动到此处。注意,不能超出地图边界。

2.3攻击

初始时每个液滴有血量blood=20,等级level=0。液滴可以把自己身体的一部分弹射出去对敌方液滴进行伤害。若有敌方液滴在己方液滴的攻击范围内,则可以使敌方液滴血量减1,己方液滴等级加1。当血量为0时死亡。每回合每个液滴最多只能攻击一次。

一个液滴的攻击范围是一个半径为r的圆,其r与level的对应关系由下式给出:

r=300+level×3

双方各有一个大脑,大脑可以抽象为一个圆,红方大脑圆心在(1000,5000),蓝方大脑圆心在(9000,5000),半径均为500。大脑的初始血量为5000。

如果你的液滴站在敌方大脑的范围内,就会自动对敌方大脑造成1的伤害。

2.4怎样获胜

1.如果中途有某方有非法操作,则直接判负,同时非法操作直接判平局。2.如果某方大脑血量减为0,则另一方获胜。如果大脑血量同时减为0,转到4。

3.如果满了1800回合也没有哪个大脑血量减为0,那么哪一方大脑血量少,则另一方胜利。4.如果大脑血量一样多,我们会算一个神奇的分数,描述的是每时每刻每个液滴离对方大脑有多远。离得越近,得分越高。得分高者获胜。计分方法用伪代码表示:score=0for游戏的每个回合do

for该回合存活着的每个己方液滴do

d=该液滴到敌方大脑的距离⌊d⌋score+=max(8−500,0)endforendfor

5.否则,假如连这个得分也一致,那么就平局。

2

3游戏󱘏流程

初始化双方AI。双方均不进行移动。▷游戏第0回合for1≤round<1800do▷游戏第1回合到第1799回合告诉红方round−1回合时蓝方输出,获取红方输出。告诉蓝方round−1回合时红方输出,获取蓝方输出。如果有人非法操作,则确定胜利者,游戏结束。for每个液滴do

if液滴在敌方大脑的范围内&敌方大脑血量>0then对敌方大脑造成1的伤害endifendfor

如果有大脑血量为0,则确定胜利者,游戏结束。

▷双方同时进行攻击

for(shooter,target)∈红方输出的攻击列表do▷按红方给出的攻击顺序进行攻击

iftarget.blood>0then▷shooter是攻击者,target是被攻击者target的血量减1,shooter的等级加1endifendfor

for(shooter,target)∈蓝方输出的攻击列表do▷按蓝方给出的攻击顺序进行攻击

iftarget.blood>0then▷shooter是攻击者,target是被攻击者target的血量减1,shooter的等级加1endifendfor

认定所有blood为0的液滴死亡

for(mover,pos)∈红方输出的移动列表do

ifmover未死亡then把mover移动到posendifendfor

for(mover,pos)∈蓝方输出的移动列表do

ifmover未死亡then把mover移动到posendifendfor

按红方输出的造兵列表进行造兵。按蓝方输出的造兵列表进行造兵。ifroundmod5=1then

双方的可造兵数均增加1。endifendfor

确定胜利者,游戏结束。

4输入输出格式

由于这个游戏是完全对称的,所以你只用写一个红方的AI。当你的AI作为蓝方的时候,我们会为你转地图。(即所有的y变为10000−y)

输入为标准输入,输出为标准输出。

3

round=0时无需进行任何输入输出。

对于1≤round<1800,我们会给出上回合蓝方操作,然后你需要给出你的操作。为了方便起见,我们把所有的液滴都按出生的先后顺序编上号(从0开始):红方0号、红方1号、蓝方0号、蓝方1号……这样的。如果有多个液滴在同一回合出生,则按输出顺序排序(输出顺序见下)。(即使死了编号也不变)

输入格式如下:

首先若干行表示上回合蓝方操作。(见下文)接下来一行一个正整数0。

接下来一行两个用空格隔开的正整数−1−1。

接下来一行一个正整数0。(不要问我这些东西是啥……后面再揭晓)输出格式如下:

若干行表示这回合你要进行的操作。(注意回看前面的游戏规则一节里的若干)给出一个操作的格式如下:

第一行一个非负整数nS,表示进行多少次攻击。

接下来nS行,每行两个用空格隔开的正整数shooter,target表示己方shooter号攻击敌方target号。

接下来一行一个非负整数nM,表示进行多少次移动。(未被移动的液滴会原地不动)接下来nM行,每行三个用空格隔开的正整数mover,posX,posY表示己方mover号移动到(posX,posY)的位置。

接下来一行一个非负整数nN,表示要新造多少液滴。

接下来nN行,每行一个正整数y表示新造的液滴出生位置的y坐标。(若是红方则x坐标为0,若是蓝方则x坐标为10000,所以无需输出x坐标)

顺便提醒一下输出完了之后要记得刷新缓冲区……如果你是C语言请写fflush(stdout);

如果你是C++并且喜欢用endl结束一行的话那你啥都不用管。

如果你是Pascal的话祝你早日转C++……然后你需要加一句flush(output)如果你是Java的话需要加System.out.flush();如果你是Python的话需要加sys.stdout.flush()

当游戏结束时,不需要退出自己的程序。我们会帮你kill掉。

5非法操作的判定

1.程序RE、TLE、MLE。2.程序输出的格式错误。

3.给出液滴编号的时候超出编号范围。4.试图攻击上回合已死的液滴。5.试图用上回合已死的液滴攻击。

6.一回合中试图用同一个液滴攻击多个敌方液滴。

4

7.攻击时超出攻击范围。8.试图移动上回合已死的液滴。9.一回合中多次移动相同的的液滴。10.移动距离超出30。11.移动超出地图边界。12.造兵时超出可造兵数。

13.造的新兵的y坐标超出地图边界。

6平台󴇈󱯢

官方网站:http://hzhwcmhf.duapp.com/你可以在该网站上提交AI进行对战。在该网站上可以下载最新的本地对战平台。

需要安装Java7。(如果没有装java可以去java.com下一个)平台的截图见第一页。

在PlayerRed和PlayerBlue那里输入执行你的AI的命令。

如果是可执行文件可以直接写它在文件系统中的路径。(注意不是直接放源文件)如果是解释型语言比如python,可以直接写个“pythona.py”这样的东西进去。(如果哪位仁兄不小心在命令中掺了中文请自求多福……)点Start就可以开始打了!

可以通过上面那个条条调节游戏速度。默认是0.1s一回合。

你的程序可以用错误流输出,平台会让你的错误流输出到那个上面的文本框内。红方的输入和输出在RED.in和RED.out。

蓝方的输入和输出在BLUE.in和BLUE.out。(在与平台的同一目录下)然后你会惊奇地发现MLE和TLE都没人管诶!

没错就是这样……由于我想搞个跨平台的游戏平台,所以用的java,而java内置的这种跟踪进程的API很缺乏(事实上有些操作系统不支持查看程序的用户CPU时间),所以就干脆不检查了。

但是交到网站上对战是有的,具体见http://hzhwcmhf.duapp.com/help。

怎样看网上对战的过程呢?然后在LogId那里填写你在网上对战的RunId,然后点Replay就能看了。看过的log会被缓存,想删缓存的话就删掉与游戏平台同一目录下的log文件夹即可。

观看完后能获得RED.in和BLUE.in,但是不会给出out文件。然后我来揭晓一下输入格式里面的奇怪的末尾是啥东西吧。

首先你可以用鼠标左键单击选中一个红色液滴,或者用鼠标左键托拽选中一群红色液滴的。所以对于红方,输入的末尾其实是:

一行一个正整数nC,表示有nC个液滴被选中。接下来nC行,每行一个id,表示红方id号被选中。

5

接下来一行两个用空格隔开的整数x,y表示鼠标单击的位置。如果上回合到该回合这个时间段内鼠标没有单击则为−1−1,否则(x,y)为鼠标单击时的位置。(如果有多次单击取最后一次单击)

接下来一行一个正整数nK,表示按了几个键。注意我们只会输出能用可见字符表示的按键,比如空格和回车自然是不会告诉你了……

接下来nK行,每行有一个字符c,表示上回合到该回合这个时间段内c这个键按下了。有了这些东西,就可以人工辅助你的AI了!想打红警吗?小伙伴们快行动起来吧!

7比赛规则

7.1

报名方式

比赛功能还在开发中,大家先自己写写AI玩玩吧。

7.2赛制

待定……看到时候有多少人报名吧。

7.3󰼪󰪕

我们有三本若干国家队爷签名了的书:《具体数学》,《研究之美》,《量子物理史话:上帝掷骰子吗?》

感谢花神,鼎爷,沈洋大爷,xyz大爷,法法塔,yxj,杜教,MatoNo1的友情赞助。比赛决出1、2、3名时,第一名先选一本,第二名再选一本,第三名拿走剩下的那一本。谢谢!希望大家踊跃参加!

6

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- stra.cn 版权所有 赣ICP备2024042791号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务