原帖

  这两天一直在搞这个AI,提供的样例更本不是我的风格啊,看不懂更不会改。。。

  所以我自己写了一个AI的平台,现在在不断的修改AI的策略,smart样例还是很容易过的,让line的行走速度变慢一点到每回合15一下就可以了。这里大概写一下自己写了这么久,看了这么多别人的比赛的想法。

  首先进攻分两种,一种是集群的进攻,一种是离散的进攻。集群进攻容易被拦截,但是攻击力充足(ps:规则允许多个水滴在同一个地方),离散进攻(如smart的两边)则攻击力相对较弱,但是不容易被拦截。line的进攻属于集群性进攻,有一些逗比的AI非常有效就是将中路一分为二从稍微靠上一点和稍微靠下一点走,然后就赢了。。。。防守一般是集群防守,因为张开的话火力不足而且比较慢。对付smart那种可以,但是对付line就挂了。。集群防守一般集中于大脑周围,但是也会有漏洞(水滴太少),所以应该加一个流动的机制,一旦有脑内未被打的敌方水滴,就过去打一下。这个写着有点麻烦。。。然后离散进攻的时候可以选择走没有人打得到的地方,然后就非常的慢,还要在优化一下。。。感觉以后要写得更高级恐怕KD树是不得不写了。。。

  说一下我的AI平台,node代表水滴,水滴的命令有许多种,不详细介绍(看注释),大体流程是,读入-->下命令-->执行。有点像三国志9的模式。。。所有存活水滴用两个链表来存,代码如下(SymenAIalpha2)

  

 #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <ctime>
#include <cmath>
using namespace std; struct position
{
int x;
int y; position(int a=,int b=)
{
x=a;y=b;
} bool outofrange()
{
return (x>)||(x<=)||y>||y<=;
}
}; struct node
{
int number;
int level;
position pos;
position Gototar;//集合地
int tarnum;//攻击目标,-1,向Gototar移动,自由攻击
int blood; int followNum;//和几号计划一样,虚拟计划,不是实体。0 == 没有计划 bool alive;
int movetype;
node* next;
node* last; node(int a=,position tar=position(,),int bl=)
{
movetype=;
alive=true;
number=a;
level=;
Gototar=tar;
blood=bl;
tarnum=-;
next=last=NULL;
followNum=;
}
}; node plan[];
int plancnt=;
node blue[];
node red[];
int nextred[];
int nextblue[];
int cntred=-;
int cntblue=-;
int BBB=;
int RBB=;
double getdis(node a,node b) {return sqrt((a.pos.x-b.pos.x)*(a.pos.x-b.pos.x)+(a.pos.y-b.pos.y)*(a.pos.y-b.pos.y));}
double getdis(node a,position b) {return sqrt((a.pos.x-b.x)*(a.pos.x-b.x)+(a.pos.y-b.y)*(a.pos.y-b.y));}
double getdis(position a,position b) {return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));} bool inrand(node a,node b,int dis=)
{
int far=dis+a.level*;
double ds=getdis(a,b);
if (ds<=far)
return true;
return false;
}
bool inrand(node a,position b,int dis=)
{
int far=dis+a.level*;
double ds=getdis(a,b);
if (ds<=far)
return true;
return false;
} int defcnt=; node* redl;
node* bluel; node* Add(node* a,node* root)
{
if (!a->next)
{
a->next=root;
if (a->next)
a->next->last=a;
return a;
}
return NULL;
} bool Dlt(node* now)
{
if (now->next)
{
if (now->last)
{
now->last->next=now->next;
now->next->last=now->last;
}
else
{
now->next->last=now->last;
}
return true;
}
else
{
if (now->last)
{
now->last->next=NULL;
return true;
}
else
{
return false;
}
}
} node* Clean(node* root)
{
for (node* now=root;now;now=now->next)
{
if (!now->alive)
{
if (now==root)
root=now->next;
Dlt(now);
}
}
return root;
} position GetNextStep(node a,node b,int dis=)
{
double ds=getdis(a,b);
if (ds<=dis) return b.pos;
int dx=b.pos.x-a.pos.x;
int dy=b.pos.y-a.pos.y;
return position(a.pos.x+dx*(dis/ds),a.pos.y+dy*(dis/ds));
}
int biao1[]={-,-,,};
int biao2[]={-,,-,};
int AvoidEps=;
position GetNextStep2(node a,int b,int dis=)
{
int type=plan[b].movetype;
if (type==)
{
double ds=getdis(a,plan[b].Gototar);
if (ds<=dis) return plan[b].Gototar;
int dx=plan[b].Gototar.x-a.pos.x;
int dy=plan[b].Gototar.y-a.pos.y;
position ret=position(a.pos.x+dx*(dis/ds),a.pos.y+dy*(dis/ds));
if (getdis(a,ret)>dis) ret.x--;
return ret;
}
if (type==)
{
double ds=getdis(a,plan[b].Gototar);
// if (ds<=dis) return plan[b].Gototar;
int dx=plan[b].Gototar.x-a.pos.x;
int dy=plan[b].Gototar.y-a.pos.y;
int maxd=0x3f3f3f3f;
double minds=10101010101010.0;
position ret(,);
for (int i=-dis;i<=dis;++i)
{
for (int j=-dis;j<=dis;++j)
{
if (i*i+j*j>dis*dis) continue;
if (position(a.pos.x+i,a.pos.y+j).outofrange()) continue;
int sum=;
for (node* now=bluel;now;now=now->next)
{
if (inrand(*now,position(a.pos.x+i,a.pos.y+j),AvoidEps)) sum++;
}
if (sum==maxd)
{
double ds2=getdis(plan[b].Gototar,position(a.pos.x+i,a.pos.y+j));
if (ds2<minds)
{
minds=ds2;
ret=position(a.pos.x+i,a.pos.y+j);
}
}
if (sum<maxd)
{
maxd=sum;
ret=position(a.pos.x+i,a.pos.y+j);
}
}
}
return ret;
}
} //#define Debug
position GetNextStep(node a,int dis=)
{
int type=a.movetype;
if (type==)
{
double ds=getdis(a,a.Gototar);
if (ds<=dis) return a.Gototar;
int dx=a.Gototar.x-a.pos.x;
int dy=a.Gototar.y-a.pos.y;
position ret=position(a.pos.x+dx*(dis/ds),a.pos.y+dy*(dis/ds));
if (getdis(a,ret)>dis) ret.x--;
if (getdis(a,ret)>dis) ret.y--;
return ret;
}
if (type==)
{
double ds=getdis(a,a.Gototar);
if (ds<=dis) return a.Gototar;
int maxd=0x3f3f3f3f;
double minds=12356434543.45;
position ret(,);
for (int i=-dis;i<=dis;++i)
{
for (int j=-dis;j<=dis;++j)
{
if (i*i+j*j>dis*dis) continue;
if (position(a.pos.x+i,a.pos.y+j).outofrange()) continue;
int sum=;
for (node* now=bluel;now;now=now->next)
{
if (inrand(*now,position(a.pos.x+i,a.pos.y+j),AvoidEps))
sum++;
}
if (sum==maxd)
{
double ds2=getdis(a.Gototar,position(a.pos.x+i,a.pos.y+j));
if (ds2<minds)
{
minds=ds2;
ret=position(a.pos.x+i,a.pos.y+j);
}
}
if (sum<maxd)
{
maxd=sum;
ret=position(a.pos.x+i,a.pos.y+j);
}
}
}
return ret;
}
} int RandomShoot(node a,int k=)
{
int ret=-;
double mindis=12334444444.0;
for (node* now=bluel;now;now=now->next)
{
if (inrand(a,*now)&&now->alive)
{
if (k==)
return now->number;
if (k==)
{
double ds=getdis(a,*now);
if (ds<mindis)
{
mindis=ds;
ret=now->number;
}
}
if (k==)
{
if (now->pos.x<mindis)
{
mindis=now->pos.x;
ret=now->number;
}
}
}
}
return ret;
} int sho[];
int ta[];
int nowbunum=;
void Doit()
{
int atnum=,monum=;
//Att Turn
for (node* now=redl;now;now=now->next)
{
if (now->followNum)
{
int k=now->followNum;
if (plan[k].tarnum!=-)
{
int tarnum=plan[k].tarnum;
if (blue[tarnum].alive)
{
now->level++;
atnum++;
sho[atnum]=now->number;
ta[atnum]=tarnum;
blue[tarnum].blood--;
if (blue[tarnum].blood==)
{
blue[tarnum].alive=false;
plan[k].tarnum=-;
}
}
}
else
{
int t=RandomShoot(*now);
if (t!=-)
{
now->level++;
atnum++;
sho[atnum]=now->number;
ta[atnum]=t;
blue[t].blood--;
if (blue[t].blood==) blue[t].alive=false;
}
}
continue;
}
if (now->tarnum!=-)
{
int tarnum=now->tarnum;
if (blue[tarnum].alive)
{
now->level++;
atnum++;
sho[atnum]=now->number;
ta[atnum]=tarnum;
blue[tarnum].blood--;
if (blue[tarnum].blood==) blue[tarnum].alive=false;
}
else
{
int t=RandomShoot(*now);
if (t!=-)
{
now->level++;
atnum++;
sho[atnum]=now->number;
ta[atnum]=t;
blue[t].blood--;
if (blue[t].blood==) blue[t].alive=false;
}
}
}
else
{
int t=RandomShoot(*now);
if (t!=-)
{
now->level++;
atnum++;
sho[atnum]=now->number;
ta[atnum]=t;
blue[t].blood--;
if (blue[t].blood==) blue[t].alive=false;
}
}
//End Att Turn
}
//print
{
printf("%d\n",atnum);
for (int i=;i<=atnum;++i)
{
printf("%d %d\n",sho[i],ta[i]);
}
}
//End print
//MoveTurn
for (node* now=redl;now;now=now->next)
{
if (!now->followNum)
{
if (now->pos.x==now->Gototar.x&&now->pos.y==now->Gototar.y) continue;
monum++;
}
else
{
monum++;
}
}
//End MoveTurn
//Print
printf("%d\n",monum);
for (node* now=redl;now;now=now->next)
{
if (!now->followNum)
{
if (now->pos.x==now->Gototar.x&&now->pos.y==now->Gototar.y) continue;
position p=GetNextStep(*now);
now->pos=p;
printf("%d %d %d\n",now->number,p.x,p.y);
}
else
{
position p=GetNextStep2(*now,now->followNum);
now->pos=p;
printf("%d %d %d\n",now->number,p.x,p.y);
}
}
//End Print
//build
printf("%d\n",nowbunum);
for (int i=;i<=nowbunum;++i)
{
cntred++;
red[cntred].pos=position(,red[cntred].Gototar.y);
redl=Add(&red[cntred],redl);
printf("%d\n",red[cntred].pos.y);
}
nowbunum=;
//End build
} void init()
{
int ns;
scanf("%d",&ns);
for (int i=;i<=ns;++i)
{
int sho,tar;
scanf("%d%d",&sho,&tar);
blue[sho].level++;
red[tar].blood--;
if (red[tar].blood==)
{
red[tar].alive=false;
}
}
int nm;
scanf("%d",&nm);
for (int i=;i<=nm;++i)
{
int mover,xx,yy;
scanf("%d%d%d",&mover,&xx,&yy);
blue[mover].pos=position(xx,yy);
}
int nn;
scanf("%d",&nn);
for (int i=;i<=nn;++i)
{
++cntblue;
int y;
scanf("%d",&y);
blue[cntblue].pos=position(,y);
bluel=Add(&blue[cntblue],bluel);
}
scanf("%d%d%d%d",&ns,&ns,&ns,&ns);
} int _round=-; void AI()
{
++_round;
if (_round%==) nowbunum++;
if (red[].alive&&red[].pos.x==)
{
red[].Gototar=position(,);
}
if (plan[].Gototar.x<=)
plan[].Gototar.x+=;
} void PreMeet()
{
for (int i=;i<;++i)
{
red[i].Gototar=position(,);
red[i].followNum=;
blue[i].number=red[i].number=i;
}
plan[].Gototar=position(,);
red[].Gototar=position(,);
red[].movetype=;
cerr<<"Init Successfully"<<endl;
} int main()
{
#ifdef Debug
freopen("blue.in","r",stdin);
#endif
PreMeet();
while(true)
{
init();
Clean(redl);
Clean(bluel);
cerr<<"Read Successfully"<<endl;
AI();
cerr<<"AI Successfully"<<endl;
Doit();
Clean(redl);
Clean(bluel);
cerr<<"Do Successfully"<<endl;
}
return ;
}

“国家队爷”杯液体战争AI比赛!!__SymenYang的更多相关文章

  1. 沈抚示范区·“华为云杯”2021全国AI大赛圆满落

    摘要:以赛促学,赛教结合!驱动AI产业繁荣发展 本文分享自华为云社区<云聚沈抚 · 智赢未来!沈抚示范区·"华为云杯"2021全国AI大赛圆满落幕>,作者:灰灰哒. 近 ...

  2. 代码审计-四叶草杯线下awd比赛源码web2

    今晚简单来看看那天比赛的源码吧,比赛的时候还是有些慌没有好好去静下心看代码. awd给的题中的漏洞,都是那种可以快速让你利用拿到权限后得到flag的那种,特别复杂利用的一般没有. 建议先黑盒去尝试,例 ...

  3. Java实现 蓝桥杯 算法提高 歌唱比赛(暴力)

    试题 算法提高 歌唱比赛 问题描述 X市正在进行歌唱比赛,请你写一个程序计算得分. 每名选手从1到N编号,每名选手的综合成绩由以下几个部分组成: 1.歌唱得分占70% 2.才艺展示得分占20% 3.观 ...

  4. Java实现 蓝桥杯VIP 算法训练 比赛安排

    问题描述 设有有2 n(n<=6)个球队进行单循环比赛,计划在2 n – 1天内完成,每个队每天进行一场比赛.设计一个比赛的安排,使在2 n – 1天内每个队都与不同的对手比赛. 输入格式 输入 ...

  5. Java实现 蓝桥杯 算法提高 歌唱比赛

    试题 算法提高 歌唱比赛 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 X市正在进行歌唱比赛,请你写一个程序计算得分. 每名选手从1到N编号,每名选手的综合成绩由以下几个部分组成: ...

  6. AI贪吃蛇(二)

    前言 之前写过一篇关于贪吃蛇AI的博客,当时虽然取得了一些成果,但是也存在许多问题,所以最近又花了三天时间重新思考了一下.以下是之前博客存在的一些问题: 策略不对,只要存在找不到尾巴的情况就可能失败, ...

  7. 24分钟让AI跑起飞车类游戏

    本文由云+社区发表 作者:WeTest小编 WeTest 导读 本文主要介绍如何让AI在24分钟内学会玩飞车类游戏.我们使用Distributed PPO训练AI,在短时间内可以取得不错的训练效果. ...

  8. 法律AI数据及应用

    本文简单列举了法律AI目前的应用,数据集,研究方向. 历史 1970年,Buchanan和Headrick发表文章"关于人工智能和法律推理的一些猜测",讨论了对法律研究和推理进行建 ...

  9. AI赌神称霸德扑的秘密,刚刚被《科学》“曝光”了

    AI赌神称霸德扑的秘密,刚刚被<科学>“曝光”了 称霸德州扑克赛场的赌神Libratus,是今年最瞩目的AI明星之一. 刚刚,<科学>最新发布的预印版论文,详细解读了AI赌神背 ...

随机推荐

  1. LINUX-挂载一个文件系统

    mount /dev/hda2 /mnt/hda2 挂载一个叫做hda2的盘 - 确定目录 '/ mnt/hda2' 已经存在 umount /dev/hda2 卸载一个叫做hda2的盘 - 先从挂载 ...

  2. photon Unity RPC 调用流程

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/51425225 作者:car ...

  3. 最小生成树 I - Agri-Net

    Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet c ...

  4. 最小生成树 C - Building a Space Station

    You are a member of the space station engineering team, and are assigned a task in the construction ...

  5. Ubuntu 16.04在启动和关机时不显示启动和关机画面且显示详细的命令信息,没有进度条和Logo,或者只有紫色界面,或者没有开机画面等问题解决

    主要有以下解决方法: 1.如果之前配置过Grub来显示详细的命令信息的,那么改回去就行了,参考:http://www.cnblogs.com/EasonJim/p/7129873.html,通过这种方 ...

  6. 27、Java并发性和多线程-CAS(比较和替换)

    以下内容转自http://ifeve.com/compare-and-swap/: CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期 ...

  7. PHP与WCF第一次亲密接触

    接触PHP第二天,要求PHP访问WCF服务 着实痛苦,无从下手啊. 在网上查了很多资料知道PHP访问WCF很方便 <?php $client = new SoapClient ( 'http:/ ...

  8. 安卓下载文件怎样更新UI进度

    曾经写过几篇关于下载的文章.总的来说是下面几点: 1.维护一个下载进程的Hashmap,key:使用Md5进行处理后的文件下载地址,value为下载的Task. 以防止下载反复.并将信息保存至数据库. ...

  9. oracle 创建暂时表

    提交事务后会自己主动清空,不同的事务之间数据隔离 create global temporary table GLS_REPORT_EXPR (   EXPRNO VARCHAR2(30) not n ...

  10. SpringBoot在Impl类中调用其它service层失败解决办法

    在AImpl.java文件中引用BImpl.java的方法,编译正常,运行到调用的地方,报空指针异常,跟踪到异常位置,发现service为空,也就是按照之前controller层通过@Autowire ...