Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <ctype.h>
- char board[8][9];
- bool flag[8][8];
- void resetBoard(){ //Fungsi untuk reset board tiap case baru
- for(int i=0;i<8;i++){
- for(int j=0;j<8;j++){
- flag[i][j] = false;
- }
- }
- }
- bool checkEnemy(int x, int y){ //Fungsi cek itu musuh/bukan
- if(x>7 || x<0 || y>7 || y<0){ //Cek apakah keluar batas
- return false;
- }
- if(islower(board[x][y])){ //Kalo huruf kecil = musuh
- flag[x][y] = true; //Tandain boardnya yg ada musuh yg bisa kita serang
- return true;
- }
- return false; //return false kalo dia gk ada apa"
- }
- void knightMoves(int x, int y){ //Fungsi untuk kuda, ada 8 titik hitung manual jadinya langsung panggil func 8x
- //bawah
- checkEnemy(x+1, y-2);
- checkEnemy(x+1, y+2);
- checkEnemy(x+2, y-1);
- checkEnemy(x+2, y+1);
- //atas
- checkEnemy(x-1, y-2);
- checkEnemy(x-1, y+2);
- checkEnemy(x-2, y-1);
- checkEnemy(x-2, y+1);
- }
- void kingMoves(int x, int y){ //Fungsi untuk raja
- for(int i=x-1;i<=x+1;i++){ //Bentuk array 2d 3x3 dengan titik tengah posisi raja
- for(int j=y-1;j<=y+1;j++){
- checkEnemy(i, j);
- }
- }
- }
- void bishopMoves(int x, int y){
- for(int i=x-1, j=y-1;i>=0 && j>=0;i--,j--){ //Diagonal kiri atas
- if(isupper(board[i][j])){ //Break kalo ketemu temen, karna kehalang langsung gk bisa lanjut
- break;
- }
- if(checkEnemy(i, j)){
- break;
- }
- }
- for(int i=x-1, j=y+1;i>=0 && j<8;i--,j++){ //Diagonal kanan atas
- if(isupper(board[i][j])){
- break;
- }
- if(checkEnemy(i, j)){
- break;
- }
- }
- for(int i=x+1, j=y-1;i<8 && j>=0;i++,j--){ //Diagonal kiri bawah
- if(isupper(board[i][j])){
- break;
- }
- if(checkEnemy(i, j)){
- break;
- }
- }
- for(int i=x+1, j=y+1;i<8 && j<8;i++,j++){ //Diagonal kanan bawah
- if(isupper(board[i][j])){
- break;
- }
- if(checkEnemy(i, j)){
- break;
- }
- }
- }
- void pawnMoves(int x, int y){ //Fungsi untuk pion
- checkEnemy(x-1, y-1); //Cek diagonal kiri atas
- checkEnemy(x-1, y+1); //Cek diagonal kanan atas
- }
- void rookMoves(int x, int y){
- for(int i=y-1;i>=0;i--){ //Geser kiri ampe mentok
- if(isupper(board[x][i])){
- break;
- }
- if(checkEnemy(x, i)){
- break;
- }
- }
- for(int i=y+1;i<8;i++){ //Geser kanan ampe mentok
- if(isupper(board[x][i])){
- break;
- }
- if(checkEnemy(x, i)){
- break;
- }
- }
- for(int i=x-1;i>=0;i--){ //Geser atas ampe mentok
- if(isupper(board[i][y])){
- break;
- }
- if(checkEnemy(i, y)){
- break;
- }
- }
- for(int i=x+1;i<8;i++){ //Geser bawah mentok
- if(isupper(board[i][y])){
- break;
- }
- if(checkEnemy(i, y)){
- break;
- }
- }
- }
- void findEnemy(int x, int y, char k){
- switch(k){
- case 'P':
- pawnMoves(x, y);
- break;
- case 'R':
- rookMoves(x, y);
- break;
- case 'B':
- bishopMoves(x, y);
- break;
- case 'N':
- knightMoves(x, y);
- break;
- case 'Q': //Panggil 3 function karena movesnya si ratu terdiri atas move yg bisa dilakukan 3 karakter
- rookMoves(x, y);
- bishopMoves(x, y);
- break;
- case 'K':
- kingMoves(x, y);
- break;
- }
- }
- int main(){
- int tc;
- scanf("%d", &tc);
- for(int i=1;i<=tc;i++){
- bool check;
- resetBoard();
- for(int j=0;j<8;j++){ //Isi array 2d dengan boardnya
- getchar();
- scanf("%[^\n]", board[j]);
- }
- for(int j=0;j<8;j++){ //Loop array 2d buat nyari musuh
- for(int k=0;k<8;k++){
- if(isupper(board[j][k])){ //Kalo ketemu huruf besar berarti punya kita, kita cek musuh apa aja yg bisa dimakan
- findEnemy(j, k, board[j][k]); //Sama karakter dititik itu
- }
- }
- }
- printf("Case #%d:\n", i);
- for(int j=0;j<8;j++){ // Loop untuk print keluar titik yang bisa diserang
- for(int k=0;k<8;k++){
- if(flag[j][k]){
- check = true; //check untuk nandain kalo ada yg bisa diserang, kalo ampe ujung gk ada berarti false, print -1
- printf("%c %d\n", 65+k, 8-j);
- }
- }
- }
- if(!check){
- printf("-1\n");
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement