Chess

This I have written as part of my LLD Practice. Please let me know further imporvements that can be done.

Also tell current design is Strong/Average/Lean Hire ?

Other Design Problems

/*

Design Patterns Used:
- Singelton for Board
- Factory for pieces
- Observer for game updates

*/
import javafx.geometry.Pos;

import java.util.List;
import java.util.Scanner;

enum PieceType{
    Pawn, King, Rook, Queen
}

enum PieceColor{
    White, Black
}

class Player{
    String id;
    String name;
    PieceColor pieceColor;
}

class Position{
    int x,y;

    Position(int x, int y){
        this.x=x;
        this.y=y;
    }
}

class Cell{
    Position position;
    Piece piece;
}

abstract class Piece{
    PieceColor pieceColor;
    PieceType pieceType;

    Piece(PieceColor pieceColor, PieceType pieceType){
        this.pieceColor=pieceColor;
        this.pieceType=pieceType;
    }

    abstract boolean isValidMove(Position from, Position to, Board board);
}

class King extends Piece{
    King(PieceColor pieceColor){
        super(pieceColor,PieceType.King);
    }

    @Override
    boolean isValidMove(Position from, Position to, Board board){

    }
}

class PieceFactory{
    static Piece getPiece(PieceType pieceType, PieceColor color){
        switch (pieceType){
            case King: return new King(color);
            default: throw new IllegalArgumentException("Invalid Piece Type");
        }
    }
}

class Board{
    static Board instance;
    Piece[][] board=new Piece[8][8];

    Board(){
        initializeBoard();
    }

    static Board getInstance(){
        if(instance==null) instance=new Board();
        return instance;
    }

    void setPiece(Position position, Piece piece){

    }

    Piece getPiece(Position position){

    }

    void move(Position from, Position to){

    }

    void initializeBoard(){

    }

    void displayBoard(){

    }
}

interface GameObserver{
    void hasDoneCheck(Player player);
    void hasDoneCheckMate(Player player);
    void hasStaleMate();
}

class ConsoleObserver implements GameObserver{
    @Override
    public void hasDoneCheck(Player player){
        System.out.println(player.name+" is under Check");
    }

    @Override
    public void hasDoneCheckMate(Player player){
        System.out.println(player.name+" is under CheckMate");
    }

    @Override
    public void hasStaleMate(){
        System.out.println("Match ends in draw");
    }
}

class RuleEngine{
    Board board;

    boolean isCheck(Player player){

    }

    boolean isCheckMate(Player player){

    }

    boolean isStaleMate(Player player){

    }
}

class Game{
    Board board;
    Player player1, player2;
    Player currPlayer;
    RuleEngine ruleEngine;
    boolean isGameOver;
    List<GameObserver> gameObserver;

    Game(Player p1, Player p2){
        this.player1=p1;
        this.player2=p2;
        this.currPlayer=p1;
        board=Board.getInstance();
        isGameOver=false;
    }

    void addGameObserver(GameObserver observer){
        gameObserver.add(observer);
    }

    void play(){
        Scanner sc=new Scanner(System.in);
        while(true){
            if(isGameOver) break;
            board.displayBoard();

            System.out.println("Enter position of piece want to move");
            int xi=sc.nextInt();
            int yi=sc.nextInt();

            System.out.println("Enter destination position");
            int xf=sc.nextInt();
            int yf=sc.nextInt();

            Position from=new Position(xi,yi);
            Position to=new Position(xf,yf);

            Piece piece=board.getPiece(from);

            if(piece==null || piece.pieceColor!=currPlayer.pieceColor){
                System.out.println("Invalid Piece Selection");
                continue;
            }

            if(!piece.isValidMove(from,to,board)){
                System.out.println("Please enter valid move");
                continue;
            }

            board.move(from,to);

            if(ruleEngine.isCheck(opponent())){
                notifyCheck();
            }

            if(ruleEngine.isCheckMate(opponent())){
                notifyCheckMate();
                isGameOver=true;
                break;
            }

            if(ruleEngine.isStaleMate(opponent())){
                notifyStaleMate();
                isGameOver=true;
                break;
            }

            switchTurn();
        }
    }

    void notifyCheck(){
        for(GameObserver obs:gameObserver){
            obs.hasDoneCheck(opponent());
        }
    }

    void notifyCheckMate(){
        for(GameObserver obs:gameObserver){
            obs.hasDoneCheckMate(opponent());
        }
    }

    void notifyStaleMate(){
        for(GameObserver obs:gameObserver){
            obs.hasStaleMate();
        }
    }

    void switchTurn(){
        currPlayer=(currPlayer==player1) ? player2:player1;
    }

    Player opponent(){
        Player opp=(currPlayer==player1) ? player2:player1;
        return opp;
    }
}

public class Chess2 {
    public static void main(String[] args) {
        Player p1=new Player();
        Player p2=new Player();
        Game game=new Game(p1,p2);
        game.addGameObserver(new ConsoleObserver());
        game.play();
    }
}
Comments (3)