博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于中国象棋中走字合法性判断的算法(有我用TC2.0写的算法) (转)
阅读量:2499 次
发布时间:2019-05-11

本文共 3012 字,大约阅读时间需要 10 分钟。

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

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

棋盘先设定好,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:/*HeaderCtal*/将或帅
  {
  if(map[nowx][nowy].num==0&&map[nowx][nowy].Id!=NONE&&oldx==nowx)
  {
  /*Face to Face*/
  y1=oldy;y2=nowy;
  if(nowywap(&y1,&y2);
  for(y=y1+1;y  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  for(x=x1+1;x  }
  if(nox==0&&abs(noy)>1)
  {
  y1=oldy;y2=nowy;
  if(nowy  for(y=y1+1;y  }
  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  for(x=x1+1;x  }
  else if(nox==0&&abs(noy)>0)
  {
  y1=oldy;y2=nowy;
  if(nowy  for(y=y1+1;y  }
  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;
}

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10748419/viewspace-983493/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10748419/viewspace-983493/

你可能感兴趣的文章
docker-daemon.json各配置详解
查看>>
Docker(一)使用阿里云容器镜像服务
查看>>
Docker(三) 构建镜像
查看>>
FFmpeg 是如何实现多态的?
查看>>
FFmpeg 新旧版本编码 API 的区别
查看>>
RecyclerView 源码深入解析——绘制流程、缓存机制、动画等
查看>>
Android 面试题整理总结(一)Java 基础
查看>>
Android 面试题整理总结(二)Java 集合
查看>>
学习笔记_vnpy实战培训day02
查看>>
学习笔记_vnpy实战培训day03
查看>>
VNPY- VnTrader基本使用
查看>>
VNPY - CTA策略模块策略开发
查看>>
VNPY - 事件引擎
查看>>
MongoDB基本语法和操作入门
查看>>
学习笔记_vnpy实战培训day04_作业
查看>>
OCO订单(委托)
查看>>
学习笔记_vnpy实战培训day06
查看>>
回测引擎代码分析流程图
查看>>
Excel 如何制作时间轴
查看>>
股票网格交易策略
查看>>