Advertisement
Infernale

Chess

Dec 8th, 2018
427
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.81 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <ctype.h>
  3. char board[8][9];
  4. bool flag[8][8];
  5.  
  6. void resetBoard(){ //Fungsi untuk reset board tiap case baru
  7.     for(int i=0;i<8;i++){
  8.         for(int j=0;j<8;j++){
  9.             flag[i][j] = false;
  10.         }
  11.     }
  12. }
  13. bool checkEnemy(int x, int y){ //Fungsi cek itu musuh/bukan
  14.     if(x>7 || x<0 || y>7 || y<0){ //Cek apakah keluar batas
  15.         return false;
  16.     }
  17.     if(islower(board[x][y])){ //Kalo huruf kecil = musuh
  18.         flag[x][y] = true; //Tandain boardnya yg ada musuh yg bisa kita serang
  19.         return true;
  20.     }
  21.     return false; //return false kalo dia gk ada apa"
  22. }
  23. void knightMoves(int x, int y){ //Fungsi untuk kuda, ada 8 titik hitung manual jadinya langsung panggil func 8x
  24.     //bawah
  25.     checkEnemy(x+1, y-2);
  26.     checkEnemy(x+1, y+2);
  27.     checkEnemy(x+2, y-1);
  28.     checkEnemy(x+2, y+1);
  29.     //atas
  30.     checkEnemy(x-1, y-2);
  31.     checkEnemy(x-1, y+2);
  32.     checkEnemy(x-2, y-1);
  33.     checkEnemy(x-2, y+1);
  34. }
  35. void kingMoves(int x, int y){ //Fungsi untuk raja
  36.     for(int i=x-1;i<=x+1;i++){ //Bentuk array 2d 3x3 dengan titik tengah posisi raja
  37.         for(int j=y-1;j<=y+1;j++){
  38.             checkEnemy(i, j);
  39.         }
  40.     }
  41. }
  42. void bishopMoves(int x, int y){
  43.     for(int i=x-1, j=y-1;i>=0 && j>=0;i--,j--){ //Diagonal kiri atas
  44.         if(isupper(board[i][j])){ //Break kalo ketemu temen, karna kehalang langsung gk bisa lanjut
  45.             break;
  46.         }
  47.         if(checkEnemy(i, j)){
  48.             break;
  49.         }
  50.     }
  51.     for(int i=x-1, j=y+1;i>=0 && j<8;i--,j++){ //Diagonal kanan atas
  52.         if(isupper(board[i][j])){
  53.             break;
  54.         }
  55.         if(checkEnemy(i, j)){
  56.             break;
  57.         }
  58.     }
  59.     for(int i=x+1, j=y-1;i<8 && j>=0;i++,j--){ //Diagonal kiri bawah
  60.         if(isupper(board[i][j])){
  61.             break;
  62.         }
  63.         if(checkEnemy(i, j)){
  64.             break;
  65.         }
  66.     }
  67.     for(int i=x+1, j=y+1;i<8 && j<8;i++,j++){ //Diagonal kanan bawah
  68.         if(isupper(board[i][j])){
  69.             break;
  70.         }
  71.         if(checkEnemy(i, j)){
  72.             break;
  73.         }
  74.     }
  75. }
  76. void pawnMoves(int x, int y){ //Fungsi untuk pion
  77.     checkEnemy(x-1, y-1); //Cek diagonal kiri atas
  78.     checkEnemy(x-1, y+1); //Cek diagonal kanan atas
  79. }
  80. void rookMoves(int x, int y){
  81.     for(int i=y-1;i>=0;i--){ //Geser kiri ampe mentok
  82.         if(isupper(board[x][i])){
  83.             break;
  84.         }
  85.         if(checkEnemy(x, i)){
  86.             break;
  87.         }
  88.     }
  89.     for(int i=y+1;i<8;i++){ //Geser kanan ampe mentok
  90.         if(isupper(board[x][i])){
  91.             break;
  92.         }
  93.         if(checkEnemy(x, i)){
  94.             break;
  95.         }
  96.     }
  97.     for(int i=x-1;i>=0;i--){ //Geser atas ampe mentok
  98.         if(isupper(board[i][y])){
  99.             break;
  100.         }
  101.         if(checkEnemy(i, y)){
  102.             break;
  103.         }              
  104.     }
  105.     for(int i=x+1;i<8;i++){ //Geser bawah mentok
  106.         if(isupper(board[i][y])){
  107.             break;
  108.         }
  109.         if(checkEnemy(i, y)){
  110.             break;
  111.         }
  112.     }  
  113. }
  114.  
  115. void findEnemy(int x, int y, char k){
  116.     switch(k){
  117.         case 'P':
  118.             pawnMoves(x, y);
  119.             break;
  120.         case 'R':
  121.             rookMoves(x, y);
  122.             break;
  123.         case 'B':
  124.             bishopMoves(x, y);
  125.             break;
  126.         case 'N':
  127.             knightMoves(x, y);
  128.             break;
  129.         case 'Q': //Panggil 3 function karena movesnya si ratu terdiri atas move yg bisa dilakukan 3 karakter
  130.             rookMoves(x, y);
  131.             bishopMoves(x, y);
  132.             break;
  133.         case 'K':
  134.             kingMoves(x, y);
  135.             break;
  136.     }
  137. }
  138.  
  139. int main(){
  140.     int tc;
  141.     scanf("%d", &tc);
  142.     for(int i=1;i<=tc;i++){
  143.         bool check;
  144.         resetBoard();
  145.         for(int j=0;j<8;j++){ //Isi array 2d dengan boardnya
  146.             getchar();
  147.             scanf("%[^\n]", board[j]);
  148.         }
  149.         for(int j=0;j<8;j++){ //Loop array 2d buat nyari musuh
  150.             for(int k=0;k<8;k++){
  151.                 if(isupper(board[j][k])){ //Kalo ketemu huruf besar berarti punya kita, kita cek musuh apa aja yg bisa dimakan
  152.                     findEnemy(j, k, board[j][k]); //Sama karakter dititik itu
  153.                 }
  154.             }
  155.         }
  156.         printf("Case #%d:\n", i);
  157.         for(int j=0;j<8;j++){ // Loop untuk print keluar titik yang bisa diserang
  158.             for(int k=0;k<8;k++){
  159.                 if(flag[j][k]){
  160.                     check = true; //check untuk nandain kalo ada yg bisa diserang, kalo ampe ujung gk ada berarti false, print -1
  161.                     printf("%c %d\n", 65+k, 8-j);
  162.                 }
  163.             }
  164.         }
  165.         if(!check){
  166.             printf("-1\n");
  167.         }
  168.     }
  169.     return 0;
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement