煮酒论英雄 三巡 井字棋对战平台测试版发布
TTT.rar
(9.53 KB)
昨天才放假休息,为了赶上今天发布,昨天一个下午都在做这个平台。时间仓促、水平有限,做的有点粗糙,还请各位见谅。话说兄弟在界面设计上确实没什么天赋,这一点否认是没用的。所以各位对用户体验这块有什么好的意见和建议请提出来。
对这个项目感兴趣的朋友欢迎合作。这只是个开始,最近开始学围棋(没打算战胜李昌镐,只想了解一下围棋的机理),将来来了兴致可以做做围棋的人工智能。
规则是完全按照二巡中的方案写的。唯一的改动之处是缩短了每步的思考时间,改为2秒一步。
这里再重发一遍规则吧
井字棋对战规则
1 比赛的所有数据输入输出以行为单位。
2 比赛进程启动后第一步:输出比赛类型(字符串),用于平台判断是否为正确的参赛程序。
2.1 井字棋的比赛类型为:"Beyond.Game.Tic-tac-toe.1.0"。
2.2 如比赛类型与当前比赛平台不匹配,平台将不予开赛。
2.3 输出示例:printf("Beyond.Game.Tic-tac-toe.1.0\n");
3 比赛进程启动后第二步:输出选手名称,用于平台显示参赛选手名号。
3.1 之所以由程序主动输出,而不以程序名为选手名称,是为防止有人盗用别人的比赛程序改名后当作自己的原创作品。
3.2 输出示例:printf("任何你喜欢的名字\n");
4 比赛进程启动后第三步:接收平台发送的执棋类型。
4.1 执棋类型包含一个字符‘X’或‘O’(大写),后跟一个换行符(换行符作为数据分隔符,在接受数据时请注意)。
4.2 所接受到的字符即为平台分配给进程所执的棋子类型。如接受到‘X’,则在之后所接受到的棋局数据中的‘X’即为已方棋子‘O’为对方棋子。
5 比赛开始。
5.1 接收平台发送的当前盘面局势。
5.2 局势数据为一字符串,后跟一换行符(再次提醒,换行符为数据分隔符,并非有效数据)。
字符串长度为9个字符,包括三个字符:‘X’、‘O’、‘ ’(空格)。
‘X’表示X棋
‘O’表示O棋
‘ ’表示空位
5.3 9个字符对应棋盘的9个位置的状态。字符顺序对应棋盘从左到右从上到下的9个位置。
如“XOX 0X ”(注意其中的空格)表示当前的棋盘状态为:
X|O|X
-+-+-
|O|X
-+-+-
| |
5.4 接收示例:
char a[10];
gets(a);//建议使用gets函数接收数据
5.6 当成功接受局势状态后,运行你的算法输出行棋位置。
输出为一个数值后跟换行符,代表要行棋的坐标。坐标为一维坐标,范围0-8。
坐标与棋盘位置的对应关系如下:
0|1|2
-+-+-
3|4|5
-+-+-
6|7|8
5.7 输出示例:printf("%d\n", coordinate);
5.8 输出后即可进入下一轮局势数据接受的等待中。
6 平台轮流向参赛进程发送当前比赛局势,直到比赛结束。
6.1 比赛结果将显示在平台界面中,不向比赛进程返回。
6.2 比赛结束后,比赛进程也可以自行退出,如未自行退出平台将强制关闭。
7 比赛中平台将自动判断比赛状态。
7.1 如果某一方在横、竖、斜中的一个方向上三子连成一线,判这一方获胜。
7.2 如果棋盘已经下满,判平局
7.3 如果某一方行棋在已经有子的地方或下到棋盘外(非0-8之间的数值),该方立即判负,比赛结束。
7.4 对参赛进程使用的内存空间限制为64M(对于这个游戏足够了)。如果某一方比赛中某一时刻使用的内存超限,该方立即判负,比赛结束。
7.5 对参赛进程每次行棋“思考”时间限制为2秒。如果某一方超时,该方立即判负,比赛结束。
平台是用C#在.net 4.0框架下写的,请注意自己的系统支持情况。
最后再附送三个参赛程序示例。不是智能版,只为让大家理解参赛程序的写法。
程序代码:
//////////////////////////////////////////// // //该程序只为演示参赛程序的基本规则 //程序的行棋策略为无视棋盘局势,按顺序行棋 //基本上会因为行棋错误被平台判负 // //////////////////////////////////////////// #include<stdio.h> int main() { int i; char c[16]; printf("Beyond.Game.Tic-tac-toe.1.0\n"); //输出游戏标识 printf("TEST BOT NO.1\n"); //输出BOT名字 fflush(NULL); //记得每次输出后清空缓冲区,否则平台可能因为不能及时接受输出信息而判超时 gets(c); //获取自身棋子 for(i = 0; i < 9; i++) { gets(c); //获取当前棋盘局势 printf("%d\n", i); //输出你的行棋位置 fflush(NULL); //再次提醒,每次输出后及时清空缓冲区 } return 0; }
程序代码:
//////////////////////////////////////////// // //该程序只为演示参赛程序的基本规则 //程序的行棋策略为无视棋盘局势,随机行棋 //基本上会因为行棋错误被平台判负 // //////////////////////////////////////////// #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { char c[16]; printf("Beyond.Game.Tic-tac-toe.1.0\n"); //输出游戏标识 printf("TEST BOT NO.2\n"); //输出BOT名字 fflush(NULL); //记得每次输出后清空缓冲区,否则平台可能因为不能及时接受输出信息而判超时 gets(c); //获取自身棋子 srand(time(NULL)); for(;;) { gets(c); //获取当前棋盘局势 printf("%d\n", rand() % 9); //输出你的行棋位置 fflush(NULL); //再次提醒,每次输出后及时清空缓冲区 } return 0; }
程序代码:
//////////////////////////////////////////// // //该程序只为演示参赛程序的基本规则 //程序的行棋策略为在棋盘空位随机行棋 // //////////////////////////////////////////// #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { char c[16]; int i; printf("Beyond.Game.Tic-tac-toe.1.0\n"); //输出游戏标识 printf("TEST BOT NO.3\n"); //输出BOT名字 fflush(NULL); //记得每次输出后清空缓冲区,否则平台可能因为不能及时接受输出信息而判超时 gets(c); //获取自身棋子 srand(time(NULL)); for(;gets(c);) { while(c[i = rand() % 9] != ' '); //判断所选位是否为空 printf("%d\n", i); //输出你的行棋位置 fflush(NULL); //再次提醒,每次输出后及时清空缓冲区 } return 0; }最后祝各位端午快乐!