BaseDef.cpp
上传用户:onward9999
上传日期:2022-06-27
资源大小:989k
文件大小:7k
源码类别:

其他游戏

开发平台:

Visual C++

  1. #include "StdAfx.h"
  2. #include "BaseDef.h"
  3. #ifdef _DEBUG
  4. #undef THIS_FILE
  5. static char THIS_FILE[]=__FILE__;
  6. #define new DEBUG_NEW
  7. #endif
  8. //以下是全局函数实现:
  9. int rnd(const int& n)
  10.    {
  11. static int seed=0,c1=29,c2=217,c3=1024;
  12. if (seed==0)seed=(UINT)::GetTickCount();
  13. seed=(seed*c1+c2)%c3;
  14. return seed*n/c3;
  15.    }
  16. BOOL  CanGo(int manmap[11][12],
  17.    const int & man,
  18.    const int & xfrom,
  19.    const int & yfrom,
  20.    const int & xto,
  21.    const int & yto)
  22. {
  23. static int i,j;
  24. if(!IsNormal(ManToType[man],xto,yto)) //这个棋子不能放在目标位置
  25. {
  26. //如果不是将|帅 (将|帅可以"照相")
  27. if(ManToType[man]!=RED_K&& ManToType[man]!=BLACK_K)return FALSE;
  28. else if(ManToType[man]==RED_K && //走的是帅
  29. ManToType[manmap[xto][yto]]==BLACK_K) //目标是将
  30. {
  31. BOOL flag=FALSE;
  32. for(j= yfrom-1;j>0;j--)
  33. {
  34. if (manmap[xfrom][j]!=32)
  35. {
  36. if(ManToType[manmap[xfrom][j]]==BLACK_K) //照相
  37. flag=TRUE;
  38. break;
  39. }
  40. }
  41. if(flag)return TRUE;
  42. else return FALSE;
  43. }
  44. else if(ManToType[manmap[xto][yto]]==RED_K) //走的是将,目标是帅
  45. {
  46. BOOL flag=FALSE;
  47. for(j= yfrom+1;j<11;j++)
  48. {
  49. if (manmap[xfrom][j]!=32)
  50. {
  51. if(ManToType[manmap[xfrom][j]]==RED_K) //照相
  52. flag=TRUE;
  53. break;
  54. }
  55. }
  56. if(flag)return TRUE;
  57. else return FALSE;
  58. }
  59. else return FALSE;
  60. }
  61. //下面几行判断目标点是否己方的棋子:
  62. if(SideOfMan[man]==0)
  63. {
  64. if(manmap[xto][yto]!=32&& SideOfMan[manmap[xto][yto]]==0)return FALSE;
  65. }
  66. else if(SideOfMan[man]==1)
  67. {
  68. if(manmap[xto][yto]!=32&& SideOfMan[manmap[xto][yto]]==1)return FALSE;
  69. }
  70. //--------------------------------
  71. //以下是各棋子的规则:
  72. switch(ManToType[man])
  73. {
  74. case RED_B:
  75. //兵不回头:
  76. if(yto > yfrom)return FALSE;
  77. //兵只走一步直线:
  78. if(yfrom-yto+abs(xto-xfrom)>1)return FALSE;
  79. break;
  80. case BLACK_B:
  81. //卒不回头:
  82. if(yto < yfrom)return FALSE;
  83. //卒只走一步直线:
  84. if(yto-yfrom+abs(xto-xfrom)>1)return FALSE;
  85. break;
  86. case RED_S:
  87. case BLACK_S:
  88. //士走斜线一步:
  89. if(abs(yfrom-yto)>1||abs(xto-xfrom)>1)return FALSE;
  90. break;
  91. case RED_X:
  92. case BLACK_X:
  93. //相走田:
  94. if(abs(xfrom-xto)!=2||abs(yfrom-yto)!=2)return FALSE;
  95. //相心:
  96. if(manmap[(xfrom+xto)/2][(yfrom+yto)/2]!=32)return FALSE;
  97. break;
  98. case RED_K:
  99. case BLACK_K:
  100. //将帅只走一步直线:
  101. if(abs(yfrom-yto)+abs(xto-xfrom)>1)return FALSE;
  102. break;
  103. case RED_J:
  104. case BLACK_J:
  105. //车只能走直线:
  106. if(yfrom!=yto&&xfrom!=xto)return FALSE;
  107. //车经过的路线中不能有棋子: -----------
  108. if(yfrom==yto)
  109. {
  110. if(xfrom<xto)
  111. {
  112. for(i=xfrom+1;i<xto;i++)
  113. if(manmap[i][yfrom]!=32)return FALSE;
  114. }
  115. else
  116. {
  117. for(i=xto+1;i<xfrom;i++)
  118. if(manmap[i][yfrom]!=32)return FALSE;
  119. }
  120. }
  121. else
  122. {
  123. if(yfrom<yto)
  124. {
  125. for(j=yfrom+1;j<yto;j++)
  126. if(manmap[xfrom][j]!=32)return FALSE;
  127. }
  128. else
  129. {
  130. for(j=yto+1;j<yfrom;j++)
  131. if(manmap[xfrom][j]!=32)return FALSE;
  132. }
  133. }
  134. //以上是车---------------------------------
  135. break;
  136. case RED_P:
  137. case BLACK_P:
  138. //炮只能走直线:
  139. if(yfrom!=yto&&xfrom!=xto)return FALSE;
  140. //炮不吃子时经过的路线中不能有棋子:------------------
  141. if(manmap[xto][yto]==32)
  142. {
  143. if(yfrom==yto)
  144. {
  145. if(xfrom<xto)
  146. {
  147. for(i=xfrom+1;i<xto;i++)
  148. if(manmap[i][yfrom]!=32)return FALSE;
  149. }
  150. else
  151. {
  152. for(i=xto+1;i<xfrom;i++)
  153. if(manmap[i][yfrom]!=32)return FALSE;
  154. }
  155. }
  156. else
  157. {
  158. if(yfrom<yto)
  159. {
  160. for(j=yfrom+1;j<yto;j++)
  161. if(manmap[xfrom][j]!=32)return FALSE;
  162. }
  163. else
  164. {
  165. for(j=yto+1;j<yfrom;j++)
  166. if(manmap[xfrom][j]!=32)return FALSE;
  167. }
  168. }
  169. }
  170. //以上是炮不吃子-------------------------------------
  171. //吃子时:=======================================
  172. else
  173. {
  174. int count=0;
  175. if(yfrom==yto)
  176. {
  177. if(xfrom<xto)
  178. {
  179. for(i=xfrom+1;i<xto;i++)
  180. if(manmap[i][yfrom]!=32)count++;
  181. if(count!=1)return FALSE;
  182. }
  183. else
  184. {
  185. for(i=xto+1;i<xfrom;i++)
  186. if(manmap[i][yfrom]!=32)count++;
  187. if(count!=1)return FALSE;
  188. }
  189. }
  190. else
  191. {
  192. if(yfrom<yto)
  193. {
  194. for(j=yfrom+1;j<yto;j++)
  195. if(manmap[xfrom][j]!=32)count++;
  196. if(count!=1)return FALSE;
  197. }
  198. else
  199. {
  200. for(j=yto+1;j<yfrom;j++)
  201. if(manmap[xfrom][j]!=32)count++;
  202. if(count!=1)return FALSE;
  203. }
  204. }
  205. }
  206. //以上是炮吃子时================================
  207. break;
  208. case RED_M:
  209. case BLACK_M:
  210. //马走日:
  211. if(!(
  212. (abs(xto-xfrom)==1&&abs(yto-yfrom)==2)
  213. ||(abs(xto-xfrom)==2&&abs(yto-yfrom)==1)
  214. ))return FALSE;
  215. //找马脚:
  216. if (xto-xfrom==2){i=xfrom+1;j=yfrom;}
  217. else if (xfrom-xto==2){i=xfrom-1;j=yfrom;}
  218. else if (yto-yfrom==2){i=xfrom;j=yfrom+1;}
  219. else if (yfrom-yto==2){i=xfrom;j=yfrom-1;}
  220. //绊马脚:
  221. if(manmap[i][j]!=32)return FALSE;
  222. break;
  223. default:
  224. break;
  225. }
  226. return TRUE; //上面的规则全通过!
  227. }
  228. BOOL  IsNormal(const int & mantype,const int & x,const int & y)
  229. {
  230. if(x<1||x>9||y<1||y>10)return FALSE;
  231. switch(mantype)
  232. {
  233. case RED_K:
  234. //帅不能在红方宫外:
  235. if( x>6|| x<4|| y<8)return FALSE;
  236. break;
  237. case RED_S:
  238. //仕只能在宫内特定点:
  239. if(!(
  240. ( x==4&& y==10)||
  241. ( x==4&& y==8)||
  242. ( x==5&& y==9)||
  243. ( x==6&& y==10)||
  244. ( x==6&& y==8)
  245. ))return FALSE;
  246. break;
  247. case RED_X:
  248. //七个相位:
  249. if(!(
  250. ( x==1&& y==8)||
  251. ( x==3&& y==10)||
  252. ( x==3&& y==6)||
  253. ( x==5&& y==8)||
  254. ( x==7&& y==10)||
  255. ( x==7&& y==6)||
  256. ( x==9&& y==8)
  257. ))return FALSE;
  258. break;
  259. case RED_B:
  260. //兵不能在兵位后:
  261. if( y>7)return FALSE;
  262. //兵过河前不能左右移动:
  263. if( y>5&& x%2==0)return FALSE;
  264. break;
  265. case BLACK_K:
  266. //帅不能在红方宫外:
  267. if( x>6|| x<4|| y>3)return FALSE;
  268. break;
  269. case BLACK_S:
  270. //仕只能在宫内特定点:
  271. if(!(
  272. ( x==4&& y==1)||
  273. ( x==4&& y==3)||
  274. ( x==5&& y==2)||
  275. ( x==6&& y==1)||
  276. ( x==6&& y==3)
  277. ))return FALSE;
  278. break;
  279. case BLACK_X:
  280. //七个相位:
  281. if(!(
  282. ( x==1&& y==3)||
  283. ( x==3&& y==1)||
  284. ( x==3&& y==5)||
  285. ( x==5&& y==3)||
  286. ( x==7&& y==1)||
  287. ( x==7&& y==5)||
  288. ( x==9&& y==3)
  289. ))return FALSE;
  290. break;
  291. case BLACK_B:
  292. //兵不能在兵位后:
  293. if( y<4)return FALSE;
  294. //兵过河前不能左右移动:
  295. if( y<6&& x%2==0)return FALSE;
  296. break;
  297. default:
  298. break;
  299. }
  300. return TRUE;
  301. }
  302. void  FixManMap(CFace & face, int map[11][12])
  303. {
  304. memcpy(map,_defaultmap,132*sizeof(int));
  305. static CXY * pman;
  306. static int i;
  307. for(i=0;i<32;i++)
  308. {
  309. pman = & face.man[i];
  310. if(pman->x)
  311. map[pman->x][pman->y]=i;
  312. }
  313. }