标题:煮酒论英雄 三巡 井字棋对战平台测试版发布
取消只看楼主
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
结帖率:100%
已结贴  问题点数:100 回复次数:12 
煮酒论英雄 三巡 井字棋对战平台测试版发布
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;
}
最后祝各位端午快乐!
搜索更多相关主题的帖子: 人工智能 对战平台 李昌镐 
2012-06-23 10:11
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
呵呵同乐,记得粽子不要吃太多,糯米不是很好消化。

重剑无锋,大巧不工
2012-06-23 11:09
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
有人玩过了么?平台中难免会有缺陷,哪位有什么发现请反馈给我,我及时修正。

重剑无锋,大巧不工
2012-06-23 21:06
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
回复 9楼 zd1505675319
兴趣到哪,就搞哪方面

重剑无锋,大巧不工
2012-06-24 07:51
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
回复 11楼 cuijunchao
这个游戏X是先手,O是后手。至于两个程序(同一个程序也可以作为两个进程对弈),谁先谁后由你载入决定,让谁载入到X谁就是先手。

而这个游戏,只要有一定的智力,结局都是平局。实际中这个游戏基本是给学龄前儿童玩的。

我选择做这个游戏平台的目的是为了试验进程调度及通信控制。是个试验品。为过段时间做五子棋、象棋、围棋,或其它这类AI对抗进行一些经验积累。

推出给各位,是想给朋友们一个练习AI的基础平台。只要大家感兴趣,我们可以一起开发其它AI对抗平台。甚至可以考虑做一个AI对抗引擎。

这比写什么XX信息管理系统好玩吧

重剑无锋,大巧不工
2012-06-24 20:14
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
呵呵,先手不是必赢的。先手下在中间,后手应在边上是必败的,应在角上是平局。

其实这个游戏考虑更多的不是如何让自己赢,而是如何不让自己输。

这游戏的规模很小,人来思考不是问题。我希望的是大家练习着把自己的思考方式转化成代码。

看非诚勿扰去了

重剑无锋,大巧不工
2012-06-24 21:11
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
小赵,我想了解一下你对我写的这个东西的看法?你觉得这个东西是干什么用的?

呵呵,我想看看大家是否正确接受到了我想传达的信息没。

重剑无锋,大巧不工
2012-06-26 07:41
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
换个问法。有谁玩过这个东西了?有谁写了自己的参赛程序玩过了?

重剑无锋,大巧不工
2012-06-26 15:19
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
回复 21楼 小赵q1
不是要求。平台我已经写好了。你只需要按协议写好你的参赛程序,编译好,加载到平台就可以比赛了。

想玩象棋不是问题。只要各位能写参赛程序,平台由我提供。

重剑无锋,大巧不工
2012-06-26 16:09
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
回复 22楼 lonmaor
呵呵,很高兴看到了朋友的参赛程序。感谢将源代码也发了上来,其实平台并不要求源代码,甚至不要求一定要用C来写。

理论上通过递归任何棋都可以实现赢的目标(或知道自己最终的结果),但由于大部分棋类的状态空间极大,单纯靠递归深度遍历是不现实的。所以只能通过其它策略来做个一定范围内的预测。如果真能遍历完所有的结果,那这棋也就没什么下头了。这个井字棋就可以遍历完所有的状态,我做这个游戏的意义并不在下棋的结果,而在于练习AI的编写。

关于五子棋的禁手。禁手是针对黑棋的。在黑棋行棋后在着棋位置判断是否存在多个方向的活三,如果存在,判断白棋是否可必败。这需要做两步深度的遍历,范围即在已成的三三周围,规模也很小,并不耗费很多的时间。

重剑无锋,大巧不工
2012-06-26 16:29



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-372099-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.379855 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved