diff --git a/README.md b/README.md new file mode 100644 index 0000000..e2fe7de --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +# 4Conq + +## 游戏规则 + +这个游戏在一个 $n$ 行 $n$ 列的棋盘上进行(其中 $n$ 为奇数),棋盘的每个格子上有一个 $0$ 到 $n-1$ 之间的整数,使得每种数恰好出现 $n$ 次。 + +我们称一个格子上的数是可删的,当且仅当: + +- 这个格子上的数还没有被删除过; +- 这个格子在边界上,或者与至少一个已经删除过的格子相邻。 + +双方轮流行动,每个人每步删除一个可删的格子上的数。如果一个人删除了某一种数超过一半($\lceil n/2\rceil$),那么称这个人占领了这种数。如果一个人占领的数的种数多于一半($\lceil n/2\rceil$),则此人赢得游戏。 + +特别的,当一个人占领了某一种数时,立即从棋盘上移除这种数的全部格子。 + +## 实现细节 + +棋盘的编号从 $0$ 开始,位置 $(x,y)$ 表示棋盘的第 $x$ 行第 $y$ 列。 + +在 `Strategy` 目录下,你需要实现两个函数: + +- `initStrategy(int n, const vector> &B)`:初始化,传入棋盘大小 $n$ 和棋盘上各个格子的值 $B$。 +- `getMove(int lstX, int lstY)`:获取走棋,传入对手上一步走棋的位置,返回一个 `std::tuple` 表示你希望走的位置(特别的,如果你的程序先手,且处于第一回合时,`lstX` 和 `lstY` 传入 `-1`)。 + +## 交互测试 + +编译裁判程序,在 `Compete` 目录下,使用命令 + +```sh +g++ *.cpp -Wall -O2 -o Compete +``` + +运行裁判程序 `./Compete`,运行后会监听 3030 端口,等待选手程序连接。使用下面命令编译选手程序, + +```sh +g++ *.cpp -Wall -O2 -o Stragegy +``` + +运行选手程序,会自动连接到裁判程序,当两个选手均连接后,裁判会自动开始游戏,并记录对局到 `log.txt`。 +