Generals
#2这是一道交互题。
题目背景
在某颗不知名行星的海岛上,小 A 与他的机器人们正在偷偷发起一场战争,试图打败其他敌人,成为这场战争的胜利者。
题目描述
输入输出格式
你的程序通过标准输入输出与交互库进行通信。
输入格式
输入由若干段组成。
每段的第一行,一个字符串 type ,表示输入的事件类型。 接下来若干行是该事件的附加信息,具体见下文。
请仔细阅读输入格式并完成所有事件的读入。
事件有如下几种:
-
connect:连接建立,小 A 可以准备战斗了。没有附加信息。 -
disconnect:连接中断。没有附加信息。在读入该事件后请立即结束程序运行。
-
game_start:战争开始了!接下来一行,一个非负整数
playerIndex,表示小 A 的编号。接下来一行,一个字符串
replay_id,表示你可以在战争结束后于http://bot.generals.io/replays/<replay_id>处看到回放。接下来一行,一个字符串
chat_room,表示公共聊天室标识符。如果是团队模式,接下来一行,一个字符串
chat_room,表示本阵营聊天室标识符。接下来一行,一个正整数
player_count,表示玩家总数。接下来一行,
player_count个字符串,第 i 个字符串表示编号为 i 的玩家的用户名。用户名有可能包含空白字符!接下来一行,
player_count个非负整数,第 i 个整数表示编号为 i 的玩家所处的阵营编号。 -
game_update:战场发生了变化,小 A 需要作出新的决策。接下来一行,一个非负整数
turn,表示当前的轮数(2轮=1回合,空地每50轮生产一个兵)。接下来一行,两个正整数
height和width,分别表示战场的高度和宽度。接下来
height行,每行width个非负整数,表示对应位置的兵力数。接下来
height行,每行width个整数,表示对应位置的占领情况。-
非负整数:该位置被编号为该值的玩家占领。
-
-1:该位置无人占领。 -
-2:该位置是不可占领的山脉。 -
-3:该位置位于战争迷雾中,没有障碍。 -
-4:该位置位于战争迷雾中,可以探测到障碍。
接下来一行,一个非负整数
city_count,表示视野中的城市个数。接下来
city_count行,每行两个非负整数x和y,表示该城市位于第x行第y列。接下来
player_count行,对于其中的第 i 行,有两个非负整数x和y,表示该王城位于第x行第y列。如果编号为 i 的玩家的王城处于战争迷雾中,x=y=-1。接下来
player_count行,第 i 行有三个个非负整数playerIndex、total和tiles,分别表示排名为 i 的玩家的编号、总兵力和领土面积。如果该玩家已被淘汰,total=tiles=0。 -
-
game_lost:小 A 的王城被攻占。接下来一行,一个字符串
killer,表示攻占者的编号。 -
game_won:小 A 获得了胜利!没有附加信息。
输出格式
你输出的每一行表示你的一个操作。
对于每一行,输出一个字符串和若干参数(格式中最后一个参数可含空格),以单个空格分隔,表示你的操作。
输出参数的个数和顺序都必须和格式完全一致。
-
set_username:设置玩家名。参数:
-
user_id:玩家 ID。 -
user_name:你要设置的玩家名。玩家名必须以[Bot]开头。
-
-
play:进入 FFA 模式。参数:
user_id:玩家 ID。
-
join_1v1:进入 1v1 模式。参数:
user_id:玩家 ID。
-
join_private:进入自定义模式。参数:
-
custom_game_id:房间 ID。 -
user_id:玩家 ID。
-
-
set_force_start:设置强制开始倾向。参数:
-
queue_id:队列 ID(不知道怎么用)。 -
doForce:是否选择强制开始。true表示是,false表示否。
-
-
attack:在计划末尾新增一次移动兵力。参数:
-
startX:起始位置的行号。 -
startY:起始位置的列号。 -
endX:终止位置的行号。 -
endY:终止位置的列号。 -
is50:是否只使用一半兵力移动。true表示是,false表示否。
-
-
clear_moves:清空计划队列。没有参数。 -
leave_game:离开战场。没有参数。在获得胜利或王城被攻破后,请进行该操作以正常离开战场。
可以在战争结束之前、小 A 仍存活时离开战场。若这么做,该战场上的小 A 所属军队、王城和塔如同小 A 未离开但不操作般工作(即使在此后小 A 断开连接)直至小 A 获胜或失败,不会变为中立。
在离开战场之后,小 A 仍能收到
game_lost或game_won事件。(正常情况下小 A 应该先收到它,然后离开。) -
chat_message:发送聊天信息。参数:
-
chat_room:聊天室标识符。 -
text:要发送的文本。
-
-
quit:退出程序。没有参数。在程序退出之前请进行
quit操作以终止交互库运行! -
#:注释。参数:
comment:注释内容。
注释会被输出到
io.log中。
在操作输出完毕后,必须在最后一行行末换行并使用fflush(stdout)刷新输出缓冲区!
输入输出样例
< set_username 123456aaa [Bot] Xiao_A_AI
< play
< set_force_start ffa true
> game_start
> 0
> aa2333aa
> Game_chatroom_6666
> 2
> [Bot] Xiao_A_AI
> [Bot] LMcpptest
> 1 2
> game_lost
> 1
< leave_game
< quit
其中以<开头的行是小 A 的输出,以>开头的行是输入。
测试代码
-
安装 node.js;
-
npm install --save socket.io-client; -
把你的 C++ 文件命名为
gen.cpp,与前两个文件置于同一目录下; -
在该目录下运行
node main.js,开始测试代码。
你可以下载示例程序以了解更多细节。