关于中国象棋中走字合法性判断的算法(有我用TC2.0写的算法)

原创 2001年03月03日 15:19:00

对于中国象棋,每一个字都有自己的规则,正所谓无规矩不成方圆。

棋盘先设定好,a:array[1..10][1..9] of MapStruct;
是个二维数组,每个单元符全自定义的棋盘结构
不要定义一个棋字结构

int StepJudge(int oldx,int oldy,int nowx,int nowy)

/* oldx,oldy           棋字原来位置 */
/* oldx,oldy           棋字新位置 */
/* 判断从原位置到新位置的合法性 */
{
 int index,count=0;
 int nox,noy;
 int x,y,x1,x2,y1,y2;
 BYTE ChessId;           /* 棋字是哪一方的,有RED,BLUE,NONE三种值 */
 ChessId=map[oldx][oldy].Id;
 if(ChessId==NONE) return 0;
 if(oldx==nowx&&oldy==nowy) return 0;
 if(nowx>8||nowx<0||nowy<0||nowy>9) return 0;
 nox=nowx-oldx;noy=nowy-oldy;
 switch(map[oldx][oldy].num)
 {
  case 0:/*HeaderCapital*/将或帅
  {
   if(map[nowx][nowy].num==0&&map[nowx][nowy].Id!=NONE&&oldx==nowx)
   {
    /*Face to Face*/
    y1=oldy;y2=nowy;
    if(nowy<oldy) Swap(&y1,&y2);
    for(y=y1+1;y<y2;y++) if(map[nowx][y].Id!=NONE) count++;
    if(count==0) return 1;
   }
   if(abs(nox)>1||abs(noy)>1||abs(nox)==1&&abs(noy)==1) return 0;
   if(nowy>2&&nowy<7||nowx<3||nowx>5) return 0;
   break;
  }
  case 14: case 15:/*Genaral*/车
  {
   if(abs(nox)!=0&&abs(noy)!=0) return 0;
   if(abs(nox)>1&&noy==0)
   {
    x1=oldx;x2=nowx;
    if(nowx<oldx) Swap(&x1,&x2);
    for(x=x1+1;x<x2;x++) if(map[x][nowy].Id!=NONE) return 0;
   }
   if(nox==0&&abs(noy)>1)
   {
    y1=oldy;y2=nowy;
    if(nowy<oldy) Swap(&y1,&y2);
    for(y=y1+1;y<y2;y++) if(map[nowx][y].Id!=NONE) return 0;
   }
   break;
  }
  case 10: case 11:/*Horse*/马
  {
   if(abs(nox)==2&&abs(noy)==1||abs(nox)==1&&abs(noy)==2)
   {
    if(abs(nox)==1&&map[oldx][oldy+noy/2].Id!=NONE) return 0;
    if(abs(nox)==2&&map[oldx+nox/2][oldy].Id!=NONE) return 0;
    break;
   }
   else return 0;
  }
  case 12: case 13:/*Gun*/炮
  {
   if(abs(nox)>0&&abs(noy)>0) return 0;
   if(abs(nox)>0&&noy==0)
   {
    x1=oldx;x2=nowx;
    if(nowx<oldx) Swap(&x1,&x2);
    for(x=x1+1;x<x2;x++) if(map[x][nowy].Id!=NONE) count++;
   }
   else if(nox==0&&abs(noy)>0)
   {
    y1=oldy;y2=nowy;
    if(nowy<oldy) Swap(&y1,&y2);
    for(y=y1+1;y<y2;y++) if(map[nowx][y].Id!=NONE) count++;
   }
   if(count==0&&map[nowx][nowy].Id!=NONE) return 0;
   if(count==1&&map[nowx][nowy].Id==NONE) return 0;
   if(count>1) return 0;
   break;
  }
  case 3: case 4:/*Minister*/象或相
  {
   if(abs(nox)!=2||abs(noy)!=2) return 0;
   else if(map[oldx+nox/2][oldy+noy/2].Id!=NONE) return 0;
   if(nowy==0||nowy==4||nowy==5||nowy==9)
   if(nowx==2||nowx==6) break;
   if(nowy==2||nowy==7)
   if(nowx==0||nowx==4||nowx==8) break;
  }
  case 1: case 2:/*Shi*/士或仕
  {
   if(abs(nox)!=1||abs(noy)!=1) return 0;
   if(nowy>2&&nowy<7||nowx<3||nowx>5) return 0;
   break;
  }
  case 5: case 6: case 7: case 8: case 9: /*Soldier*/兵或卒
  {
   if(abs(nox)>0&&abs(noy)>0) return 0;
   if(ChessId==GREEN&&GreenChess[0].y<3||ChessId==RED&&RedChess[0].y<3)
   {
    if(oldy>4)
    {
     if(nox==0&&noy!=1) return 0;
     if(abs(nox)!=1&&noy==0) return 0;
    }
    if(oldy<5) if(nox!=0||noy!=1) return 0;
   }
   if(ChessId==GREEN&&GreenChess[0].y>6||ChessId==RED&&RedChess[0].y>6)
   {
    if(oldy<5)
    {
     if(nox==0&&noy!=-1) return 0;
     if(abs(nox)!=1&&noy==0) return 0;
    }
    if(oldy>4) if(nox!=0||noy!=-1) return 0;
   }
   index=map[oldx][oldy].num;
   if(ChessId==GREEN)
   if(GreenChess[0].y<3&&GreenChess[index].y>4||GreenChess[0].y>6&&GreenChess[index].y<5)
    GreenChess[index].FixLevel=ADVANCED_SOLDIER_LEVEL;
   if(ChessId==RED)
   if(RedChess[0].y<3&&RedChess[index].y>4||RedChess[0].y>6&&RedChess[index].y<5)
    RedChess[index].FixLevel=ADVANCED_SOLDIER_LEVEL;//兵过河后等级值加1
   break;
  }
 }
 if(ChessId==map[nowx][nowy].Id) return 2;
 else return 1;
}

中国象棋软件-引擎实现(四)搜索算法

 对于棋类软件的搜索算法经前人的努力已形成了较为成熟的Alpha-Beta搜索算法以及其它一些辅助增强算法。所以小生在自己的程序中直接借鉴了Alpha-Beta搜索算法并辅以了历史启发。对此两者王小春...
  • jb80400812
  • jb80400812
  • 2009年05月12日 22:39
  • 4124

象棋AI算法(一)

参考文献:http://www.xqbase.com/computer/search_minimax.htm http://www.xqbase.com/computer/search_alphabe...
  • u012723995
  • u012723995
  • 2015年07月29日 21:29
  • 13963

卡里象棋 C++中国象棋引擎(界面部分用MFC实现)[内含详细设计说明文档](更新于2017-11-16)

原创作品,知识付费,请尊重劳动者的成果  QQ:3508551694 (同时提供定制功能)卡里象棋程序介绍:受众:适合备战就业(离毕业还有一年开始准备找工作的大四的同学,研三的同学),专门为开发人员准...
  • ClamReason
  • ClamReason
  • 2016年12月15日 12:33
  • 3563

算术表达式的合法性判断与求值(上)

在写一个计算器时遇到了一个问题,就是对字符串表示的算术表达式的合法性判断与求值。下面记录一下我的解决方案。 一、问题描述 问题:给定一个字符串,只包含 '+'、'-'、'*'、'/'、数字、小数点...
  • lisong694767315
  • lisong694767315
  • 2014年10月06日 20:37
  • 3930

中国象棋人机对弈搜索算法学习-极大极小值,负极大值,alpha-beta算法

先参考学习如下博文: http://blog.csdn.net/kingkong1024/article/details/7639401 http://hk.gamfe.com/news/2015...
  • qq_26437925
  • qq_26437925
  • 2016年04月07日 18:48
  • 2379

分享 中国象棋算法设计

总的来说,要让电脑知道该在哪一点下子,就要根据盘面的形势,为每一可能落子的点计算其重要程度,也就是当这子落下后会形成什么棋型(如:“冲四”、“活三”等),然后通览全盘选出最重要的一点,这便是最基本的算...
  • jian200801
  • jian200801
  • 2012年05月16日 18:21
  • 4177

象棋最大最小剪枝算法

1.象棋中通常需要推算当前局面下,每走一步之后的局面分,通常我们可以设定考虑几步棋,通常我们所说的算棋,而计算机的AI算法中最常用的就是最大值最小值算法,而剪枝算法是对最大值最小值算法的一种优化。 ...
  • qq_31099225
  • qq_31099225
  • 2017年06月29日 15:32
  • 1615

象棋AI算法(二)

参考文献:http://bbs.blueidea.com/thread-3047030-1-1.html 前言: 原文大神是用html5+js写的关于象棋AI的博客,里面重点讲了棋...
  • u012723995
  • u012723995
  • 2015年07月30日 14:11
  • 3635

Minecraft的爆炸算法

MC中的爆炸其实挺科学的,在空中爆炸冲击波传得远,破坏范围比较大;在地面爆炸破坏范围小但是破坏深度较深...
  • xfgryujk
  • xfgryujk
  • 2017年04月01日 13:40
  • 583

关于树的算法的总结

之前总结过,主要分为liang'da'lie
  • binling
  • binling
  • 2014年09月21日 11:52
  • 1083
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:关于中国象棋中走字合法性判断的算法(有我用TC2.0写的算法)
举报原因:
原因补充:

(最多只允许输入30个字)