Advertisement
Synthetics

Chess

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