//Kollar om ett drag är tillåtet för en springare public override Boolean isValidMove(Move move) { if(Math.Abs(move.gettoX() - move.getfromX()) == Math.Abs(move.gettoY() - move.getfromY())) { return true; }else if (move.gettoX() - move.getfromX() == move.getfromY() - move.gettoY()) { return true; } return false; }
//Kollar om draget är godkänt för en häst public override Boolean isValidMove(Move move) { if(move.getfromY() - move.gettoY() == 2 || move.getfromY() - move.gettoY() == -2) { if(move.getfromX() - move.gettoX() == 1 || move.getfromX() - move.gettoX() == -1) { return true; } } if (move.getfromX() - move.gettoX() == 2 || move.getfromX() - move.gettoX() == -2) { if (move.getfromY() - move.gettoY() == 1 || move.getfromY() - move.gettoY() == -1) { return true; } } return false; }
//Kollar om ett drag är godkänt för en kung public override Boolean isValidMove(Move move) { if (move.gettoY() - move.getfromY() == 1 && (move.gettoX() - move.getfromX() == 1 || move.gettoX() - move.getfromX() == -1 || move.gettoX() == move.getfromX())) { return true; } else if (move.gettoY() - move.getfromY() == -1 && (move.gettoX() - move.getfromX() == 1 || move.gettoX() - move.getfromX() == -1 || move.gettoX() == move.getfromX())) { return true; } else if ((move.gettoX() - move.getfromX() == 1 || move.gettoX() - move.getfromX() == -1) && (move.gettoY() - move.getfromY() == 0 )) { return true; } else { return false; } }
//Kollar om det är ett tillåtet drag public bool isValid(Move move, String gameStatus, ChessPiece[,] currentBoard) { if (board.colourOfPiece(move, currentBoard) == gameStatus) { if (currentBoard[move.getfromX(), move.getfromY()].isValidMove(move) && isLeagalMove(move, currentBoard)) { if (isCheck(move, gameStatus)) { return false; } return true; } else { return false; } } return false; }
//Kollar om ett diagonalt drag är godkänt public bool checkDiagonal(Move move, ChessPiece[,] currentBoard) { if (move.getfromX() < move.gettoX() && move.getfromY() < move.gettoY()) //x och y ökar { int y = move.getfromY() + 1; for (int x = move.getfromX() + 1; x <= move.gettoX(); x++) { if (y < 8) { if (currentBoard[x, y] != null) //om någon pjäs står i vägen { if (x == move.gettoX() && y == move.gettoY()) //pjäsen har nått sitt mål { if (board.squareStatus(move, currentBoard) == 2)//Pjäsen har eliminerat en motståndare { return true; } } return false; } } y++; } return true; } if (move.getfromX() > move.gettoX() && move.getfromY() > move.gettoY()) //x och y minskar { int y = move.getfromY() - 1; for (int x = move.getfromX() - 1; x >= move.gettoX(); x--) { if (y < 8) { if (currentBoard[x, y] != null)//om någon pjäs står i vägen { if (x == move.gettoX() && y == move.gettoY()) //pjäsen har nått sitt mål { if (board.squareStatus(move, currentBoard) == 2)//Pjäsen har eliminerat en motståndare { return true; } } return false; } } y--; } return true; } if (move.getfromX() < move.gettoX() && move.getfromY() > move.gettoY()) //x ökar, y minskar { int y = move.getfromY() - 1; for (int x = move.getfromX() + 1; x <= move.gettoX(); x++) { if (y < 8) { if (currentBoard[x, y] != null)//om någon pjäs står i vägen { if (x == move.gettoX() && y == move.gettoY()) //pjäsen har nått sitt mål { if (board.squareStatus(move, currentBoard) == 2)//Pjäsen har eliminerat en motståndare { return true; } } return false; } } y--; } return true; } if (move.getfromX() > move.gettoX() && move.getfromY() < move.gettoY()) //x minskar, y ökar, alltid här { int y = move.getfromY() + 1; for (int x = move.getfromX() - 1; x >= move.gettoX(); x--) { if (y < 8) { if (currentBoard[x, y] != null)//om någon pjäs står i vägen { if (x == move.gettoX() && y == move.gettoY()) //pjäsen har nått sitt mål { if (board.squareStatus(move, currentBoard) == 2)//Pjäsen har eliminerat en motståndare { return true; } } return false; } } y++; } return true; } return false; }
//Kollar om draget är tillåtet enligt reglerna public bool isLeagalMove(Move move, ChessPiece[,] currentBoard) { ChessPiece current = currentBoard[move.getfromX(), move.getfromY()]; if (current is Horse) { if (board.squareStatus(move, currentBoard) == 1)//En av spelarens egna pjäser står i vägen { return false; } return true; } else if (current is Farmer) { if ((move.getfromX() != move.gettoX() && board.squareStatus(move, currentBoard) == 2) || (move.gettoX() == move.getfromX() && board.squareStatus(move, currentBoard) == 3)) //bonden har tagit en enemy på sidan eller gått rak fram och inte träffat på ngn pjäs { return true; } return false; } else { if (move.isHorizontal() == true) { return checkHorizontal(move, currentBoard); } if (move.isVertical() == true) { return checkVertical(move, currentBoard); } if (move.isDiagonal() == true) { return checkDiagonal(move, currentBoard); } return false; } }
//kollar om kungen står i check public bool isCheck(Move move, String gamestatus) { ChessPiece[,] temp = board.getCopy();//kopierar bordet //Uppdatera temporärt bord, som det kommer se ut om movet skulle gå igenom: temp[move.gettoX(), move.gettoY()] = temp[move.getfromX(), move.getfromY()]; temp[move.getfromX(), move.getfromY()] = null; //Hämta kungens position ChessPiece king = board.getKingFromBoard(temp, gamestatus); //loopa över nya brädet: for (int x = 0; x <= 7; x++) { for (int y = 0; y <= 7; y++) { //om vi hittar en pjäs: if (temp[x, y] != null) { ChessPiece temp2 = temp[x, y]; //Om det är motståndarens pjäs if (temp2.Color != gamestatus) { Move checkMove = new Move(x, y, king.posX, king.posY);//move tar motståndarens position mot spelarens egen kung if (temp2.isValidMove(checkMove) && isLeagalMove(checkMove, temp))//om det går igenom har man satt sin egen kung i shack { return true; } } } } } return false; }
//Kollar om ett vertikalt drag är tillåtet public bool checkVertical(Move move, ChessPiece[,] currentBoard) { //kolla om det går att hoppa över skaer if (move.getfromY() < move.gettoY()) { for (int y = move.getfromY() + 1; y <= move.gettoY(); y++) { if (currentBoard[move.getfromX(), y] != null) { if (y == move.gettoY() && board.squareStatus(move, currentBoard) != 1) { return true; } return false; } } return true; } else if (move.getfromY() > move.gettoY()) { for (int y = move.getfromY() - 1; y >= move.gettoY(); y--) { if (currentBoard[move.getfromX(), y] != null) { if (y == move.gettoY() && (board.squareStatus(move, currentBoard) != 1)) { return true; } return false; } } return true; } return false; }
//Kollar om ett horisontellt drag är tillåtet public bool checkHorizontal(Move move, ChessPiece[,] currentBoard) { if (move.getfromX() < move.gettoX()) { for (int x = move.getfromX() + 1; x <= move.gettoX(); x++) { if (currentBoard[x, move.getfromY()] != null) { if (x == move.gettoX() && board.squareStatus(move, currentBoard) != 1) { return true; } return false; } } return true; } if (move.getfromX() > move.gettoX()) { for (int x = move.getfromX() - 1; x >= move.gettoX(); x--) { if (currentBoard[x, move.getfromY()] != null) { if (x == move.gettoX() && board.squareStatus(move, currentBoard) != 1) { return true; } return false; } } return true; } return false; }
//Updaterar brädet (arrayen) efter att ett drag genomförts public void updateTable(Move move) { board[move.gettoX(), move.gettoY()] = board[move.getfromX(), move.getfromY()]; board[move.getfromX(), move.getfromY()] = null; board[move.gettoX(), move.gettoY()].posX = move.gettoX(); board[move.gettoX(), move.gettoY()].posY = move.gettoY(); }
//1. Egen pjäs //2. Motståndares pjäs //3. Tom ruta public int squareStatus(Move move, ChessPiece[,] currentBoard) { if (currentBoard[move.gettoX(), move.gettoY()] != null) { ChessPiece p1 = currentBoard[move.getfromX(), move.getfromY()]; ChessPiece p2 = currentBoard[move.gettoX(), move.gettoY()]; if (p1.Color == p2.Color) { return 1; } else { return 2; } } return 3; }
//Returnerar färgen på pjäsen som flyttas public string colourOfPiece(Move move, ChessPiece[,] currentBoard) { if (currentBoard[move.getfromX(), move.getfromY()] != null) { return currentBoard[move.getfromX(), move.getfromY()].Color; } else return ""; }