| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3186 人关注过本帖, 1 人收藏
标题:煮酒论英雄 三巡 井字棋对战平台测试版发布
只看楼主 加入收藏
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:8 
回复 18楼 beyondyf
我想你要求的是写一个对战平台,像QQ游戏大厅那样的平台,游戏只有一个(井字棋),双方可以写自己的算法程序在这个平台上运行,比如一个人的程序中走了这一步,另一个人的程序做出对应的动作走一步认为对自己有利的那一步,直到有一方胜利或平局结束。

[ 本帖最后由 小赵q1 于 2012-6-26 15:35 编辑 ]
2012-06-26 15:31
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:0 
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

//用循环遍历行/列/斜
int checkH(int pos, char* c, char ch) //如果存在toWin的情况,返回剩余位置i,否则返回9让程序选择随机空白位置
{
    int getASpace = 0; //找到了一个空白位
    int getAFriend = 0;
    int count,spacePos=9;
    int oldH;
    for (count = 0; count!=2 ;count++ )
    {
        oldH = pos/3; //保存旧行数
        pos++;
        if (pos/3>oldH)
        {
            pos-=3;
        }
        if (c[pos]==' ')
            getASpace = 1, spacePos = pos;
        else if (c[pos]==ch)
            getAFriend = 1;
    }
    if(getAFriend && getASpace)
        return spacePos;
    else
        return 9;
}

int checkV(int pos, char* c,char ch)
{
    int getASpace = 0;
    int getAFriend = 0;
    int count=0,spacePos=9;
    for (; count!=2 ;count++ )
    {
        pos+=3;
        if (pos/3==3)
        {
            pos-=9;
        }
        if (c[pos]==' ')
            getASpace = 1, spacePos = pos;
        else if (c[pos]==ch)
            getAFriend = 1;
    }
    if(getAFriend && getASpace)
        return spacePos;
    else
        return 9;
}

int checkX(int pos, char* c, char ch) //如果i在对角线上,需checkX() if (0==i%2),则checkX
{
    int getASpace = 0;
    int getAFriend = 0;
    int count,spacePos=9;
    if (pos%4) //check for pos 0,4,8
    {
        for (count = 0; count != 2 ; count++)
        {
            pos+=4;
            if (pos == 12)
            {
                pos-=12;
            }
            if (c[pos]==' ')
                getASpace = 1, spacePos = pos;
            else if (c[pos]==ch)
                getAFriend = 1;
        }
    }
    else
    {
        for (count = 0; count != 2 ; count++)
        {
            pos+=2;
            if (pos == 8)
            {
                pos-=6;
            }
            if (c[pos]==' ')
                getASpace = 1, spacePos = pos;
            else if (c[pos]==ch)
                getAFriend = 1;
        }
    }
    if(getAFriend && getASpace)
        return spacePos;
    else
        return 9;
}

int main()
{
    char c[16];
    int i,pos;
    printf("Beyond.Game.Tic-tac-toe.1.0\n");    //输出游戏标识
    printf("My Test Bot 02\n");                  //输出BOT名字
    fflush(NULL);                               //记得每次输出后清空缓冲区,否则平台可能因为不能及时接受输出信息而判超时
    gets(c);                                    //获取自身棋子
    srand((unsigned int)time(NULL));
    char enemy = c[0];
//    char me = (enemy=='X')?'O':'X';
    for(;gets(c);)
    {
        for (i=0; i!=9;i++ ) //用遍历判断局势
        {
            if (c[i]!=enemy) //没找到敌方棋子则继续
                continue;
            // 找到敌方棋子了,开始判局
            if (0==i%2) //对角线上的数字,需判断斜行
            {
                if ((pos=checkH(i,c,enemy))!= 9)
                    printf("%d\n",pos);
                else if ((pos=checkV(i,c,enemy))!= 9)
                    printf("%d\n",pos);
                else if ((pos=checkX(i,c,enemy))!= 9)
                    printf("%d\n",pos);
            }
            else
            {
                if ((pos=checkH(i,c,enemy))!= 9)
                    printf("%d\n",pos);
                else if ((pos=checkV(i,c,enemy))!= 9)
                    printf("%d\n",pos);
            }
            fflush(0);
        }
        if (i==9)
        {
            while(c[i = rand() % 9] != ' ');        //判断所选位是否为空
            printf("%d\n",i);                        //输出你的行棋位置
            fflush(0);
        }
    }
    return 0;
}
0 1 2
3 4 5
6 7 8
以上程序是个半成品,在程序交互上有点问题,没心做了。谈不上什么算法,我的算法真的很烂,哈哈。思想人人都有,但放到代码上去实现真需要功夫。
谈一下我的想法:
当轮到我方出子的时候先判局,遍历局中所有敌方棋子。当找到一个enemy的时候,通过其位置调用子函数判别:如果一行、列、斜出现两个敌方棋子+一个空位的情况则视为toWin,危险。此时由子函数返回该空位的pos,作为本回合我方下子的位置。如果不存在toWin的情况,则随机找一个空位下子。
存在的问题:
1.遍历棋子的时候存在重复判断的情况
2.如果放在五子棋的游戏中,三三禁手的情况是如何判断的?
3.遵从b版的指导思想:如何不让自己输。那么,不让自己输的前提满足之后,就可以考虑将红色部分替换为尽可能让自己赢。但是,这里的下子都只能考虑到单步,放到围棋、象棋的AI上,是通过递归实现赢的目标吗?

patch:修改了一下,可以正常比赛了。但还是随机下子,无法判局。。回去继续研究研究

[ 本帖最后由 lonmaor 于 2012-6-26 17:13 编辑 ]

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-06-26 15:52
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
Devil_W
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:9
帖 子:1160
专家分:1797
注 册:2009-9-14
收藏
得分:8 
简单的min-max 或者alpha-beta剪枝就可以了。
2012-06-27 10:05
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 25楼 Devil_W
什么棋会引起你的兴趣写段AI参赛程序呢?

重剑无锋,大巧不工
2012-06-27 10:37
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:8 
以下是引用Devil_W在2012-6-27 10:05:34的发言:

简单的min-max 或者alpha-beta剪枝就可以了。
大神你来了,我崇拜你很久了

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-06-27 14:26
w909313104
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2012-6-29
收藏
得分:0 
?不懂
2012-06-29 11:43
yuma
Rank: 12Rank: 12Rank: 12
来 自:银河系
等 级:贵宾
威 望:37
帖 子:1934
专家分:3012
注 册:2009-12-22
收藏
得分:0 
楼主你这是什么程序,运行就发生程序错误。就是最顶楼的那个附件。

图片附件: 游客没有浏览图片的权限,请 登录注册

心生万象,万象皆程序!
本人计算机知识网:http://bbs.为防伸手党,本站已停止会员注册。
2012-06-30 09:57
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
回复 29楼 yuma
你没装.net framework。

重剑无锋,大巧不工
2012-07-02 08:57
快速回复:煮酒论英雄 三巡 井字棋对战平台测试版发布
数据加载中...
 
   



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

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