[擂台]中国象棋中规则检查的算法(象)

wingfiring 2003-08-22 04:38:01
写一个检查中国象棋走棋是否符合规则的算法。先只写如何检查“象“的规则,检查包括黑白方的“象“。
已经有了一些定义,如下:
enum ECChess //棋子的编码em_R表示红棋,后面跟拼音。
{
em_NoChess = 0x00,

em_RMin = 0x11,
em_RJu = 0x11,
em_RMa = 0x12,
em_RXiang = 0x13,
em_RShi = 0x14,
em_RShuai = 0x15,
em_RPao = 0x16,
em_RBing = 0x17,
em_RMax = 0x17,

em_BMin = 0x21,
em_BJu = 0x21,
em_BMa = 0x22,
em_BXiang = 0x23,
em_BShi = 0x24,
em_BJiang = 0x25,
em_BPao = 0x26,
em_BZhu = 0x27,
em_BMax = 0x27
};
struct CStep //定义了棋步的起止点。
{
unsigned char from,to;
};
棋盘的定义:
class CChessboard
{
enum EChessboard
{
em_SizeX = 10;
em_SizeY = 9;
};
#define BOARDSIZE (em_SizeX * em_SizeY)
unsigned char cells_[BOARDSIZE]; //棋盘格
......
public:
EChessResult Go(CStep);
......
private:
bool Check(CStep);
};

现在要求在check中检查走棋是否符合中国象棋规则。
bool CChessboard::Check(CStep s)

要求:
时间和空间综合效率最高者独得100分,要完整的函数,符合规则返回true。效率主要考虑时间,空间效率只要不过分奢侈即可。
另外,我将对其它的棋子开新贴子,都是100分的贴。有兴趣的可以关注。

补充说明:
棋盘按照自己方是红方,左下角坐标为(0,0),右上角是(9,8)来安排坐标;
按行存储,棋子(i,j)在cells_中的位置为i*em_SizeX + j;
...全文
70 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Dragon132 2003-09-08
  • 打赏
  • 举报
回复
bool CChessboard::CheckRXiang(CStep s)
{
int x1,x2,y1,y2;
x1=s.from/9;
y1=s.from%9;
x2=s.to/9;
y2=s.to%9;
if( cells_[s.to]>em_RMax && cells_[s.to]<em_RMin ) //s.to有自己的棋子
return false;

if( y2>4 ) //飞象过河
return false;
if( abs(x1-x2)==2 && abs(y1-y1)==2 && cells_[(s.from+s.to)/2]==em_NoChess )
return true;

return false;
}

bool CChessboard::CheckBXiang(CStep s)
{
int x1,x2,y1,y2;
x1=s.from/9;
y1=s.from%9;
x2=s.to/9;
y2=s.to%9;
if( cells_[s.to]>em_BMax && cells_[s.to]<em_BMin )
return false;

if( y2<5 ) //飞相过河
return false;
if( abs(x1-x2)==2 && abs(y1-y1)==2 && cells_[(s.from+s.to)/2]==em_NoChess )
return true;

return false;
}
wingfiring 2003-08-24
  • 打赏
  • 举报
回复
我的不是做“走法产生器”那么复杂的东西,而是对是否符合规则做检查。
举个例子:车2平5(我的实际当中并非这样描述的)。那么我要检查这一步是不是合法:5位置上有本方棋子,非法;3或者4上有任意一方的棋子,非法。必须3,4位置是空的,5位置是空的或者是对方棋子,才是合法的棋步。我只是做这个检查。
thrillers 2003-08-23
  • 打赏
  • 举报
回复
up学习
Dragon132 2003-08-23
  • 打赏
  • 举报
回复
mark
wingfiring 2003-08-22
  • 打赏
  • 举报
回复
擂台所有项目的连接:
http://expert.csdn.net/Expert/topic/2177/2177761.xml?temp=.5416223
http://expert.csdn.net/Expert/topic/2177/2177860.xml?temp=9.517848E-03
http://expert.csdn.net/Expert/topic/2177/2177862.xml?temp=.95599
http://expert.csdn.net/Expert/topic/2177/2177871.xml?temp=.1810266
http://expert.csdn.net/Expert/topic/2177/2177874.xml?temp=.6430628
http://expert.csdn.net/Expert/topic/2177/2177882.xml?temp=.598324
http://expert.csdn.net/Expert/topic/2177/2177840.xml?temp=.900387

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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