游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6254|回复: 16

请教西瓜棋判断死棋算法!!

[复制链接]

2

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
发表于 2004-11-24 18:07:00 | 显示全部楼层 |阅读模式
如图所示,1号棋和2号棋不算死棋,在程序里怎么判断呢?

给点思路也行啊!谢谢各位大虾了!
sf_2004112418728.jpg

30

主题

398

帖子

403

积分

中级会员

Rank: 3Rank: 3

积分
403
QQ
发表于 2004-11-24 18:15:00 | 显示全部楼层

Re:请教西瓜棋判断死棋算法!!

不能移动不就是死了吗?

2

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
 楼主| 发表于 2004-11-25 09:21:00 | 显示全部楼层

Re:请教西瓜棋判断死棋算法!!

但是图上还有一步可以走啊

要是就这样把棋消掉就简单多了

30

主题

398

帖子

403

积分

中级会员

Rank: 3Rank: 3

积分
403
QQ
发表于 2004-11-25 10:56:00 | 显示全部楼层

Re:请教西瓜棋判断死棋算法!!

例如棋2,如果向下移动的话..那么原先棋2左方的黑棋就会移到棋2原理的位置.那么棋1,棋2都会变成死棋.因为现在棋1,棋2都不能移动.

但是现在棋2不移动,因为它有一个位置可以移动,所以不是死棋,而棋1虽然不能移动,但是它旁边有棋2(己方的棋),那么它也不是死棋..

但是,棋2下方的黑棋如果向上移动的话,那么棋1,棋2都变成了死棋.虽然棋1,棋2都有己方的棋在旁边,但是它们除了己方的位置都没有移动的空间了.所以是死棋.

总之,不能移动就是死棋.

2

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
 楼主| 发表于 2004-11-25 11:41:00 | 显示全部楼层

Re:请教西瓜棋判断死棋算法!!

你说的规则跟我想的一样,不过就是不知道用程序怎么判断。

想用迷宫算法吧,不知道怎么确定目的地。

总不能无限循环,只要能走到空位上就算活棋吧?

我试过,实现不了。

11

主题

102

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2004-11-25 11:53:00 | 显示全部楼层

Re:请教西瓜棋判断死棋算法!!

比照"???quot;的算法呢?
?有"??quot;的
就是?活者
(本回合?算中, 1算死的, 2算活的...所以玩家在本回合中, 可移??, 但不可移??)

2

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
 楼主| 发表于 2004-11-25 12:16:00 | 显示全部楼层

Re:请教西瓜棋判断死棋算法!!

是啊,我就是想问类似的算法,不过我不会下围棋啊

麻烦大侠给我讲讲气在程序里是怎么判断的?

11

主题

102

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2004-11-25 13:57:00 | 显示全部楼层

Re:请教西瓜棋判断死棋算法!!

你要的原理大概??影

全部有21??放棋子的位置
所以用1~21代表位置(0代表不存在)

每??位置上, 相?的位置有3或4??
所以

A.用1???度??1的?列, ??每一??位置相?的位置有???, 也就是?位置最大可?碛械?quot;??quot;的上限

B.用一??21*4的2??列??位置的相???S
例如
1旁?有 2,3,4 ?t {2,3,4,0}
4旁?有 1,2,3,6 ?t {1,2,3,6}


C.用1???度??1的1??列, ???位置上放哪一?棋子(例: 0 空的, 1白色, 2黑色)

D.以1???度??1的一??列, ??每一??位置用掉的"??quot;(?算前, 初值皆??)

E.用1???度??1的1??列, ???位子上的棋子是否?能移?

然後2?巢式?圈(21*4)以B?榛?? 根??是否有棋子, 依序??加1
最後比?D?A, 把比??果??在E
E就是你要的答案

或是 A-D = ?位置上可移?拥叫碌奈恢玫姆较?盗
(如果?? 代表不可移?? 如果??代表旁?只有一??空?, ??硬僮?r就可以把直接?棋子?他直接?去, 而不必再?目的位置的功能加?去了)

11

主题

102

帖子

102

积分

注册会员

Rank: 2

积分
102
发表于 2004-11-25 14:57:00 | 显示全部楼层

Re:请教西瓜棋判断死棋算法!!

//每??位置, ?獾纳舷
char A[21] = {3, ..., 4,...};

//每??位置相?的位置
char B[21][4] = {
  {2,3,4,0},
.....
  {1,2,3,6},
....
};

//?入是否有棋子用
char C[21];

//??每一??位置用掉的"??quot;(?算前, 初值皆??)
char D[21];
ZeroMemory((void*)D, sizeof(D));

//???位子上的棋子是否?能移?
bool E[21];

//然後2?巢式?圈(21*4)以B?榛?? 根??是否有棋子, 依序??加1
for (int i=0; i<21; i++)
{
    if (C != 0)
    {
       for (int j=0; j<4; j++)
       {
           if (B[j] != 0)
           {
               D[ B[j] - 1 ]++;
           }
       }
   }
}

//最後比?D?A, 把比??果??在E
for (int i=0; i<21; i++)
{
    if (D == A)
       E = true;  //不能移?
    else
       E = false;  //可以移?
}

2

主题

43

帖子

43

积分

注册会员

Rank: 2

积分
43
 楼主| 发表于 2004-11-25 15:17:00 | 显示全部楼层

Re:请教西瓜棋判断死棋算法!!

21*4的二维数组不错,我用的是21*21的邻接数组,比较笨了,不过已经做到最后了,就差这一步判断了,要改的话比较费事。

我的算法具体是这样,

21*21的数组记录棋盘上棋子的相邻位置。

另外设计一个棋子类记录棋子各种属性,坐标啦,所在棋位啦,棋子状态等。

判断棋子死活我最初用的是迷宫算法,把棋盘分成四个象限,第一象限棋子

寻找第三象限出路,这种算法对付完全没有气的棋子很好用,不过如果几个

棋子连在一起还有气就判断不了了。

我现在的思路是:

把迷宫算法算出要删除(不是真正要删除,还要加以判断)的棋子记录下来,

再看这些棋子是否有气,有气则递归看该棋子相邻同色棋子是否有气。

如图,如果棋子2有气,则通过邻接数组找到棋子1,看棋子1是否有气。

但是失败,555555555。

以下是出错的递归算法,麻烦看看。

void CWatermelonChessDlg::IsLive(int point)
{
        //判断?棋子四周是否有空位,是?t将删除?号去掉
        for(int i=0;i<21;i++)
        {
                if(map[point]&&-1==pointSetTemp)
                {
                        pointSetDel[point]=0;
                        pointSetTemp[point]=-1;

                        //再搜索相?的同色棋子
                        for(int j=0;j<21;j++)
                        {
                                if(map[point][j]&&chess[pointSetTemp[point]].GetState()==chess[pointSetTemp[j]].GetState())
                                {
                                        IsLive(j);
                                }
                        }
                        break;
                }
        }
}

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-23 10:31

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表