Advertisement
Synthetics

Chess

Sep 7th, 2011
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.12 KB | None | 0 0
  1.  
  2. _____            _____                   _____          
  3.          /\    \          |\    \                 /\    \        
  4.         /::\    \         |:\____\               /::\____\        
  5.        /::::\    \        |::|   |              /::::|   |        
  6.       /::::::\    \       |::|   |             /:::::|   |        
  7.      /:::/\:::\    \      |::|   |            /::::::|   |        
  8.     /:::/__\:::\    \     |::|   |           /:::/|::|   |        
  9.     \:::\   \:::\    \    |::|   |          /:::/ |::|   |        
  10.   ___\:::\   \:::\    \   |::|___|______   /:::/  |::|   | _____  
  11.  /\   \:::\   \:::\    \  /::::::::\    \ /:::/   |::|   |/\    \
  12. /::\   \:::\   \:::\____\/::::::::::\____/:: /    |::|   /::\____\
  13. \:::\   \:::\   \::/    /:::/~~~~/~~     \::/    /|::|  /:::/    /
  14.  \:::\   \:::\   \/____/:::/    /         \/____/ |::| /:::/    /
  15.   \:::\   \:::\    \  /:::/    /                  |::|/:::/    /  
  16.    \:::\   \:::\____\/:::/    /                   |::::::/    /  
  17.     \:::\  /:::/    /\::/    /                    |:::::/    /    
  18.      \:::\/:::/    /  \/____/                     |::::/    /    
  19.       \::::::/    /                               /:::/    /      
  20.        \::::/    /                               /:::/    /      
  21.         \::/    /                                \::/    /        
  22.          \/____/                                  \/____/
  23.  
  24.  
  25.  
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34. #include <stdlib.h>
  35.  
  36. //-----------------------------------
  37.  
  38. struct sPiece  {    int ID, x, y, Val;};
  39. struct sGroup  {    int ID, PiD[4];      };
  40. struct sHalfMap{    int ID, GiD[4];      };
  41. struct sFullMap{    int ID, HiD[2];      };
  42.  
  43. //----------------
  44.  
  45. struct sFullMap *board, *Boards;
  46. struct sHalfMap *half, *Halves;
  47. struct sGroup *group, *Groups;
  48. struct sPiece *piece, *Pieces;
  49.  
  50. int iBoards=0, iHalves=0, iGroups=0, iPieces=0;
  51.  
  52. const cInitPiece[]    = { 2,3,4,5,6,4,3,2 };
  53.  
  54. const PieceA[]  = {'-','P','C','H','B','Q','K'};
  55. const PieceB[]  = {'-','p','c','h','b','q','k'};
  56.  
  57. int ShortBoard[8][8];
  58. int   ShortPiD[4][4];
  59. int   SPx, SPy;
  60.  
  61. //-----------------------------------
  62. //-------------------------------------------------------------------------------------------------
  63.  
  64. void iiBoard(){
  65. if(iBoards==0){
  66.     Boards = (struct sFullMap *)malloc(sizeof(struct sFullMap));
  67.     } else {
  68.     board = realloc(Boards,(iBoards+2)* sizeof(struct sFullMap));
  69.     if (board!=NULL) Boards = board;
  70.     }
  71. }
  72.  
  73. //------------------
  74.  
  75. int BEScanner(int a, int b, int c){
  76. int iBe, iHalt=-1;
  77. for(iBe=0;iBe<iBoards;iBe++){
  78.     if(Boards[iBe].HiD[0] == b)
  79.         if(Boards[iBe].HiD[1] == c) iHalt=1;
  80.     if(iHalt==1){printf("Found @ %i", iBe); break;}
  81.     }
  82. if(iHalt==-1) iBe=1;
  83. return (iHalt * iBe);
  84. }
  85.  
  86. //-----------------------
  87.    
  88. void BoardEntry(int iD, int HiDa, int HiDb){
  89. if (BEScanner(iD, HiDa, HiDb)!=-1) return;
  90. if(iBoards<=iD) iiBoard();
  91. Boards[iD].ID = iD;
  92. Boards[iD].HiD[0] = HiDa;
  93. Boards[iD].HiD[1] = HiDb;
  94. iBoards++;
  95. printf("added %i", iBoards-1);
  96. }
  97.    
  98.  
  99. //-----------------------------------
  100.  
  101. void iiHalf(){
  102. if(iHalves==0){
  103.     Halves = (struct sHalfMap *)malloc(sizeof(struct sHalfMap));
  104.     } else {
  105.     half = realloc(Halves,(iHalves+2)* sizeof(struct sHalfMap));
  106.     if (half!=NULL) Halves = half;
  107.     }
  108. }
  109.  
  110. //------------------
  111.  
  112. int HEScanner(int a, int b, int c, int d){
  113. int iBe, iHalt=-1;
  114. for(iBe=0;iBe<iHalves;iBe++){
  115.     if(Halves[iBe].GiD[0] == a)
  116.         if(Halves[iBe].GiD[1] == b)
  117.             if(Halves[iBe].GiD[2] == c)
  118.                 if(Halves[iBe].GiD[3] == d) iHalt=1;
  119.     if(iHalt==1){printf("Found @ %i", iBe); break;}
  120.     }
  121. if(iHalt==-1) iBe=1;
  122. return (iHalt * iBe);
  123. }
  124.  
  125. //-----------------------
  126.  
  127. void HalfEntry(int iD, int GiDa, int GiDb, int GiDc, int GiDd){
  128. if (HEScanner(GiDa, GiDb, GiDc, GiDd)!=-1) return;
  129. if(iHalves<=iD) iiHalf();
  130. Halves[iD].ID = iD;
  131. Halves[iD].GiD[0] = GiDa;
  132. Halves[iD].GiD[1] = GiDb;
  133. Halves[iD].GiD[2] = GiDc;
  134. Halves[iD].GiD[3] = GiDd;
  135. iHalves++;
  136. }
  137.  
  138. //-----------------------------------
  139.  
  140. void iiGroup(){
  141. if(iGroups==0){
  142.     Groups = (struct sGroup *)malloc(sizeof(struct sGroup));
  143.     } else {
  144.     group = realloc(Groups,(iGroups+2)* sizeof(struct sGroup));
  145.     if (group!=NULL) Groups = group;
  146.     }
  147. }
  148.  
  149. //------------------
  150. int GEScanner(int a, int b, int c, int d){
  151. int iBe, iHalt=-1;
  152. for(iBe=0;iBe<iGroups;iBe++){
  153.     if(Groups[iBe].PiD[0] == a)
  154.         if(Groups[iBe].PiD[1] == b)
  155.             if(Groups[iBe].PiD[2] == c)
  156.                 if(Groups[iBe].PiD[3] == d) iHalt=1;
  157.     if(iHalt==1){printf("Found @ %i", iBe); break;}
  158.     }
  159. if(iHalt==-1) iBe=1;
  160. return (iHalt * iBe);
  161. }
  162.  
  163. //-----------------------
  164.  
  165. void GroupEntry(int iD, int PiDa, int PiDb, int PiDc, int PiDd){
  166. if (GEScanner(PiDa, PiDb, PiDc, PiDd)!=-1) return;
  167. if(iGroups<=iD) iiGroup();
  168. Groups[iD].ID = iD;
  169. Groups[iD].PiD[0] = PiDa;
  170. Groups[iD].PiD[1] = PiDb;
  171. Groups[iD].PiD[2] = PiDc;
  172. Groups[iD].PiD[3] = PiDd;
  173. iGroups++;
  174. }
  175.  
  176. //-----------------------------------
  177.  
  178. void iiPiece(){
  179. if(iPieces==0){
  180.     Pieces = (struct sPiece *)malloc(sizeof(struct sPiece));
  181.     } else {
  182.     piece = realloc(Pieces,(iPieces+2)* sizeof(struct sPiece));
  183.     if (piece!=NULL) Pieces = piece;
  184.     }
  185. }
  186.  
  187. //------------------
  188.  
  189. int PEScanner(int a, int b, int c){
  190. int iBe, iHalt=-1;
  191. for(iBe=0;iBe<iPieces;iBe++){
  192.     if(Pieces[a].x == a)
  193.         if(Pieces[a].y == b)
  194.             if(Pieces[a].Val == c) iHalt=1;
  195.     if(iHalt==1){printf("Found @ %i", iBe); break;}
  196.     }
  197. if(iHalt==-1) iBe=1;
  198. return (iHalt * iBe);
  199. }
  200.  
  201. //-----------------------
  202.  
  203.  
  204. void PieceEntry(int iD, int Px, int Py, int PVal){
  205. if(iPieces<=iD) iiPiece();
  206. Pieces[iD].ID = iD;
  207. Pieces[iD].x = Px;
  208. Pieces[iD].y = Py;
  209. Pieces[iD].Val = PVal;
  210. iPieces++;
  211. }
  212.  
  213. //-----------------------------------
  214. //------------------------------------------------------------------------------------
  215.  
  216. void Amnesia(){
  217.  
  218. BoardEntry(0, 0, 0);
  219. //BoardEntry(1,0,1);
  220. //BoardEntry(2,0,2);
  221.  
  222. HalfEntry(0,0,1,2,3);
  223. //HalfEntry(1,0,1,2,4);
  224.  
  225. GroupEntry(0,0,1,2,3);
  226. GroupEntry(1,4,5,6,7);
  227. GroupEntry(2,8,9,10,11);
  228. GroupEntry(3,12,13,14,15);
  229. //GroupEntry(4,12,13,14,15);
  230.  
  231. int i, y=0;
  232. for(i=0;i<=14;i+=2){
  233.     PieceEntry(i,  1,y,1);
  234.     PieceEntry(i+1,0,y,(int) cInitPiece[y]);
  235.     y++;
  236.     }
  237.  
  238. }
  239.  
  240. //---------------------------------
  241.  
  242. void GetBoardX(int i){
  243. int Hint, Gint, Pint;
  244. int z,y,x;
  245. Hint = Boards[i].HiD[0];
  246. for (y=0;y<4;y++){
  247.     Gint = Halves[ Hint ].GiD[y];
  248.     for (z=0;z<4;z++){
  249.         Pint = Groups[ Gint ].PiD[z];
  250.         ShortBoard[ Pieces[Pint].x ][ Pieces[Pint].y ] = Pieces[Pint].Val;
  251.         ShortPiD[y][z]=Pint;
  252.          }
  253.     }
  254.  
  255. Hint = Boards[i].HiD[1];
  256. for (y=0;y<4;y++){
  257.     Gint = Halves[ Hint ].GiD[y];
  258.     for (z=0;z<4;z++){
  259.         Pint = Groups[ Gint ].PiD[z];
  260.         ShortBoard[7- Pieces[Pint].x ][7- Pieces[Pint].y ] = -Pieces[Pint].Val;
  261.          }
  262.     }
  263.  
  264. return;
  265. }
  266.  
  267. //-------------------------------
  268.  
  269. void ClearBoard(){
  270. int x, y;
  271. for(x=0;x<8;x++){
  272.     for(y=0;y<8;y++){
  273.         ShortBoard[x][y] = 0;
  274.         }
  275.     }
  276. }
  277.  
  278. //-----------------------------------
  279.  
  280. void DrawBoard(){
  281. int x, y;
  282. printf("\n");
  283. for(y=0;y<8;y++){
  284.     for(x=0;x<8;x++){
  285.         if(ShortBoard[x][y]>=0){
  286.             printf("%c ", PieceA[ShortBoard[x][y]]);
  287.             } else {
  288.             printf("%c ", PieceB[-ShortBoard[x][y]]);
  289.             }
  290.         }
  291.     printf("\n");
  292.     }
  293. }
  294.  
  295. //-----------------------------------
  296. //---------------------------------------------------------------------------------------------------
  297. //--------------------------------------------------------------
  298.  
  299. void PMove(int x, int y){
  300. int FMove=0;
  301. if(x==1)FMove=1;
  302. if(ShortBoard[x+1][y]==0){
  303.     printf("Move %i%i,%i%i Valid\n",x,y,x+1,y);
  304.     if((FMove==1) & (ShortBoard[x+2][y]==0)) printf("Move %i%i,%i%i Valid\n",x,y,x+2,y);
  305.     }
  306. }
  307.  
  308. //----------------
  309.  
  310. void PAttack(int x, int y){
  311. if(ShortBoard[x+1][y+1]<0)
  312.     printf("Attack %i%i,%i%i Valid\n",x,y,x+1,y+1);
  313. if(ShortBoard[x+1][y-1]<0)
  314.     printf("Attack %i%i,%i%i Valid\n",x,y,x+1,y-1);
  315. }
  316.  
  317. //-----------------------------------------
  318.  
  319. int JumpX(int x, int y){
  320. if(((0>x) + (x>7) + (0>y) + (y>7))>=1) return -2;
  321. if(ShortBoard[x][y]<=-1) return -1;
  322. if(ShortBoard[x][y]==0) return 0;
  323. if(ShortBoard[x][y]>=1) return 1;
  324. }
  325.  
  326. //-----------------------------------------
  327.  
  328. int BAttackXY(int x, int y, int b, int b2, int c, int d){
  329. int Stepb=x, Stepb2=y;
  330. int Jumpy=0;
  331. while((Stepb!=c) + (Stepb2!=d)==2){
  332.     Stepb+=b;
  333.     Stepb2+=b2;
  334.     if((Jumpy=JumpX(Stepb, Stepb2))!=0) Stepb=c;
  335.     printf("%i", Jumpy);
  336.     }
  337. }
  338. //-----------------------------------------
  339.  
  340. void BAttack(int x, int y){
  341. BAttackXY(x,y,1,1,8,8);
  342. BAttackXY(x,y,1,-1,8,-1);
  343. BAttackXY(x,y,-1,1,-1,8);
  344. BAttackXY(x,y,-1,-1,-1,-1);
  345. }
  346.  
  347. //=--------------------
  348.  
  349. void CAttackvII(int x, int y){
  350. printf("cx%i cy%i ",x,y);
  351. BAttackXY(x,y,1,0,8,8);
  352. BAttackXY(x,y,0,-1,8,-1);
  353. BAttackXY(x,y,0,1,-1,8);
  354. BAttackXY(x,y,-1,0,-1,-1);
  355. }
  356.  
  357. //-------------
  358.  
  359. void QAttack(int x, int y){
  360. BAttack(x, y);
  361. CAttackvII(x, y);
  362. }
  363. //---------------------------
  364.  
  365. void Jump(int x, int y){
  366. if((0>x) + (x>7)>=1){ printf("Null%i%i",x,y); return;}
  367. if((0>y) + (y>7)>=1){printf("Null%i%i",x,y); return;}
  368. if(ShortBoard[x][y]>=1) printf("Blocked %i%i",x,y);
  369. if(ShortBoard[x][y]==0) printf("Open %i%i",x,y);
  370. if(ShortBoard[x][y]<=-1) printf("Hit %i%i",x,y);
  371. //printf("?");
  372. }
  373. //---------------------------
  374.  
  375.  
  376. //------------------
  377.  
  378. void KAttack(x,y){
  379. Jump(x+1, y+1);        Jump(x+1, y);         Jump(x+1, y-1);
  380. Jump(x-1, y+1);        Jump(x-1, y);         Jump(x-1, y-1);
  381. Jump(x, y+1);         Jump(x, y-1);
  382. }
  383.  
  384. //-----------------
  385.  
  386. void HAttack(x,y){
  387. Jump(x+2, y+1);        Jump(x+2, y-1);
  388. Jump(x-2, y+1);        Jump(x-2, y-1);
  389. Jump(x+1, y+2);        Jump(x+1, y-2);
  390. Jump(x-1, y+2);        Jump(x-1, y-2);
  391. }
  392.  
  393. //-----------------
  394.  
  395.  
  396.  
  397. void Moves(int x, int y){
  398. int PieceType=ShortBoard[x][y];
  399. printf("%i @ %i,%i", ShortBoard[x][y], x ,y);
  400. if (PieceType==1)
  401.     printf("GotPawn\n");
  402.     else if(PieceType==2)
  403.         printf("\nGotCastle\n");
  404.     else if(PieceType==3)
  405.         printf("\nGotHorse\n");
  406.     else if(PieceType==4)
  407.         printf("\nGotBishop\n");
  408.     else if(PieceType==5)
  409.         printf("\nGotQueen\n");
  410.     else if(PieceType==6)
  411.         printf("\nGotKing\n");
  412.  
  413.  
  414. switch (PieceType){
  415.     case 1: PMove(x, y);
  416.         PAttack(x, y);
  417.         break;
  418.     case 2: CAttackvII(x, y);
  419.         break;
  420.     case 3: HAttack(x, y);
  421.         break;
  422.     case 4: BAttack(x, y);
  423.         break;
  424.     case 5: QAttack(x, y);
  425.         break;
  426.     case 6: KAttack(x, y);
  427.         break;
  428.  
  429.     }
  430. //printf("Move?\n");
  431.        
  432. }
  433.  
  434.  
  435.  
  436. void GetMoves(){
  437. for(SPx=0;SPx<4;SPx++){
  438.     for(SPy=0;SPy<4;SPy++){
  439.         if(ShortBoard[ Pieces[ShortPiD[SPx][SPy]].x ][ Pieces[ShortPiD[SPx][SPy]].y ]>0){
  440.  
  441.             //printf("Found piece %i\n", ShortBoard[x][y]);
  442.             Moves(Pieces[ShortPiD[SPx][SPy]].x, Pieces[ShortPiD[SPx][SPy]].y);
  443.             }
  444.         }
  445.     }
  446. }
  447.  
  448. //-----------------------------------------------------------------------
  449.  
  450. void main(){
  451. Amnesia();
  452. ClearBoard();
  453. GetBoardX(0);
  454. DrawBoard();
  455.  
  456. GetMoves();
  457.  
  458. free(Boards);
  459. free(Halves);
  460. free(Groups);
  461. free(Pieces);
  462.  
  463. return;
  464. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement