中国象棋如何判断将死

喝口水 2009-11-08 12:15:05
现来无事,做了个中国象棋游戏,大部分工作已经完成,现在到了如何判断把对方将死这一步了,没有头绪,欢迎给点指导
...全文
1192 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
喝口水 2009-11-13
  • 打赏
  • 举报
回复
谢谢诸位,将死的算法搞定了,结贴
zjh3269 2009-11-12
  • 打赏
  • 举报
回复
牛人, mark
delphizoom 2009-11-11
  • 打赏
  • 举报
回复
将死的情况:
A,对方将军,你的帅不能动(动了以后也受将军),且你不能吃也不能挡对方的子。
注意:需要加上,走子时造成对自己将军的情况则不允许。
xiaoxiao_8 2009-11-11
  • 打赏
  • 举报
回复
如果要考虑人机对战,就要考虑每个子是否被攻击、是否能被对方吃掉,将只是其中的一个而已,
当这个子是将,就是被将。是车,就是捉车……
dqlihb 2009-11-11
  • 打赏
  • 举报
回复
或者部分执行
dqlihb 2009-11-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hys_427 的回复:]
这个我初步的想法是这样的:
1.当对方将时判断是否将死
2.判断将死的标准,首先是看是否有子能把将的棋子吃掉,如果能吃掉,则说明将不死了,否则往下判断
3.如果不能吃掉,则判断是否能够挡住将,即在将子和老将之间填一个子,当然这要判断马的情况,因为马是走日字的
4.如果不能挡或者挡住了,还有其它子将,则说明老将必须走了
5.判断老将要走的位置上是否有其它子在等着吃,如果有则不能走
6.如果所有路口都不能走了,说明被将死了

不知我的说法有啥不足的地方,欢迎补充

[/Quote]
如果有移动棋子的情况,上面的6条需要在移动子后,再执行1次才可以的
hemiya 2009-11-09
  • 打赏
  • 举报
回复
本人超级佩服做棋牌类游戏并有人机对战功能的游戏软件,特别是棋类需要考虑的太复杂了.

个人思路:
1,判断老将上下左右移动一步(己方不能移动,敌方能移动),是不是能躲开本次"将".
2,如果能躲开移动到下一步时是不是还被"将",是不是能躲开本次"将".光杆司令或者己方其它棋子不能移动直接死棋.
3,如果还被"将",就要考虑能不能垫子(别马脚也算),或者吃掉对方,能躲开本次"将".
4,死棋!

循环将:
我记得国家象棋比赛是由这方面的规则的,循环将一定步数算输,应该能搜索到.
huoxin8226 2009-11-09
  • 打赏
  • 举报
回复
我觉得直接判断下一步比较方便,把将在对方供给范围内的结果设置一个很大的或者很小的值。
然后进行遍历,如果发现无论下一步怎么走,结果都是大值,那么必然被将死。
iceagebirdxq 2009-11-09
  • 打赏
  • 举报
回复
学习
yct0605 2009-11-09
  • 打赏
  • 举报
回复
学习了
wxsan 2009-11-09
  • 打赏
  • 举报
回复
有意思
喝口水 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 huoxin8226 的回复:]
我觉得直接判断下一步比较方便,把将在对方供给范围内的结果设置一个很大的或者很小的值。
然后进行遍历,如果发现无论下一步怎么走,结果都是大值,那么必然被将死。
[/Quote]

啥意思?说清楚点
喝口水 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 mwy654321 的回复:]
引用 15 楼 hys_427 的回复:
这个我初步的想法是这样的:
1.当对方将时判断是否将死
2.判断将死的标准,首先是看是否有子能把将的棋子吃掉,如果能吃掉,则说明将不死了,否则往下判断
3.如果不能吃掉,则判断是否能够挡住将,即在将子和老将之间填一个子,当然这要判断马的情况,因为马是走日字的
4.如果不能挡或者挡住了,还有其它子将,则说明老将必须走了
5.判断老将要走的位置上是否有其它子在等着吃,如果有则不能走
6.如果所有路口都不能走了,说明被将死了

不知我的说法有啥不足的地方,欢迎补充


你的第一步就搞错了!

你说在“当对方将时判断是否将死”,这是不妥的。不能在对方将时才判断。比如:我主动把“帅”送给对方吃,你岂不是判断不出来?而主动送“帅”给对方的走法也是不允许的!

另外,其实你的问题很简单,没有必要那么复杂。你用的啥控件?没想到还有控件!学习下哈!
[/Quote]
我是做了"不能送将"判断的,所以不会出现主动把"帅"送给对方吃的情况
我的初步想法是,只要不能迎将,即为将死
ok1411 2009-11-09
  • 打赏
  • 举报
回复
仅仅判断是否已经将死了应该还是简单的;
1、当前是否有 棋子 能吃到 将;
2、遍历所有可动的棋子,遍历每个棋子能走的步子,看走出后是否可以取消当前的被将状态。

如果任何棋子走后都不能解除被将状态,就是将死了
benke520 2009-11-09
  • 打赏
  • 举报
回复
学习
winstonbonaparte 2009-11-09
  • 打赏
  • 举报
回复
强,虽然会下象棋,不过从来没有考虑过用代码实现
无条件为你 2009-11-09
  • 打赏
  • 举报
回复
我要向楼主 挑战 象棋,我自认为水平不是一般!不知道楼主有没有兴趣!楼主是哪里的朋友?
无条件为你 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 hys_427 的回复:]
这个我初步的想法是这样的:
1.当对方将时判断是否将死
2.判断将死的标准,首先是看是否有子能把将的棋子吃掉,如果能吃掉,则说明将不死了,否则往下判断
3.如果不能吃掉,则判断是否能够挡住将,即在将子和老将之间填一个子,当然这要判断马的情况,因为马是走日字的
4.如果不能挡或者挡住了,还有其它子将,则说明老将必须走了
5.判断老将要走的位置上是否有其它子在等着吃,如果有则不能走
6.如果所有路口都不能走了,说明被将死了

不知我的说法有啥不足的地方,欢迎补充
[/Quote]

你的第一步就搞错了!

你说在“当对方将时判断是否将死”,这是不妥的。不能在对方将时才判断。比如:我主动把“帅”送给对方吃,你岂不是判断不出来?而主动送“帅”给对方的走法也是不允许的!

另外,其实你的问题很简单,没有必要那么复杂。你用的啥控件?没想到还有控件!学习下哈!
mjp1234airen4385 2009-11-09
  • 打赏
  • 举报
回复
象棋水平贼臭。
不会。
zeroieme 2009-11-08
  • 打赏
  • 举报
回复
首先被将了,广度一层搜索所有走法,不能应将的,GAME OVER
加载更多回复(15)

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧