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
,开始测试代码。
你可以下载示例程序以了解更多细节。