Advertisement
anas_harby

Untitled

Dec 16th, 2015
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 15.50 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. char BWBoard[8][8];
  7. char piecesBoard[8][8] = {{'R','N','B','K','Q','B','N','R'}, {'P','P','P','P','P','P','P','P'},{},{},{},{},{'p','p','p','p','p','p','p','p'},{'r','n','b','k','q','b','n','r'}};
  8. char board[10][10];
  9. int turn=1, capturedBlack[16], capturedWhite[16], countBlack=0, countWhite=0;
  10.  
  11. void initializeBW();
  12. void userInput();
  13. void move(int iCurrent, int iDestination, int jCurrent, int jDestination);
  14. void printBoard();
  15. void capture(int iCurrent, int iDestination, int jCurrent, int jDestination);
  16. int validate(int iCurrent, int iDestination, int jCurrent, int jDestination);
  17. void printErrors(int, int, int, int, int);
  18.  
  19. int pawn(int iCurrent, int iDestination, int jCurrent, int jDestination);
  20. int knight(int iCurrent, int iDestination, int jCurrent, int jDestination);
  21. int rook(int iCurrent, int iDestination, int jCurrent, int jDestination);
  22. int bishop(int iCurrent, int iDestination, int jCurrent, int jDestination);
  23. int queen(int iCurrent, int iDestination, int jCurrent, int jDestination);
  24. int king(int iCurrent, int iDestination, int jCurrent, int jDestination);
  25.  
  26. int iBlackKing=0, iWhiteKing=7, jBlackKing=3, jWhiteKing=3;
  27. int checkerPieces[], checksCount;
  28. void check();
  29.  
  30.  
  31. int main()
  32. {
  33. initializeBW();
  34. while(1)
  35. {
  36. printBoard();
  37. userInput();
  38. printf("\n");
  39.  
  40. }
  41. }
  42.  
  43.  
  44. void initializeBW ()
  45. {
  46. char c1 = '.', c2= '_';
  47. for(int i=0; i<8; i++)
  48. {
  49. for(int j=0; j<8; j+=2)
  50. {
  51. BWBoard[i][j] = c1;
  52. BWBoard[i][j+1] = c2;
  53. }
  54. char temp = c1;
  55. c1 = c2;
  56. c2 = temp;
  57. }
  58. }
  59.  
  60. void userInput()
  61. {
  62.  
  63. char inp[10];
  64. gets(inp);
  65. while(strlen(inp)!=4)
  66. {
  67. printf("Invalid Input!\n");
  68. gets(inp);
  69. }
  70. int iCurrent, iDestination, jCurrent, jDestination;
  71. jCurrent = (int)inp[0] - (int)'A';
  72. iCurrent = (int)inp[1] - (int)'0';
  73. jDestination = (int)inp[2] - (int)'A';
  74. iDestination = (int)inp[3] - (int)'0';
  75. iDestination = 8 - iDestination;
  76. iCurrent = 8 - iCurrent;
  77. if(validate(iCurrent, iDestination, jCurrent, jDestination)!=0)
  78. {
  79. printErrors(validate(iCurrent, iDestination, jCurrent, jDestination), iCurrent, iDestination, jCurrent, jDestination);
  80. userInput();
  81.  
  82. }
  83. else
  84. {
  85. capture(iCurrent, iDestination, jCurrent, jDestination);
  86. move(iCurrent, iDestination, jCurrent, jDestination);
  87. }
  88. }
  89.  
  90.  
  91. void move(int iCurrent, int iDestination, int jCurrent, int jDestination)
  92. {
  93.  
  94. piecesBoard[iDestination][jDestination] = piecesBoard[iCurrent][jCurrent];
  95. piecesBoard[iCurrent][jCurrent]='\0';
  96. check();
  97. turn++;
  98. }
  99.  
  100. void printBoard()
  101. {
  102. board[0][0] = ' ', board[0][9] = ' ', board[9][0] = ' ', board[9][9] = ' ';
  103. for(int i=1; i<9; i++)
  104. {
  105. board[i][0] = 9-i;
  106. board[i][9]= 9-i;
  107. board[0][i] = 'A' +i-1;
  108. board[9][i] = 'A' +i-1;
  109.  
  110. }
  111.  
  112. for(int i=0; i<10; i++)
  113. {
  114. for(int j=0; j<10; j++)
  115. {
  116. if((board[i][j]>='A' && board[i][j] <= 'Z') || board[i][j]==' ')
  117. printf("%c\t", board[i][j]);
  118. else if((i>=1 && i<=8) && (j>=1 && j<=8))
  119. {
  120. if((piecesBoard[i-1][j-1]>='A' && piecesBoard[i-1][j-1]<='Z') || (piecesBoard[i-1][j-1]>='a' && piecesBoard[i-1][j-1]<='z'))
  121. printf("%c\t", piecesBoard[i-1][j-1]);
  122. else
  123. printf("%c\t", BWBoard[i-1][j-1]);
  124. }
  125. else
  126. printf("%d\t", (char)board[i][j]);
  127. }
  128. if(i==0||i==8)
  129. printf("\n\n\n");
  130. else
  131. printf("\n\n");
  132. }
  133. printf("\n\n\n");
  134. }
  135.  
  136.  
  137. int validate(int iCurrent, int iDestination, int jCurrent, int jDestination)
  138. {
  139. if ((jCurrent<0) || (jCurrent>7) || (jDestination<0) || (jDestination>7) || (iCurrent<0) || (iCurrent>7) || (iDestination<0) || (iDestination>7))
  140. {
  141. return 1;
  142. }
  143.  
  144. else if(turn%2!=0 && (piecesBoard[iCurrent][jCurrent]>='A' && piecesBoard[iCurrent][jCurrent]<='Z'))
  145. {
  146.  
  147. return 2;
  148. }
  149.  
  150. else if(turn%2==0 && (piecesBoard[iCurrent][jCurrent]>='a' && piecesBoard[iCurrent][jCurrent]<='z'))
  151. {
  152.  
  153. return 3;
  154. }
  155.  
  156. else if(piecesBoard[iCurrent][jCurrent]==0)
  157. {
  158.  
  159. return 4;
  160. }
  161.  
  162. else if(((piecesBoard[iCurrent][jCurrent]=='r')||(piecesBoard[iCurrent][jCurrent]=='R')) && (rook(iCurrent, iDestination, jCurrent, jDestination)==1))
  163. {
  164.  
  165. return 5;
  166. }
  167.  
  168. else if(((piecesBoard[iCurrent][jCurrent]=='p')||(piecesBoard[iCurrent][jCurrent]=='P')) && (pawn(iCurrent, iDestination, jCurrent, jDestination)==1))
  169. {
  170.  
  171. return 5;
  172. }
  173.  
  174. else if(((piecesBoard[iCurrent][jCurrent]=='b')||(piecesBoard[iCurrent][jCurrent]=='B')) && (bishop(iCurrent, iDestination, jCurrent, jDestination)==1))
  175. {
  176.  
  177. return 5;
  178. }
  179.  
  180. else if(((piecesBoard[iCurrent][jCurrent]=='q')||(piecesBoard[iCurrent][jCurrent]=='Q')) && (queen(iCurrent, iDestination, jCurrent, jDestination)==1))
  181. {
  182.  
  183. return 5;
  184. }
  185.  
  186. else if(((piecesBoard[iCurrent][jCurrent]=='k')||(piecesBoard[iCurrent][jCurrent]=='K')) && (king(iCurrent, iDestination, jCurrent, jDestination)==1))
  187. {
  188.  
  189. return 5;
  190. }
  191.  
  192. else if(((piecesBoard[iCurrent][jCurrent]=='n')||(piecesBoard[iCurrent][jCurrent]=='N')) && (knight(iCurrent, iDestination, jCurrent, jDestination)==1))
  193. {
  194.  
  195. return 5;
  196. }
  197.  
  198.  
  199. else
  200. return 0;
  201. }
  202.  
  203.  
  204. void capture(int iCurrent, int iDestination, int jCurrent, int jDestination)
  205. {
  206. if(piecesBoard[iDestination][jDestination]>='a' && piecesBoard[iDestination][jDestination]<='z')
  207. {
  208. capturedWhite[countWhite] = piecesBoard[iDestination][jDestination];
  209. countWhite++;
  210. }
  211. else if(piecesBoard[iDestination][jDestination]>='A' && piecesBoard[iDestination][jDestination]<='Z')
  212. {
  213. capturedBlack[countBlack] = piecesBoard[iDestination][jDestination];
  214. countBlack++;
  215. }
  216. system("cls");
  217. printf("\nCaptured White Pieces: ");
  218. for(int i=0; i<countWhite; i++)
  219. printf("%c ", capturedWhite[i]);
  220. printf("\nCaptured Black Pieces: ");
  221. for(int i=0; i<countBlack; i++)
  222. printf("%c ", capturedBlack[i]);
  223. printf("\n\n");
  224. }
  225.  
  226.  
  227.  
  228.  
  229. int rook(int iCurrent, int iDestination, int jCurrent, int jDestination)
  230. {
  231. int count,flag=0;
  232. if((jCurrent==jDestination) && (iCurrent!= iDestination))
  233. {
  234. if (iDestination>iCurrent)
  235. {
  236. for (count=1; (((iCurrent+count)<iDestination)&&flag==0); count++)
  237. {
  238. if (piecesBoard[iCurrent+count][jCurrent]=='\0')
  239. {
  240. flag=0 ;
  241. }
  242. else
  243. {
  244. flag=1;
  245. }
  246. }
  247. }
  248. else
  249. {
  250. for(count=1; (((iCurrent-count)>iDestination)&&flag==0); count++)
  251. {
  252. if (piecesBoard[iCurrent-count][jCurrent]=='\0')
  253. {
  254. flag=0;
  255. }
  256. else
  257. {
  258. flag=1;
  259. }
  260. }
  261. }
  262. if (flag==0)
  263. {
  264. return 0;
  265. }
  266. else
  267. {
  268. return 1;
  269. }
  270. }
  271. else if((jCurrent!=jDestination) && (iCurrent==iDestination))
  272. {
  273. if (jDestination>jCurrent)
  274. {
  275. for (count=1; (((jCurrent+count)<jDestination)&&flag==0); count++)
  276. {
  277. if (piecesBoard[iCurrent][jCurrent+count]=='\0')
  278. {
  279. flag=0;
  280. }
  281. else
  282. {
  283. flag=1;
  284. }
  285. }
  286. }
  287. else
  288. {
  289. for (count=1; (jCurrent-count)>jDestination; count++)
  290. {
  291. if (piecesBoard[iCurrent][jCurrent-count]=='\0')
  292. {
  293. flag=0;
  294. }
  295. else
  296. {
  297. flag=1;
  298. }
  299. }
  300. }
  301. if (flag==0)
  302. {
  303. return 0;
  304. }
  305. else
  306. {
  307. return 1;
  308. }
  309. }
  310. else
  311. {
  312. return 1;
  313. }
  314. }
  315.  
  316.  
  317. int king(int iCurrent,int iDestination,int jCurrent,int jDestination)
  318. {
  319. int iDiff,jDiff;
  320. iDiff=iCurrent-iDestination;
  321. jDiff=jCurrent-jDestination;
  322. if (((iCurrent == iDestination) && (abs(jDiff)==1)) ||((jCurrent==jDestination) && (abs(iDiff)==1)))
  323. {
  324. if(piecesBoard[iCurrent][jCurrent]=='k')
  325. {
  326. iWhiteKing = iDestination;
  327. jWhiteKing = jDestination;
  328.  
  329. }
  330. else if(piecesBoard[iCurrent][jCurrent]=='K')
  331. {
  332. iBlackKing = iDestination;
  333. jBlackKing = jDestination;
  334. }
  335. return 0;
  336. }
  337. else
  338. {
  339. return 1;
  340. }
  341. }
  342. int bishop(int iCurrent,int iDestination,int jCurrent,int jDestination)
  343. {
  344. int iDiff,jDiff;
  345. int count=1,flag=0;
  346. iDiff=iDestination-iCurrent;
  347. jDiff=jDestination-jCurrent;
  348. int DeciCurrent,InciCurrent,DecjCurrent,IncjCurrent;
  349.  
  350. if (abs(iDiff)==abs(jDiff))
  351. {
  352. if (iDestination>iCurrent)
  353. {
  354. count=1;
  355. do
  356. {
  357. DecjCurrent=jCurrent-count;
  358. IncjCurrent=jCurrent+count;
  359. InciCurrent=iCurrent+count;
  360. if (InciCurrent<iDestination)
  361. {
  362. if (jDestination<jCurrent)
  363. {
  364. if (piecesBoard[InciCurrent][DecjCurrent]=='\0')
  365. {
  366. flag=0;
  367. }
  368. else
  369. {
  370. flag=1;
  371. }
  372.  
  373. }
  374. else if (jDestination>jCurrent)
  375. {
  376. if (piecesBoard[InciCurrent][IncjCurrent]=='\0')
  377. {
  378. flag=0;
  379. }
  380. else
  381. {
  382. flag=1;
  383. }
  384. }
  385. count++;
  386. }
  387. }
  388. while ((InciCurrent<iDestination) && (flag==0));
  389. if (flag==0)
  390. {
  391. return 0;
  392. }
  393. else
  394. {
  395. return 1;
  396. }
  397. }
  398.  
  399. else
  400. {
  401. count=1;
  402. do
  403. {
  404. DeciCurrent=iCurrent-count;
  405. DecjCurrent=jCurrent-count;
  406. IncjCurrent=jCurrent+count;
  407. if (DeciCurrent>iDestination)
  408. {
  409. if (jDestination<jCurrent)
  410. {
  411.  
  412. if (piecesBoard[DeciCurrent][DecjCurrent]=='\0')
  413. {
  414. flag=0;
  415. }
  416. else
  417. {
  418. flag=1;
  419. }
  420. }
  421. else if (jDestination>jCurrent)
  422. {
  423. if (piecesBoard[DeciCurrent][IncjCurrent]=='\0')
  424. {
  425. flag=0;
  426. }
  427. else
  428. {
  429. flag=1;
  430. }
  431. }
  432. count++;
  433.  
  434. }
  435. }
  436. while ((DeciCurrent>iDestination) && (flag==0));
  437.  
  438. if (flag==0)
  439. {
  440. return 0;
  441. }
  442. else
  443. {
  444. return 1;
  445. }
  446. }
  447.  
  448.  
  449. }
  450. else
  451. {
  452. return 1;
  453. }
  454.  
  455. }
  456.  
  457. int pawn(int iCurrent, int iDestination, int jCurrent, int jDestination)
  458. {
  459.  
  460. if(piecesBoard[iCurrent][jCurrent]=='p' && (jDestination==jCurrent) && (iDestination-iCurrent==-1))
  461. {
  462. if (piecesBoard[iDestination][jDestination]!='\0')
  463. {
  464. return 1;
  465. }
  466. else
  467. {
  468. return 0;
  469. }
  470. }
  471.  
  472. else if(piecesBoard[iCurrent][jCurrent]=='P' && (jDestination==jCurrent) && (iDestination-iCurrent==1))
  473. {
  474. if (piecesBoard[iDestination][jDestination]!='\0')
  475. {
  476. return 1;
  477. }
  478. else
  479. {
  480. return 0;
  481. }
  482. }
  483.  
  484. else if(piecesBoard[iCurrent][jCurrent]=='p' && iDestination-iCurrent==-1 && abs(jDestination-jCurrent)==1 && piecesBoard[iDestination][jDestination]>='A' && piecesBoard[iDestination][jDestination]<='Z')
  485. return 0;
  486.  
  487. else if(piecesBoard[iCurrent][jCurrent]=='P' && iDestination-iCurrent==1 && abs(jDestination-jCurrent)==1 && piecesBoard[iDestination][jDestination]>='a' && piecesBoard[iDestination][jDestination]<='z')
  488. return 0;
  489.  
  490. else if(piecesBoard[iCurrent][jCurrent]=='p' && iCurrent==6 && jCurrent==jDestination && (iDestination-iCurrent==-1 || iDestination-iCurrent==-2))
  491. return 0;
  492.  
  493. else if(piecesBoard[iCurrent][jCurrent]=='P' && iCurrent==1 && jCurrent==jDestination && (iDestination-iCurrent==1 || iDestination-iCurrent==2))
  494. return 0;
  495.  
  496. else
  497. return 1;
  498.  
  499. }
  500.  
  501.  
  502.  
  503. int queen(int iCurrent,int iDestination,int jCurrent,int jDestination)
  504. {
  505. int iDiff,jDiff;
  506. iDiff=iDestination-iCurrent;
  507. jDiff=jDestination-jCurrent;
  508.  
  509. if(((iDestination == iCurrent && jDestination != jCurrent) || (iDestination != iCurrent && jDestination == jCurrent))&& rook(iCurrent,iDestination,jCurrent,jDestination)==0)
  510.  
  511. return 0;
  512.  
  513.  
  514. else if (abs(iDiff)==abs(jDiff) && bishop(iCurrent, iDestination, jCurrent, jDestination)==0)
  515.  
  516. return 0;
  517.  
  518. else
  519.  
  520. return 1;
  521.  
  522. }
  523.  
  524. int knight(int iCurrent,int iDestination,int jCurrent,int jDestination)
  525. {
  526. int iDiff,jDiff;
  527. iDiff=iDestination-iCurrent;
  528. jDiff=jDestination-jCurrent;
  529. if ((abs(iDiff)==2) && (abs(jDiff)==1))
  530.  
  531. return 0;
  532.  
  533. else if ((abs(jDiff)==2) && (abs(iDiff)==1))
  534.  
  535. return 0;
  536.  
  537. else
  538.  
  539. return 1;
  540.  
  541. }
  542.  
  543.  
  544. void check()
  545. {
  546. checksCount=0;
  547. for(int i=0; i<8; i++)
  548. {
  549. for(int j=0; j<8; j++)
  550. {
  551. if(turn%2==1)
  552. {
  553. if(validate(i, iBlackKing, j, jBlackKing)==0)
  554. {
  555. checkerPieces[checksCount] = i*10 +j;
  556. checksCount++;
  557. }
  558. }
  559.  
  560. else if(turn%2==0)
  561. {
  562. if(validate(i, iWhiteKing, j, jWhiteKing)==0)
  563. {
  564. checkerPieces[checksCount] = i*10 +j;
  565. checksCount++;
  566. }
  567. }
  568. }
  569. }
  570.  
  571. }
  572.  
  573.  
  574. void printErrors(int f, int iCurrent, int iDestination, int jCurrent, int jDestination)
  575. {
  576. f = validate(iCurrent, iDestination, jCurrent, jDestination);
  577. switch(f)
  578. {
  579. case 0:
  580. break;
  581.  
  582. case 1:
  583. printf("Invalid Input!\n");
  584. break;
  585. case 2:
  586. printf("White Pieces Turn!\n");
  587. break;
  588. case 3:
  589. printf("Black Pieces Turn!\n");
  590. break;
  591. case 4:
  592. printf("Empty Position!\n");
  593. break;
  594. case 5:
  595. printf("Wrong Move!\n");
  596. }
  597. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement